Verilog 时序逻辑 UDP

news2024/12/30 0:57:14

时序逻辑 UDP 与组合逻辑 UDP 在定义形式和行为功能上均有不同,主要区别如下:

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

表示时序逻辑的 UDP 主要分为 2 种:电平触发 UDP 与 边沿触发 UDP

电平触发 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 ;

   initial
     q = 0 ;

   table
    //clear     en      d       :q      :q+ ;
      1         ?       ?       :?      :0 ;    //clear
      0         0       ?       :?      :- ;    //"-" means stable

      0         1       0       :?      :0 ;    //q = d
      0         1       1       :?      :1 ;
   endtable
endprimitive

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

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

边沿触发 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 ;
      //possible negedge
      0         (1x)    ?       :?      :- ;  //可能是时钟下降沿时保持
      0         (x0)    ?       :?      :- ;
      //(3) 时钟上升沿保持
      0         (0?)    ?       :?      :- ;  //时钟上升沿时保持
      //possible posedge
      0         (x1)    ?       :?      :- ;  //可能是时钟上升沿时保持
      //(4) 非时钟沿变化时,即便数据有跳变,输出仍然保持
      0         ?       (??)    :?      :- ;  
   endtable
endprimitive // D_TRI

对此触发器进行简单的仿真,testbench 描述如下。

实例

