【芯片设计- RTL 数字逻辑设计入门 14 -- 使用子模块实现三输入数的大小比较】

三输入数的大小比较

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

请编写一个子模块,将输入两个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中的最小值

问题分析

需要调用3个模块:

  • 第一个模块:比较 T 时刻的 a 和 b,T+1 时刻出来 tmp1;
  • 第二个模块:比较 T 时刻的 a 和 c,T+1 时刻出来 tmp2;
  • 第三个模块:比较 T+1 时刻的 tmp1 和 tmp2,T+2 时刻出来 d;

如果只用2个子模块,那么 T 时刻比较 a 和 b 得到 tmp1,再比较 tmp1 和 c 的时候是 T+1 时刻的 c 和 T+1 时刻的 tmp1,而 tmp1 代表的是 T 时刻 a 和 b 的较小值,所以这时候比较的 T 时刻的 a、b 和 T+1 时刻的 c,显然不符合要求。

所以不能只例化两次子模块,因为主模块例化的子模块在综合时是复制一样的电路,在执行时是并行执行的。如果只例化两次,第二次例化的值并不是第一个子模块输出的最小值

verilog code

在这里插入图片描述在这里插入图片描述

TestBench Code

在这里插入图片描述

综合图

在这里插入图片描述

仿真波形图

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-09 10:42:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-09 10:42:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-09 10:42:02       82 阅读
  4. Python语言-面向对象

    2024-02-09 10:42:02       91 阅读

热门阅读

  1. c#通过ExpressionTree 表达式树实现对象关系映射

    2024-02-09 10:42:02       41 阅读
  2. 38. C++ 引用的本质

    2024-02-09 10:42:02       48 阅读
  3. 序列化和反序列化、pytest-DDT数据驱动

    2024-02-09 10:42:02       50 阅读
  4. 2024.2.6

    2024-02-09 10:42:02       48 阅读
  5. 面试复盘——10

    2024-02-09 10:42:02       53 阅读
  6. Git入门

    Git入门

    2024-02-09 10:42:02      55 阅读
  7. 单片机精进之路-2led灯闪烁

    2024-02-09 10:42:02       56 阅读
  8. Rust语言入门(第3篇)

    2024-02-09 10:42:02       50 阅读
  9. Rust安装——Win10

    2024-02-09 10:42:02       53 阅读
  10. QT styleSheet——控件设置样式表

    2024-02-09 10:42:02       64 阅读