题解 | #使用子模块实现三输入数的大小比较#
使用子模块实现三输入数的大小比较
https://www.nowcoder.com/practice/bfc9e2f37fe84c678f6fd04dbce0ad27
`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]m,n;
compare ab(
.clk(clk),
.rst_n(rst_n),
.a(a),
.b(b),
.m(m)
);
compare ac(
.clk(clk),
.rst_n(rst_n),
.a(a),
.b(c),
.m(n)
);
compare mn(
.clk(clk),
.rst_n(rst_n),
.a(m),
.b(n),
.m(d)
);
endmodule
module compare(
input clk,
input rst_n,
input [7:0]a,
input [7:0]b,
output reg[7:0]m
);
always @(posedge clk,negedge rst_n)
if(!rst_n)
m <= 8'b0;
else if((a < b) | (a == b))
m <= a;
else if (a > b)
m <= b;
endmodule
这个题考的是软件与硬件之间的差别。
按照软件编程思维,我们只需要比较ab值,再比较min_ab与c的值,也就是实例化两次子模块。但是这样会有一个错误,就是节拍不对,abc是同一时刻输入的,并且有可能一直变,我们需要比较的是在某一个时刻abc的值的最小,如果先比较ab的最小值,然后再去比较c,但是“再”的时候,c已经变了,你相当与是拿上一时刻的ab最小值与现在的c作比较。
最后对于实例化的传参,可以百度Verilog实例化。
