后仿中必须读懂的User-defined primitives(UDP)

一 UDP定义规则

UDP,全名:User-defined primitives。 用户自己定义的原语。

UDP可分为:combinational UDP(组合逻辑)和 sequential UDP(时序逻辑)。

1.1 组合逻辑UDP

combinational UDP用于构建组合逻辑模型,常见有mux模块.

如下案例为2选1的mux,sel为1时,out为in1;sel为0时,out为in0。

请注意:信号列表中,输出信号out在第一个。状态表中,out处于最后一列。

1.2 时序逻辑UDP

sequential UDP用于构建寄存器DFF和锁存器latch模型。自然而来,sequential UDP可以是边沿触发,也可以是电平触发。

  • 时序逻辑 UDP 的输出端必须声明为 reg 型
  • 时序逻辑 UDP 可以用 initial 语句初始化
  • 状态表格式也稍有不同,时序UDP 格式 : ...    :  <current_state>  :  <next_state>  ;
  • 时序逻辑 UDP 状态表每行由 3 部分组成:输入部分、当前状态和输出状态,用冒号":"隔开
  • current_state 就是输出寄存器的当前值, next_state 就是输出寄存器的新值;next_state 由输入和 current_state 共同决定;
  • 状态表的输入项可以是电平,也可以是跳边沿的形式
1.2.1 电平触发UDP

 电平触发 UDP 的输出是根据输入电平状态的改变而改变。

带有清零端的 D 锁存器的功能描述为:

清零端为 1 时,输出端恒为 0 ;
清零端为 0 、使能控制端为 1 时,锁存器透明,输出端等于输入端;
清零端为 0 、使能控制端为 0 时,锁存器呈保持状态,输出端保持不变。
其真值表为(q 表示当前状态,q+ 表示下一个状态):

其实编写 UDP 的过程,可以理解为换一种格式编写真值表的过程。

带有清零端的 D 锁存器的 UDP 可以描述如下:

primitive d_latch(q, clear, en, d);output       q ;reg          q ;input        d, en, clear ;initialq = 0 ;table//clear     en      d       :q      :q+ ;1         ?       ?       :?      :0 ;    //clear0         0       ?       :?      :- ;    //"-" means stable0         1       0       :?      :0 ;    //q = d0         1       1       :?      :1 ;endtable
endprimitive

当然,也可以在罗列端口信号时就声明其类型,并且赋初值。

primitive d_latch2(output reg   q = 0,input        clear, en, d);......
endprimitive

如下案例为一个低电平触发的latch。使用reg申明了一个内部变量,表示当前状态q,即当前udp的输出状态。table中的q+代表的是下一个有效周期的输出状态。

 

1.2.2 边沿触发UDP

边沿触发 UDP 的输出,是根据输入跳边沿和(或)输入电平状态的改变而改变。

下面举例,带有异步复位端(RST)且在时钟下降沿采集信号的 D 触发器的"真值表":

此"真值表"中还加入了上下沿的概念,是为了方便编写 UDP 代码。

此 D 触发器的时序逻辑 UDP 描述如下:

primitive D_TRI(output reg  Q = 0,input       RST, CP, D);table//RST       CP      D       :Q      :Q+ ;//(描述1) 清零1         ?       ?       :?      :0 ;  //RST=1 时清零(??)      ?       ?       :?      :- ;  //忽略 RST 边沿变化//(描述2) 时钟下降沿采集0         (10)    0       :?      :0 ;  //时钟下降沿采集信号0         (10)    1       :?      :1 ;//(描述3)possible negedge0         (1x)    ?       :?      :- ;  //可能是时钟下降沿时保持0         (x0)    ?       :?      :- ;//(描述4) 时钟上升沿保持0         (0?)    ?       :?      :- ;  //时钟上升沿时保持//(描述5)possible posedge0         (x1)    ?       :?      :- ;  //可能是时钟上升沿时保持//(描述6) 非时钟沿变化时,即便数据有跳变,输出仍然保持0         ?       (??)    :?      :- ;  endtable
endprimitive // D_TRI

 注意:

(1)状态表每行多个输入部分,最多只能有一个跳边沿,例如下面状态表的表述是错误的。

   table......(10)     (10)    1       :?      :1 ;endtable

(2)电平触发的状态表输入项,其优先级高于边沿触发的状态表输入项。若两者在同一时刻出现,则输出端的状态由电平触发的状态表决定。

例如上述 D 触发器中,RST 可以看做是电平触发,CP 可以看做是边沿触发。当 RST 上升沿与 CP 端下降沿同时刻来临时,输出端会变为 0 ,如下图 cap 时刻。当然,实际的时序应该避免时钟和复位边沿同时到来。

(3)边沿触发 UDP 中,必须为每一个输入信号都指定边沿变化时输出信号的变化情况,否则在该信号的跳变沿处可能会造成输出端为 X 。

例如缺少 RST 边沿变化的说明:

    //(??)    ?       ?       :?      :- ; //忽略 RST 边沿变化

则在 RST 下降沿输出会变为 x。

再例如缺少时钟稳定、D 端数据变化时的说明:

    //(4) 非时钟沿变化时,即便数据有跳变,输出仍然保持//0         ?       (??)    :?      :- ;

则 D 端数据变化的边沿处也会使输出为 x。

