题解 | #使用子模块实现三输入数的大小比较#
使用子模块实现三输入数的大小比较
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实例化。