Verilog HDL基础知识(二)

2024-06-01 22:20
文章标签 基础知识 verilog hdl

本文主要是介绍Verilog HDL基础知识(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言:本文继续介绍Verilog HDL基础知识,重点介绍赋值语句、阻塞与非阻塞、循环语句、同步与异步、函数与任务语法知识。

1. 赋值语句

在Verilog中,有两种进行赋值的方法,即连续赋值语句和过程赋值语句(块)。

1.1 连续赋值语句

连续赋值用于表示组合逻辑。左侧必须是Net数据类型即wire和tri类型。

连续赋值始终处于活动状态,这意味着,对右侧值的任何更改都会导致赋值左侧值被更新。

//连续赋值方法1    
wire [15:0] adder_out = mult_out + out;     
//连续赋值方法2    
wire [15;0] adder_out;     
assign adder_out = mult_out + out;

在仿真测试中,可以对连续赋值语句分配延迟,但在综合时,该延迟被忽略。

assign #5 adder_out = mult_out + out; //延迟5ns
1.2  过程赋值语句(块)

过程赋值语句包括initial和always两种。intial语句用于初始化仿真使用,always使用行为功能描述电路功能。

每个always和initial块都是并行运行的,但每个块内部是顺序执行的。

图片

图1:过程赋值语句示例

2. 阻塞赋值和非阻塞赋值

always和initial过程块有种类型赋值即阻塞赋值(=)和非阻塞赋值(<=)。

过程赋值的左侧必须是变量数据类型,可以是reg、integer、real或time或realtime。赋值的右侧可以是任何有效的表达式或信号。

阻塞赋值和非阻塞赋值示例如下图所示。

图片

图2:阻塞赋值和非阻塞赋值示例

如图2左侧阻塞赋值,两条语句同时执行,延迟#5时,a=b=2,再延迟#10时,c=a=2,即赋值语句立即执行,执行完毕后才执行下一条语句,左侧值在赋值语句执行完后立即改变。如图2右侧非阻塞赋值,延迟#5时,a=b=2,而再延迟#5时,c=a=1,即c值并未立即为a的新值。

图3展示了阻塞赋值和非阻塞赋值综合后的RTL电路举例。

图片

图3:阻塞赋值和非阻塞赋值综合后的RTL电路举例

 阻塞赋值和非阻塞赋值使用规则

组合电路一般使用阻塞赋值,时序电路使用非阻塞赋值,这可以避免混淆,提高代码可读性。

3. 两种类型RTL处理

组合逻辑处理:对所有输入列表信号敏感,用于组合逻辑。

图片

图4:组合逻辑处理

时序逻辑处理:对时钟信号或者控制信号沿敏感(通过添加posedge或者negedge关键字),用于时序逻辑。

图片

图5:时序逻辑处理

4. 过程块语句

initial和always过程块中有三种常用语句:if-esle、case和循环语句。

4.1 if-else语句

语句以关键字if开头,后跟一个条件,然后是条件为true时要执行的语句序列。else子句(如果存在)将在条件为false时执行。

图片

图6:if-else示例

可以看到if语句合成为两个输入复用器。可以看到,多个if语句会导致多个复用,从而产生优先级。如果不需要在你的电路中进行优先级排序,case语句会更有效率。

4.2 case语句

在case语句中,所有条件都将根据表达式进行检查。这导致一个多路复用器具有多个输入。

图片

图7:case语句示例

casez语句将表达式或条件中的所有'z'值视为不关心。

casex语句将所有“x”和“z”值视为不关心,而不是逻辑值。

图片

图片

图8:casez和casex语句示例

4.3 循环语句

(1)forever循环语句示例

initial begin        clk = 0;    forever #25 clk= ~clk;   
end

以上示例为周期为#50的clk时钟,注意该语句不可综合,只能用于仿真。

(2)repeat循环语句

if(rotate == 1)  repeat(8) begin //循环8次  temp = data[15];  data = {data <<1,temp};  end  

repeat语句可以设置循环的次数,该语句可以用于综合,要具有明确的循环表达式和循环条件。

(3)while循环语句

initial begin      cnt = 0;while(cnt < 101) begin  $display("cnt = %d",cnt); cnt = cnt + 1;   end   
end 

cnt循环计数100次,在cnt为101时退出循环,该语句可以用于综合,要具有明确的循环表达式和循环条件。

(4)for循环语句

integer i;    
always @(inp,cnt) begin    result[7:4] = 0;  result[3:0] = inp;  if (cnt == 1) begin  for (i=4;i<=7; i=i+1) begin  result[i] = result[i-4];  end     end     
end

以上for循环语句实现4bit左移位功能,for语句可以进行综合,实现硬件电路。

5. 同步逻辑和异步逻辑

图片

图9:同步逻辑及异步逻辑

always敏度列表表达方式将导致控制信号是同步的或异步的。上图中左侧代码具有同步预置和触发器清除功能,该代码仅在时钟上升沿敏感,右侧代码敏感列表包含时钟和异步清除信号,如果aclr上升沿触发,就会引起q清零,不受时钟控制。

6. 函数(function)和任务(task)

Verilog HDL有两种子程序,函数和任务。它们都必须在模块中定义。函数根据其输入返回一个值。函数通常产生组合逻辑,并用于assign表达式中。

任务和函数对于模块中的重复代码非常有用。它们提高了代码的可读性。

图片

 

图片

图10:function示例

图片

图11:task示例

function和task的异同点

相同点:

(1)任务和函数必须在模块内定义,其作用范围仅适用于该模块,可以在模块内多次调用;

(2)任务和函数中可以声明局部变量,如寄存器,时间,整数,实数和事件,但是不能声明线网类型的变量;

(3)任务和函数中只能使用行为级语句,但是不能包含always和initial块,设计者可以在always和initial块中调用任务和函数。

差异点:

(1)函数能调用另一个函数,但是不能调用任务,任务可以调用另一个任务,也可以调用函数;

(2)函数总是在仿真时刻0开始 ,任务可以在非零时刻开始执行;

(3)函数一定不能包含任何延迟,事件或者时序控制声明语句,任务可以包含延迟,事件或者时序控制声明语句;

(4)函数至少要有一个输入变量,也可以有多个输入变量,任务可以没有或者有多个输入,输出,输入输出变量;

(5)函数只能返回一个值,函数不能有输出或者双向变量,任务不返回任何值,或者返回多个输出或双向变量值。  

延伸阅读:Verilog HDL基础知识(一)

图片

欢迎关注FPGA技术实战公众号,喜欢就多多转发吧!

这篇关于Verilog HDL基础知识(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022256

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

计算机基础知识复习9.6

点对点链路:两个相邻节点通过一个链路相连,没有第三者 应用:PPP协议,常用于广域网 广播式链路:所有主机共享通信介质 应用:早期的总线以太网,无线局域网,常用于局域网 典型拓扑结构:总线型 星型(逻辑总线型) 介质访问控制  静态划分信道 信道划分介质访问控制 频分多路复用FDM 时分多路复用TDM 波分多路复用WDM 码分多路复用CDM 动态分配信道 轮询访问介质访问控

Gitflow基础知识

0.理想状态 现状 听完后的理想状态 没使用过 git 知道 git 是什么,会用 git 基础流程命令 用过 git,但只通过图形化界面操作 脱离图形化界面操作,通过 git 命令操作 会 git 命令 掌握 gitflow 规范,合理使用 rebase 和解决代码冲突问题 1.Git 的基础流程&命令 1.1 基础概念 工作区:代码生产基地,pycharm