`timescale 1ns/1ps
module test ;
   reg  D, CP = 0 ;
   reg  RST ;
   wire Q ;
   always #5 CP = ~CP ;
   //data driver
   initial begin
      D = 0 ;
      #12 D = 1 ;
      #10 D = 0 ;
      #14  D = 1 ;
      #3  D = 0 ;
      #18  D = 0 ;
   end
   //reset driver
   initial begin
      RST = 0 ;
      #3        RST = 1 ;
      #2        RST = 0 ;
      #22       RST = 1 ;
      #1        RST = 0 ;
   end
   D_TRI u_d_trigger(Q, RST, CP, D);
   initial begin
      forever begin
         #100;
         //$display("---gyc---%d", $time);
         if ($time >= 1000) begin
            $finish ;
         end
      end
   end
endmodule // test

需要注意的是:

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

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

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

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

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

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

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

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

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

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

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


UDP 状态表符号缩写

UDP 状态表的电平和跳变沿缩写符号及说明如下表所示。

缩写符含义说明
0, 1, x只能用于输入
b1, 1只能用于输入
-保持原值不变只能用于输出
(ab)信号由 a 变 b用作输入端边沿的指示
r(01)信号的上升沿
f(10)信号的下降沿
p(01), (0x) 或 (x1)可能是信号的上升沿
n(10), (1x) 或 (x0)可能是信号的下降沿
*(??)信号任意边沿的变化

UDP 设计指导

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ初步到精通-第七章-RabbitMQ之延迟队列

目录 第七章-RabbitMQ之延迟队列 1. 延迟队列概念 2. 应用场景 3. 架构模式 3.1 队列TTL实现 3.2 消息TTL实现 3.3 插件实现 4. 代码验证 5. 总结 第七章-RabbitMQ之延迟队列 1. 延迟队列概念 延迟-意即 非实时&#xff0c;之前我们讨论大部分的案例都是生产者将消息发…

【毕业设计】61-基于单片机的超声波测距仪设计(原理图、仿真工程、低重复率参考设计文档、PPT、开题报告、任务书)

【毕业设计】61-基于单片机的超声波测距仪设计&#xff08;原理图、仿真工程、低重复率参考设计文档、PPT、开题报告、任务书&#xff09;[toc] 资料下载链接 资料下载链接 资料链接&#xff1a;https://www.cirmall.com/circuit/33762/ 包含此题目毕业设计全套资料&#xff…

UDS应用场景

诊断协议那些事儿 本文为诊断协议那些事儿专栏文章&#xff0c;旨在介绍诊断的应用场景&#xff0c;其本质就是一个用于汽车行业通信的需求规范&#xff0c;用于诊断功能数据的解析&#xff01;让读者对诊断有一个深入的认识。 关联文章&#xff1a;UDS协议发展历史 文章目录…

idea如何设置代理实现管理突破呢

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

抗锯齿渲染

&#xff08;逻辑绘图&#xff09;图像在坐标图中的显示&#xff1a; 笔的默认宽度为1&#xff0c;当笔的宽度大于1时&#xff0c;相当于在则条线的两边均匀加厚&#xff0c;确定坐标的还是这条宽度为1的线段&#xff0c;相当于宽度的中心位置。 物理绘图 &#xff08;默认情况…

集成学习、装袋法、提升法、GBDT、随机森林(机器学习)

集成学习 集成学习(Ensemble learning)是机器学习中近年来的一大热门领域。其中的 集成方法是用多种学习方法的组合来获取比原方法更优的结果 使用于组合的算法是弱学习算法 即分类正确率仅比随机猜测略高的学习算法 但是组合之后的效果仍可能高于强学习算法 即集成之后的…

总抱怨Mac运行速度又卡又慢?这些方法你用得上

通常大家处理Mac运行速度慢的方法不是重启就是清空废纸篓&#xff0c;但是这两种方法对于Mac提速性能的效果是微之甚微的&#xff0c;想要彻底解决Mac运行速度慢&#xff0c;你应该试试一下三种方法~ 1、清理磁盘空间 硬盘空间过少是Mac运行变慢很大的一个因素&#xff0c;各种…

第03章_基本的SELECT语句

第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有…

【用户画像】Redis的常用五大数据类型和配置文件介绍

文章目录一 常用五大数据类型简介1 Redis键(key)2 Redis字符串(String)3 Redis列表(List)4 Redis集合(Set)5 Redis哈希(Hash)6 Redis有序集合Zset(sorted set)二 Redis配置文件介绍1 UNITS2 INCLUDES3 NETWORK4 MEMORY MANAGEMENT一 常用五大数据类型简介 常用命令 1 Redis键…

攻防世界碎纸机11

碎纸机11 题目描述&#xff1a;我们从碎纸机里抢救回来了某个关键图片资料&#xff0c;你能帮我们修复它吗&#xff1f; 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87094757 打开文件&#xff0c;发现是让我们拼图。 可以用python脚本进行拼接。 脚…

pytorch初学笔记(七):神经网络基本骨架 torch.nn.Module

目录 一、 torch.nn模块 二、module模块 三、自定义搭建神经网络 一、 torch.nn模块 torch.nn — PyTorch 1.13 documentation 二、module模块 Module — PyTorch 1.13 documentation 我们自己定义的神经网络需要继承nn.Module类&#xff0c;需要重写以下两个方法&#xf…

智慧林业解决方案-最新全套文件

智慧林业解决方案-最新全套文件一、建设背景二、建设架构1、火险预警2、AI林火分析3、应急指挥4、森林资源GIS5、林业巡检6、林业OA三、建设方案四、获取 - 智慧林业全套最新解决方案合集一、建设背景 森林资源是林地及其所生长的森林有机体的总称&#xff0c;以林木资源为主&…

设计模式之设计原则

程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据。设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为…

Python基础语法入门

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 上一节课&#xff0c;我们了解了基础环境如何配置&#xff0c…

【深度学习】图像分类数据集Fashion-MNIST

今天在手撸深度学习代码的时候&#xff0c;遇到了这个数据集&#xff0c;但是调用的函数的参数和功能不是很明白&#xff0c;因此选择写篇博客总结一下。 一、介绍 Fashion-MNIST是⼀个10类服饰分类数据集。 torchvision 包&#xff1a;它是服务于 PyTorch 深度学习框架的&a…

springboot+maven大学校友活动风采展示管理信息系统

大学校友管理信息系统当然也不能排除在外&#xff0c;从校友活动、校友风采的统计和分析&#xff0c;在过程中会产生大量的、各种各样的数据。本文以大学校友管理信息系统为目标&#xff0c;采用B/S模式&#xff0c;以SSM为开发框架&#xff0c;Jsp为开发技术、Eclipse/idea为开…

计算机毕业设计之java+ssm爱家房屋租赁信息管理系统

项目介绍 本爱家房屋租赁信息管理系统是针对目前房屋租赁信息管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的房屋租赁信息管理系统存在的问题进行分析&#xff0c;结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xf…

Linux进阶-编辑器以及Shell编程

常用两个编辑器 gedit编辑器&#xff1a;依赖图形界面。 vi/vim编辑器&#xff1a;sudo apt install vim&#xff08;安装vim编辑器&#xff09; vim与vi的区别&#xff1a; vim是vi的升级版本&#xff0c;兼容vi&#xff1b; vi按u只能撤销上次命令&#xff0c;而在vim里…

java计算机毕业设计基于安卓Android的校园单车租赁App

项目介绍 校园单车租赁APP管理是校园单车租赁管理中对用户必不可少的一个部分。在人们校园单车租赁管理的整个过程中,校园单车租赁APP管理担负着最重要的角色。为满足如今日益复杂的管理需求,各类校园单车租赁APP管理程序也在不断改进。本课题所设计的校园单车租赁APP,使用ssm框…

Nginx源码分析--内存池

1.问题引入 使用C语言编程时&#xff0c;一般使用malloc和free进行动态内存申请和释放。如果一不小心忘记了调用free进行释放&#xff0c;很容易造成内存泄露。另一方面&#xff0c;频繁地进行malloc和free操作&#xff0c;很容易造成内存碎片。与此同时&#xff0c;因为mallo…