易错总结:这里很多习惯于软件思维的人写代码会只例化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