米联客-FPGA程序设计Verilog语法入门篇连载-10 Verilog语法_一般设计规范

软件版本:无

操作系统:WIN10 64bit

硬件平台:适用所有系列FPGA

板卡获取平台:https://milianke.tmall.com/

登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

1概述

本小节讲解Verilog语法的一般设计规范,需要掌握时序或组合电路设计中需要注意的几点,掌握设计避免出现锁存器。

2设计规范

上一节课我们讲解了竞争与冒险,其实我们在编写代码中,多注意设计规范,能够减少大多数的竞争与冒险的问题。

在verilog编程时需要注意以下几点:

(1)时序电路建模时,用非阻塞赋值(<=)。

(2)锁存器电路建模时,用非阻塞赋值(<=)。

(3)用always和组合逻辑建模时,用阻塞赋值(=)。

(4)在同一个always块中建立时序和组合逻辑模型时,用非阻塞赋值(<=)。

(5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值(<=)。

(6)不要在多个always块中为同一个变量赋值。

阻塞赋值“=”对应组合逻辑电路赋值,并且会阻塞后面的赋值操作,有先后顺序。非阻塞赋值“<=”对应时序逻辑电路赋值,所有非阻塞赋值操作在同一时刻进行赋值。

2.1 时序逻辑电路中,对寄存器用非阻塞赋值。

时序电路中使用非阻塞赋值可以有效消除竞争与冒险。

比如下面代码描述,由于无法确定 a 与 b 阻塞赋值的操作顺序,也就是实际延迟时间未知,就有可能带来竞争冒险。

always @(posedge clk)begina = b ;        //阻塞赋值,关键词“ = ”b = a ;        //阻塞赋值,关键词“ = ”end

如果使用非阻塞赋值,两个赋值操作是同时进行的,因此就不会带来竞争冒险。例:

 always @(posedge clk) begina <= b ;     //非阻塞赋值,关键词“ <= ”b <= a ;     //非阻塞赋值,关键词“ <= ”end

2.2 组合逻辑电路中,对寄存器用阻塞赋值。

设计实现 C = A&B, F=C&D 的组合逻辑功能,也就是F= A&B&D,用非阻塞赋值语句设计如下。

always @(*)beginC <= A & B ;  //非阻塞赋值,关键词“ <= ”F <= C & D ;  //非阻塞赋值,关键词“ <= ”end

两条赋值语句同时赋值,F <= C & D 中使用的是信号 C 的旧值,因此导致此时的逻辑是错误的,F 的逻辑值不等于 A&B&D。

而且,此时要求信号 C 具有存储功能,但不是时钟驱动,所以 C 可能会被综合成锁存器(latch),导致竞争冒险。

对代码进行如下修改,F = C & D 的操作一定是在 C = A & B 之后,此时 F 的逻辑值等于 A&B&D,符合设计。

always @(*)beginC = A & B ;  //阻塞赋值,关键词“ = ”F = C & D ;  //阻塞赋值,关键词“ = ”end

2.3 同一个 always 块中建立时序和组合逻辑模型时,用非阻塞赋值。

在时序电路中常常可能会涉及组合逻辑,但是如果赋值操作使用非阻塞赋值,会可能导致出现问题。

例:

always @(posedge clk or negedge rst_n)beginif (!rst_n) beginq <= 1'b0;     //非阻塞赋值,关键词“ <= ”endelse beginq <= a || b;   //非阻塞赋值,关键词“ <= ”endend

2.4 同一个 always 块中不要既使用阻塞赋值又使用非阻塞赋值。

always 语句涉及的组合逻辑中,既有阻塞赋值又有非阻塞赋值时,可能会导致意外的结果。例:

always @(*) beginC = A & B ;        //阻塞赋值,关键词“ = ”F <= C & D ;      //非阻塞赋值,关键词“ <= ”  ,不能同时使用end

此时信号 C 阻塞赋值完毕以后,信号 F 才会被非阻塞赋值,结果可能正确。

如果 F 信号有其他的负载,F 的最新值并不能马上传递出去,数据有效时间还是在下一个触发时刻。此时要求 F 具有存储功能,可能会被综合成 latch,导致竞争与冒险。例:

always @(*)beginC <= A & B ;         //非阻塞赋值,关键词“ <= ”F = C & D ;           //阻塞赋值,关键词“ = ”end

信号 C 被非阻塞赋值,下一个触发时刻才会有效。而 F = C & D 虽然是阻塞赋值,但是信号 C 不是阻塞赋值,所以 F 逻辑中使用的还是 C 的旧值。

在时序电路里既有阻塞赋值,又有非阻塞赋值会怎样呢?例:

always @(posedge clk or negedge rst_n)beginif (!rst_n)begin q <= 1'b0;       //非阻塞赋值,关键词“ <= ”endelse beginq = a & b;       //阻塞赋值,关键词“ = ”endend

假如复位信号与时钟同步,那么由于复位导致的信号 q 为 0,是在下一个时钟周期才有效。如果是信号 a 或 b 导致的 q 为 0,则在当期时钟周期内有效。假如 q 还有其他负载,就会导致 q 的时序特别混乱,显然不符合设计需求。

2.5 不允许在多个 always 块中为同一个变量赋值

Verilog语法中不允许在多个 always 块中为同一个变量赋值。如果这样做了,该信号拥有多驱动源,这种行为是禁止的。当然,也不允许 assign 语句为同一个变量进行多次连线赋值。从信号角度来讲,多驱动时,同一个信号变量在很短的时间内进行多次不同的赋值结果,就有可能产生竞争冒险。从语法来讲,很多编译器检测到多驱动时,也会报错的。

2.6 设计避免产生latch

Latch是锁存器,是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制器与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。锁存器是利用电平控制数据的输入,它包括不带使能控制的锁存器和带使能控制的锁存器。

如图所示:

触发器(flip-flop),是边沿敏感的存储单元,数据存储的动作(状态转换)由某一信号的上升沿或者下降沿进行同步的。

如图所示:

寄存器(register),在FPGA中用来暂时存放中间运算的数据和结果的变量。一个变量声明为寄存器时,它既可以被综合成触发器,也可能被综合成 Latch。但是大多数情况下我们希望它被综合成触发器,但是有时候由于代码书写问题,它会被综合成不期望的 Latch。

锁存器与触发器最大区别在于,锁存器是电平触发,而触发器是边沿触发。锁存器在不锁存数据时,输出随输入变化,但一旦数据锁存时,输入对输出不产生任何影响。

Latch 的主要危害有:

(1)输入状态可能多次变化,容易产生毛刺,增加了下一级电路的不确定性。

(2)在大部分 FPGA 的资源中,可能需要比触发器更多的资源去实现 Latch 结构。

(3)锁存器的出现使得静态时序分析变得更加复杂。

Latch 多用于门控时钟(clock gating)的控制,一般设计时,应当避免 Latch 的产生。

Latch 的产生主要有下面几种情况:

1、在组合逻辑中,不完整的if-else结构,会产生latch。

避免此类latch的方法主要有两种,一种是补全if-else结构,或者对信号赋初值。

但是在时序逻辑中,不完整的if-else结构,不会产生latch,这是因为,寄存器具有存储功能,且其值在时钟的边沿下才会改变。

2、 在组合逻辑中,当 case 选项列表不全且没有加 default 关键字,或有多个赋值语句不完整时,也会产生 Latch。

消除此种 latch 的方法也是 2 种,将 case 选项列表补充完整,或对信号赋初值。

补充完整 case 选项列表时,可以罗列所有的选项结果,也可以用 default 关键字来代替其他选项结果。

总之,为避免 latch 的产生,在组合逻辑中,需要注意以下几点:

1)if-else 或 case 语句,结构一定要完整;

