• Verilog 组合逻辑 UDP


    与非门实例

    组合逻辑 UDP 中,状态表规定了不同的输入组合和相对应的输出值,没有指定的任意组合输出值为 x。

    一个简单的与非门 UDP 可以表示如下:

    1. primitive nand_my(out, a, b);
    2.    output       out ;
    3.    input        a, b ;
    4.    table
    5.     //a         b       :       out ;
    6.       0         0       :       1 ;
    7.       0         1       :       1 ;
    8.       1         0       :       1 ;
    9.       1         1       :       0 ;
    10.    endtable
    11. endprimitive

    如上一节所阐述,端口列表和声明部分可以改为:

    1. primitive nand_my(
    2.   output       out,
    3.   input        ab);
    4.   ......
    5. endprimitive

    状态表项

    表示组合逻辑的状态表中的每一行的语法格式如下:

    <input1>  <input2>  ...  <inputN>  :  <output> ;
    • 1、状态表中的 input 信号顺序要与 UDP 端口列表的顺序一致。
    • 2、输入和输出用冒号 : 隔开。
    • 3、状态表的每一行以分号 ; 结束。
    • 4、能够产生确定输出值的所有输入项的组合都必须在状态表中列出,否则会输出 x 值。

    例如在上述 UDP nand_my 中,如果 a=0, b=x,则输出 out = x ,因为该组合选项在 table 中无法找到。所以在编写 UDP 时,要完整的考虑输入的所有组合情况。

    UDP nand_my 的状态表可以修改为:

    1.  table
    2.     //a         b       :       out ;
    3.       0         0       :       1 ;
    4.       0         1       :       1 ;
    5.       1         0       :       1 ;
    6.       1         1       :       0 ;
    7.       0         x       :       1 ;
    8.       x         0       :       1 ;
    9.    endtable

    无关项

    UDP nand_my 中,当 a 或 b 两个输入只要有一个为 0 时,则输出为 1。

    不影响输出结果的输入信号为无关项,可以用问号"?"来表示。状态表中的"?"项将自动展开为 0, 1 或 x。

    因此 UDP nand_my 的状态表可以改为:

    1.    table
    2.     //a         b       :       out ;
    3.       0         ?       :       1 ;
    4.       ?         0       :       1 ;
    5.       1         1       :       0 ;
    1. //下面组合将输出 x,所以也可以省略,Verilog 默认会输出 x
    2.       1         x       :       x ;
    3.       x         1       :       x ;
    4.    endtable

    UDP 例化

    UDP 调用格式与内置门级原语完全一致。

    去除延迟信息,D 触发器模型如下。

    实例

    1. module D_TRI(
    2.             input       D, CP,
    3.             output      Q, QR);
    4.    //part1, not gate
    5.    wire         CPN, DN ;
    6.    not          (CPN, CP);
    7.    not          (DN, D);
    8.    //part2, master trigger
    9.    wire         G3O, G4O ;
    10.    nand_my      (G3O, D, CP);
    11.    nand_my      (G4O, DN, CP);
    12.    wire         G1O, G2O ;
    13.    nand_my      (G1O, G3O, G2O);
    14.    nand_my      (G2O, G4O, G1O);
    15.    //part3, slave trigger
    16.    wire         G7O, G8O ;
    17.    nand_my      (G7O, G1O, CPN);
    18.    nand_my      (G8O, G2O, CPN);
    19.    wire         G5O, G6O ;
    20.    nand_my      (G5O, G7O, G6O);
    21.    nand_my      (G6O, G8O, G5O);
    22.    assign       Q = G5O ;
    23.    assign       QR = G6O ;
    24. endmodule

    testbench 保持不变,仿真结果如下。

    由图可知,触发器在时钟 CP 下降沿采集到了 D 端信号,并传递给 Q/QR ,在单周期内保持不变。

    UDP 完成的与非门功能正确。

  • 相关阅读:
    Ubuntu18.04开机自动启动终端并运行脚本
    企业研发数据:省级工业企业研发费用、企业非真实研发支出原始数据加计算stata do代码两大维度指标
    多线程(虚拟地址空间)
    【申报指南】国家高新技术企业的认定标准、认定条件及奖励政策
    数字图像处理与Python实现-Scikit-Image-图像特征(三)
    HDFS分布式文件存储系统
    【Educoder作业】C&C++指针实训
    4.7拆解复杂问题-实现计算器
    为什么录屏没声音?实用技巧大放送!
    MyBatis 后端对数据库进行操作
  • 原文地址:https://blog.csdn.net/qq_33300585/article/details/127944213