如下所示为一个上升沿触发寄存器的模型。其中NOTIFIER信号用于建立时间和保持时间检查,通过建立时间和保持时间检查,则NOTIFIER不变,时序检测不通过则NOTIFIER翻转,udp_dff输出为x态。后仿真中的NOTIFIER是干什么用的!-CSDN博客

二 UDP 状态表符号缩写

三 UDP 设计指导 

针对数字设计时是选择使用 module 还是 primitive,要从设计需求、复杂度等方面进行综合考虑。下面给出一些指导性的建议。

  1. UDP 只能进行功能性建模,不能对电路时序和制造工艺(例如 CMOS,TTL等)进行建模。使用 UDP 的主要目的是以类似于真值表的简洁形式对数字设计进行建模,而 module 可以包含电路时序,并指定制造工艺。
  2. UDP 只能完成有一个输出端口的数字设计。当输出端口大于一个时,只能用 module。
  3. UDP 是使用内存中的查找表实现的,当输入端口较多时,输入端口的组合将会呈指数增长。UDP 输入端口的数量也会受到仿真器的限制。因此输入端口较多时不宜使用 UDP。
  4. 选择使用 UDP 以后,一定要尽可能的用缩写符完整的描述 UDP 状态表。漏掉输入的组合情况,输出端可能会出现 X 的状态,造成设计错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/675050.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTT潘多拉开发板上实现电源管理

简介 随着物联网(IoT)的兴起&#xff0c;产品对功耗的需求越来越强烈。作为数据采集的传感器节点通常需要在电池供电时长期工作&#xff0c;而作为联网的SOC也需要有快速的响应功能和较低的功耗。 在产品开发的起始阶段&#xff0c;首先考虑是尽快完成产品的功能开发。在产品…

懒人网址导航源码v3.9源码及教程

懒人网址导航源码v3.9源码及教程 效果图使用方法部分源码领取源码下期更新预报 效果图 使用方法 测试环境 宝塔Nginx -Tengine2.2.3的PHP5.6 MySQL5.6.44为防止调试错误&#xff0c;建议使用测试环境运行的php与mysql版本首先用phpMyAdmin导入数据库文件db/db.sql 如果导入不…

Mybatis-Plus大批量插入数据到MySQL

MyBatis-Plus的saveBatch方法 GetMapping("/save1") public void save1() {// 数据准备List<MallOrder> orderList getMallOrderList();// mybatis-pluslong start System.currentTimeMillis();mallOrderService.saveBatch(orderList);System.out.println(&…

论文辅助笔记:Tempo之modules/lora.py

1 LoRALayer 基类 2 Linear 2.1 __init__ 2.2 reset_parameter & train 2.3 forward 3 MergeLinear 3.1__init__ enable_lora指定了哪些输出特征使用lora 3.2 reset_parameters & zero_pad & merge_AB 3.3 train & forward

LibTorch入坑记--续2

一、安装faiss 我的faiss&#xff0c;用的是曾经安装过的 pip install faiss-gpu1.7 当时搞得环境名称是pni 二、配置环境 三、例子代码 #include <faiss/IndexFlat.h> #include <faiss/Index.h> #include <faiss/VectorTransform.h> #include <faiss/…

K8S快速入门

K8S快速入门 在学习k8s的过程&#xff0c;虽然官网给出的示例教程很简单&#xff0c;但是由于网络和环境的差异&#xff0c;导致实际操作的时候踩了很多坑&#xff0c;下面记录一下自己的操作步骤&#xff0c;方便需要的人参考&#xff0c;也方便以后的自己。 参考官网的资料…

华为eNSP中型企业局域网网络规划设计(下)

→b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;上&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩← 配置ospf AR3 [AR3]ospf 1 router-id 3.3.3.3 //出口默认路由 [AR3-ospf-1]default-route-advertise always #area…

W801学习笔记二十二:英语背单词学习应用——下

续上篇&#xff1a; W801学习笔记二十一&#xff1a;英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》&#xff0c;所以用户交互的逻辑和唐诗是一样的。所以&#xff0c;我们抽一个基类&a…

Day 63:单调栈 LeedCode 84.柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&a…

CMakeLists.txt语法规则:foreach 循环基本用法

一. 简介 cmake 中除了 if 条件判断之外&#xff0c;还支持循环语句&#xff0c;包括 foreach()循环、while()循环。 本文学习 CMakeLists.txt语法中的循环语句。 CMakeLists.txt语法中 有两种 循环实现方式&#xff1a;foreach循环与 while循环。 二. CMakeLists.txt语法规则…

黑马点评项目总结

登录 基于session登录 短信验证码登录 配置登录拦截器 向 Spring MVC 框架中添加拦截器&#xff0c;LoginInterceptor 是一个自定义的拦截器&#xff0c;用于拦截用户的登录请求。 excludePathPatterns这一句是设置拦截器需要放行的请求路径列表。 "/user/code", …

图片编辑工具-Gimp

一、前言 GIMP&#xff08;GNU Image Manipulation Program&#xff09;是一款免费开源的图像编辑软件&#xff0c;具有功能强大和跨平台的特性。 GIMP作为一个图像编辑器&#xff0c;它提供了广泛的图像处理功能&#xff0c;包括但不限于照片修饰、图像合成以及创建艺术作品…