2)不要将赋值信号放在条件判断中;

3)敏感信号列表建议多用 always@(*)。

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

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

相关文章

合并两个有序数组(LeetCode)

题目 给你两个按 非递减顺序 排列的整数数组 和 &#xff0c;另有两个整数 和 &#xff0c;分别表示 和 中的元素数目。请你 合并 到 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组不应由函数返回&#xff0c;而是…

Docker最佳实践进阶(一):Dockerfile介绍使用

大家好&#xff0c;上一个系列我们使用docker安装了一系列的基础服务&#xff0c;但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间&#xff0c;更是容易遗忘&#xff0c;下面我们进行Docker的进阶教程&#xff0c;帮助我们更快速的部署和演示项目。 一、什么是…

【初阶数据结构】通讯录项目(可用作课程设计)

文章目录 概述1. 通讯录的效果2. SeqList.h3. Contact.h4. SeqList.c5. Contact.c6. test.c 概述 通讯录项目是基于顺序表这个数据结构来实现的。如果说数组是苍蝇小馆&#xff0c;顺序表是米其林的话&#xff0c;那么通讯录就是国宴。 换句话说&#xff0c;通讯录就是顺序表…

个人可识别信息(PII) AI 去除 API 数据接口

个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息&#xff08;PII&#xff09; 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 /…

【剑指 offer】镜像二叉树

