易错总结:这里很多习惯于软件思维的人写代码会只例化2次子模块,是将a,b比较之后的结果min_ab与c进行比较,进而得到min_abc。

但是这样是错误的,因为当min_ab与c比较时,是上一时刻a,b的最小值与此时c的值比较,也就是拍数上是差一拍的,因此做不到比较同一拍下的a,b,c

理解HDL的时序逻辑代码脑海里要有电路模型,并真正理解时序逻辑和组合逻辑的区别。

timescale 1ns/1ns
module main_mod(
	input clk,
	input rst_n,
	input [7:0]a,
	input [7:0]b,
	input [7:0]c,
	
	output [7:0]d
);

    wire [7:0] min_ab;
    wire [7:0] min_ac;
    wire [7:0] min_abc;
    
    sub_mod sub_mod_U0(
        .clk      (clk),
        .rst_n    (rst_n),
        .a        (a),
        .b        (b),
        
        .c        (min_ab)
    );
    
    sub_mod sub_mod_U1(
        .clk      (clk),
        .rst_n    (rst_n),
        .a        (a),
        .b        (c),
        
        .c        (min_ac)
    );

    sub_mod sub_mod_U2(
        .clk      (clk),
        .rst_n    (rst_n),
        .a        (min_ab),
        .b        (min_ac),
        
        .c        (min_abc)
    );

    assign d = min_abc;
    
endmodule

module sub_mod(
    input clk,
    input rst_n,
    input [7:0] a,
    input [7:0] b,
    
    output reg [7:0] c
);
    
    always@(posedge clk or negedge rst_n) begin: compare_2_inputs
        if(~rst_n)
            c <= 8'b0;
        else if(a > b)
            c <= b;
        else
            c <= a;
    end
    
endmodule