当前位置:   article > 正文

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

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

描述

        在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。

        请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。

子模块的信号接口图如下:

主模块的信号接口图如下:

使用Verilog HDL实现以上功能并编写testbench验证。

输入描述:

clk:系统时钟

rst_n:异步复位信号,低电平有效

a,b,c:8bit位宽的无符号数

输出描述:

d:8bit位宽的无符号数,表示a,b,c中的最小值

解题分析:

        本次代码使用了三个比较器完成。此外,还有一种解法放在了简析中。

alt

sub_mod0:比较器0,ab比较得到较小的值tmp0
sub_mod1:比较器1,ac比较得到较小的值tmp1
sub_mod2:比较器2,tmp0tmp1比较得到最小的值d。 

代码如下:

  1. `timescale 1ns/1ns
  2. module main_mod(
  3. input clk,
  4. input rst_n,
  5. input [7:0]a,
  6. input [7:0]b,
  7. input [7:0]c,
  8. output [7:0]d
  9. );
  10. wire [7:0] tmp0, tmp1;
  11. sub_mod sub_mod0(.clk(clk), .rst_n(rst_n), .a(a), .b(b), .c(tmp0));
  12. sub_mod sub_mod1(.clk(clk), .rst_n(rst_n), .a(a), .b(c), .c(tmp1));
  13. sub_mod sub_mod2(.clk(clk), .rst_n(rst_n), .a(tmp0), .b(tmp1), .c(d) );
  14. endmodule
  15. module sub_mod(
  16. input clk,
  17. input rst_n,
  18. input [7:0] a,
  19. input [7:0] b,
  20. output [7:0] c
  21. );
  22. reg [7:0] c_r;
  23. always@(posedge clk or negedge rst_n) begin
  24. if(~rst_n)
  25. c_r <= 8'b0;
  26. else
  27. c_r <= a < b? a:b;
  28. end
  29. assign c = c_r;
  30. endmodule

波形图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/627951
推荐阅读
相关标签
  

闽ICP备14008679号