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

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。
全部评论

相关推荐

03-01 21:45
中北大学 Python
孤蓝长空:请你说一下为什么你用websocket而不是http,请你说一下什么是rpc,为什么用rpc,你的rpc的传输协议是JSON,xml还是什么 请你描述一下你的鉴权流程(完整的) 我问的是第二个项目,随便问的哈哈哈
开工第一帖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务