题解 | #使用子模块实现三输入数的大小比较#

使用子模块实现三输入数的大小比较

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实例化。

全部评论

相关推荐

一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务