目 录 描述&#xff1a; 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像 思路&#xff1a; 仔细观察可以发现&#xff0c;所谓的二叉树镜像本质是自顶向下(or自底向上)进行左右子树交换的过程 public class Solution {public void Mirror(TreeNode root) {if(root nu…

音视频开发继续学习

RGA模块 RGA模块定义 RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。比方说&#xff1a;要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频&#xff0c;此时就要用到RGA模块了。 RGA模块结构体定义 RGA区域属性结构体 imgType&am…

LeetCode-3148. 矩阵中的最大得分

本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教. 1.题干 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&…

提高办公效率,四款语音转文字工具推荐!

无论是在会议记录、采访速记还是日常笔记中&#xff0c;语音转文字技术都展现出了其独特的价值。接下来是就为大家推荐几款市面上广受好评的语音转文字工具&#xff01; 365在线转文字 链接&#xff1a;https://www.pdf365.cn/ 365在线转文字是一款非常实用的在线语音转文字…

【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例

这两天在做那个CodeMonky的胡闹厨房的案例&#xff0c;一直困扰我的是关于Lobby和Relay的相关网络服务&#xff0c;需要挂加速器并且延迟不低&#xff0c;所以我一直在寻找一些其他替代方案&#xff0c;想起来之前做一个UEC的网络枪战时做过一个内网穿透的方法&#xff0c;所以…

机械行业数字化生产供应链产品解决方案(十二)

我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术&#xff0c;打造了一套智能化的生产和供应链管理系统&#xff0c;实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析&#xff0c;优化生产计划和资源配置&#…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第二篇:项目登录功能的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

怎么等比例调整图片尺寸大小?调整图片尺寸的8个方法

在数字时代&#xff0c;图片已成为我们日常生活与工作中不可或缺的一部分。从社交媒体分享到专业设计项目&#xff0c;图片的质量和外观直接影响着信息的传达与接收。因此&#xff0c;在处理图片时&#xff0c;保持其原始的纵横比&#xff0c;即等比例调整图片尺寸&#xff0c;…

梅丽尔·斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越”

梅丽尔斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越” 2024-08-14 20:38 发布于&#xff1a;河北省 该中心将为美国演员工会和美国电视广播艺人协会的艺术家提供资源和机会&#xff0c;而且全部免费 同时命名的还有汤姆汉克斯和丽塔威尔逊放映室、妮可…

PHP 无参数RCE总结

在这篇文章中&#xff0c;我总结了在参与CTF比赛过程中积累的关于PHP无参数远程代码执行&#xff08;RCE&#xff09;的经验。由于一直以来时间有限&#xff0c;今天终于有机会整理这些知识点。 可能用到的函数&#xff08;PHP的内置函数&#xff09; localeconv() 函数返回一…

安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统是由安美世纪(北京)科技有限公司开发的一套专为酒店设计的宽带管理系统。该系统旨在提升酒店宽带服务的运营效率和安全性&#xff0c;为酒店客人提供稳定、高速、便捷的上网体验。 0x02 漏洞概述 安美数字酒店宽带运营系统 weather.php …

Ansible自动化运维中剧本角色(roles)来完成apache服务操作

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; Ansible…

Kafka服务端日志详解

文章目录 服务端日志Topic消息存储方式主体介绍log文件追加记录消息index和timeindex索引文件 日志文件清理Kafka的文件高效读写机制Kafka的文件结构顺序写磁盘零拷贝 合理配置刷盘频率客户端消费进度管理 服务端日志 Kafka的日志信息是通过conf/server.properties文件中的log…

互联网红利消退,AI 大模型接棒新红利

在科技发展的浪潮中&#xff0c;互联网曾经是推动经济增长和社会变革的强大引擎&#xff0c;为无数企业和个人带来了巨大的红利。然而&#xff0c;随着时间的推移&#xff0c;互联网红利似乎正在逐渐消退&#xff0c;而与此同时&#xff0c;AI 大模型正以其强大的创新能力和广泛…

搜索旋转排序数组

搜索旋转排序数组 没思路。 看了下全网的思路,一个个来o&#xff0c;多做点题就知道了二分不仅仅只能用在有序的数组中。 这道题很关键的一个值就是nums[0]。 法一&#xff1a;先用二分找到旋转点&#xff0c;旋转点两边都是的&#xff0c;判断要搜索的值在哪边&#xff0c;…

玩转haproxy --花十分钟看看,全是干货

Haproxy是一款开源集群软件&#xff08;在上一篇文章中提到过集群的相关知识&#xff0c;往期点击http://t.csdnimg.cn/qWtQG&#xff09;是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的&#xff0c;是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 …