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

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 wire [7:0]d
);
    
//wire类型变量
    wire [7:0]data_temp1;
    wire [7:0]data_temp2;
//**************a,b中较小值给data_temp1****************************//    
    cpr cpr_inst1(
    .clk(clk),
    .rst_n(rst_n),
    .data_a(a),
    .data_b(b),
    .data_d(data_temp1)
    );

//*************a,c中较小值给data_temp2************************//
    cpr cpr_inst2(
    .clk(clk),
    .rst_n(rst_n),
    .data_a(a),
    .data_b(c),
    .data_d(data_temp2)
    );
    
//*************temp1,temp2中较小值给d************************//
    cpr cpr_inst3(
    .clk(clk),
    .rst_n(rst_n),
    .data_a(data_temp1),
    .data_b(data_temp2),
    .data_d(d)
    );
endmodule

//***********************sub model ******************************//
    module cpr(
        input clk,
        input rst_n,
        input [7:0]data_a,
        input [7:0]data_b,
        output reg [7:0]data_d
    );
        always @(posedge clk or negedge rst_n)begin
            if(!rst_n)
                data_d<=8'b0;
            else
                data_d<=(data_a<data_b)?data_a:data_b;
        end
    endmodule
    

最开始的想法是先比较a,b中的较小值存入data_temp1,再比较data_temp1与c最终得到a,b,c三个数中的最小值,所以只例化了两次子模块; 但没有考虑到子模块例化是并行执行的,所以开始结果出现了错误; 最后采用例化三次的方式正确执行,前面两次分别比较a,b和a,c两组中的最小值分别存入data_temp1、data_temp2,最后一次例化比较data_temp1、data_temp2的大小 (看了讨论区大佬的发言,知道其实也可以只例化两次,只是需要第二次例化前进行多打一拍的操作,否则第二次例化比较的并不是data_temp(a,b中的较小值)和原来的c。
全部评论

相关推荐

真是做吐了🤮
投递美团等公司10个岗位 >
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
01-31 04:00
神哥不得了:首先我就是在成都,成都的互联网格外的卷,如果是凭现在的简历的话很难找到大厂,建议再添加一个高质量的项目上去,另外专业技能的话最好是超过每一条的一半
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务