




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
廖义奎EDA技术1第10章FPGA
VerilogHDL编程基础2本次课内容10.7always过程10.8赋值10.9行为描述310.7always过程
VerilogHDL中并没有进程的概念,但却有与进程相同功能的三种过程,分别是assign、always和模块实例,这三种在执行的方式上与进程一样,在过程之间是并行执行的。模块实例已在前面介绍过,assign将在赋值一节中介绍。这一节将介绍always过程。410.7.1always过程always过程相当于一个进程,即always块与always块之间是并行工作的,而块内就顺利执行的。always块的执行,由敏感信号列表中的信号触发,就像是由一个中断信号触发一个中断处理程序一样。5always过程的格式如下:always@(敏感信号列表)begin
赋值语句分支语句循环语句任务、函数调用
end6对于always过程,具有如下特点:(1)重复多次执行的语句,是编写触发器、同步设计中最常用的语句,也是仿真中产生时钟常用的语句。(2)可以认为always块是响应事件的处理程序。(3)always块内的程序是顺利执行的。always块内的顺序执行与阻塞式赋值语句在功能上基本相同,但在用法上有点差别。7对于always过程,需要注意如下几点:(1)always语句通常对数字电路中的一组反复执行的活动进行建模,它类似于软件语言中的一个无限循环,从硬件的角度而言,它真实地反映了电路在加电后的连续反复运行的状态。(2)“begin-end”之间的语句称为块语句,其中的语句是按照串行方式顺序执行的。8(3)@(敏感信号列表)是可选的,敏感信号列表列出了触发条件,只有当触发条件满足的时候,后面的“begin-end”语句块才会执行,当有多个触发条件的时候,触发条件之间用“or”或者逗号“,”分开,具体的格式如下:
@(触发条件1,触发条件2,……,触发条件N)910.7.2触发方式
Verilog触发方式分为电平触发、边沿触发两种:(1)电平触发如图10.7所示。
在Verilog中,电平触发方式比较少用。(2)边沿触发如图10.8所示。
10上升沿与下降沿都触发,从功能上看,与电平触发效果一样,所以也有人把这种方式叫做电平触发,但如果从严格意义上看,还是不太一样。例如:
always@(CLK)a<=b
以上语句指当CLK的值改变时就把b指定(Assign)给a,即@(CLK)将在CLK的上升沿或下降沿时,都触发。11边沿触发在Verilog中又分为两种:(1)上升沿触发如图10.9所示,用关键字posedge描述;例如:
always@(posedgeCLK)
cntr<=cntr+1以上语句指当CLK的上升沿时,将cntr的值加1。
12(2)下降沿触发如图10.10所示,用negedge描述。例如:always@(negedgeCLK)
cntr<=cntr+1以上语句指当CLK的下降沿时,将cntr的值加1。在每一个always过程中只能有一种触发条件存在于敏感信号列表中,最好不要混合使用。在时序电路中always块通常是用时钟边沿触发。
1310.7.3事件及敏感信号列表在VerilogHDL的always模块中,有四种事件,即上面介绍的四种触发方式产生的事件,分别是电平触发事件、上升沿触发事件(posedge)、下降沿触发事件(negedge)和用户自定义事件。电平触发事件一般用于逻辑电路建模之中,只要信号的电平发生改变,都将触发电平事件,使用方法如下:always@(a,b);或者写成:always@(aorb);14上升沿触发事件和下降沿触发事件一般用于同步电路(例如触发器、寄存器及锁存器等)建模,使用方法如下:always@(posedge
clk);//上升沿触发事件always@(negedge
clk);//下降沿触发事件也可以对多个事件起作用,例如:always@(posedge
clk,posedgea);152001版本支持的always敏感信号列表方式always@(aorborc)中的or可用”,”代替,例如:
always@(a,b,c)always中所有的输入信号都是敏感信号,则可以用@*表示,例如:
always@*
VerilogHDL允许使用者自行声明一个事件,事件的声明以event作为标识符。QuartusII中支持自定义事件的综合。16例如:
eventtransfer;always@(posedge
clk)if(condition_a)->transfer;always@(transfer)
dout<=data_from_fuifo
1710.8赋值VerilogHDL的赋值分为两类:一是持续赋值,二是过程赋值。1810.8.1持续赋值持续赋值是给wire类型的变量赋值。可以用持续赋值语句描述组合逻辑,代替用门电路的描述方式。持续赋值在过程块外部使用。持续赋值只能在等式左边有一个简单延时说明。持续赋值一般多用于组合逻辑电路的设计。19语法:<assign>[#delay][strength]<net_name>=<expressions>例如:wireout;assignout=in_data_a|in_data_b;//也可以不经assign而用wire直接指定,这种方式较为简捷
wireout=in_data_a|in_data_b;
20过程赋值是给寄存器类型的变量赋值。寄存器类型包括reg、integer、real、time等。这些值在被赋值之后将保持不变,直到被其它的过程语句赋予新值为止,而assign语句的赋值对象只能是线网类型(wire),而且它的值连续不断地变化。
21过程赋值多用于时序逻辑电路的设计。过程赋值分为阻塞式赋值与非阻塞式赋值。非阻塞式语句主要用于时序器件,阻塞式语句主要用于组合逻辑。2210.8.2阻塞式赋值在顺序模块内,某条语句未执行完之前,不会执行下一条语句。阻塞式赋值语句符号是“=”。下面通过两个例子来加深对阻塞式赋值的理解。23示例10.7:moduleverilog_1(inputin1,in2,clk,outputregout);regtemp;always@(posedge
clk)begintemp=in1|in2;out=temp;endendmodule
24示例10.8:moduleverilog_1(inputin1,in2,clk,outputregout);regtemp;always@(posedge
clk)beginout=in1|in2;endendmodule
示例10.8综合结果和示例1的综合结果完全一样。2510.8.3非阻塞式语句在顺序模块内,某条语句的执行并不阻塞下一条语句的执行,即在这条语句执行时,下一条语句也同时执行。阻塞式赋值语句符号是“<=”。下面是采用非阻塞式语句的示例,该示例代码形式与前面刚介绍的两个例子相似,但综合出来的结果却不相同。26示例10.9:
moduleverilog_1(inputin1,in2,clk,outputregout);regtemp;always@(posedge
clk)begintemp<=in1|in2;out<=temp;endendmodule
27moduleverilog_1(inputin1,in2,clk,outputregout);regtemp;always@(posedge
clk)begintemp=in1|in2;out=temp;endendmodulemoduleverilog_2(inputin1,in2,clk,outputregout);regtemp;always@(posedge
clk)begintemp<=in1|in2;out<=temp;endendmodulemoduleverilog_3(inputin1,in2,clk,outputregout);regtemp;always@(posedge
clk)beginout=temp;temp=in1|in2;endendmodulemoduleverilog_4(inputin1,in2,clk,outputregout);regtemp;always@(posedge
clk)beginout<=temp;temp<=in1|in2;endendmodulemoduleverilog_5(inputin1,in2,clk,outputregout);regtemp;always@(clk)begintemp=in1|in2;out=temp;endendmodulemoduleverilog_6(inputin1,in2,clk,outputregout);regtemp;always@(in1,in2)begintemp<=in1|in2;out<=temp;endendmodule282910.9行为描述3010.9.1if条件语句条件语句由“ifelse”实现,它具有如下特点:(1)if语句只能在initial或always区块内使用;(2)可以嵌套使用;(3)在多个平行条件时,例如3-8译码器、七段译码器等程序中,用case比if好;31(4)一般情况下应写完if语句,即写成ifelse的形式,以避免综合出锁存器;(5)if放在不同的层次上,将综合出不同层次的电路;(6)如果在连续的if语句中没有beginend,else句子将与离它最近的if句子匹配。3210.9.2case多路选择语句实现多径选择。另外还有两种增强的case语句casex、casez,支持1、0、x和z四种信号类型。在casez语句中,出现在条件表达式和任意分支项表达式中的值z被认为是无关值,出现z的那个位在比较时被忽略。在casex语句中,值x和z都被认为是无关位。实际使用中,字符“?”可用来代替字符“z”。
casez和casex都用endcase结束。
3310.9.3if语句与case语句的比较时序上,如果是多重if语句,一般情况下一个if语句会综合出一个逻辑比较电路,层次多了,延迟时间就长。电路大小上,对于较少选择项情况,用的if和case语句差别不是很大,有时是if语句电路大一些,有时是case大一些。但是,在选择项非常多时,用case综合出的电路要小一些。3410.9.4循环语句循环语句分为while、for、repeat、forever四种,必须在initial和always块中才能使用。大多情况下,循环将由并行的硬件电路来实现,因此要注意循环的范围。35示例10.10:moduleverilog_1(input[7:0]a,outputreg[7:0]y);integeri;always@(a)begin
for(i=0;i<7;i=i+1)begin
y[i]=~a[i]&a[i+1];endendendmodule
36下面是while语句应用例子(示例10.11)moduleverilog_1(input[7:0]a,outputreg[7:0]y);integeri;always@(a)begini=0;
while(i<7)begin
y[i]=~a[i]&a[i+1];i=i+1;endendendmodule37下面是repeat语句应用例子(示例10.12
)moduleverilog_1(input[7:0]a,outputreg[7:0]y);integeri;always@(a)begini=0;repeat(8)begin
y[i]=y[i]&a[i];i=i+1;endendendmodule
38
无限循环语句,一般在仿真中用。如果要在电路综合中实现一个无限循环的功能,该如何做?那当然是用事件触发方式,不用无限循环。无限循环可综合出无限多个电路模块,无限多的电路模块如何做出来?39下面是forever语句应用例子(示例10.13)moduleverilog_1(input[7:0]a,outputreg[7:0]y);initialbeginforevery[1]=a[2]&a[4];endEndmodule上述程序在quartus中综合没有报错,但没有电路输出。
4010.10VerilogHDL任务及函数定义4110.10.1函数
VerilogHDL中的函数与C语言等其它高级语言的功能与用法相似。函数要返回一个向量值,在函数定义时在函数名前说明范围。函数中需要多条语句时用begin和end。函数只能返回一个值,函数一经调用就必须立即执行,其内部不能包含任何时序控制,函数可以调用函数,但不能调用任务,函数至少有一个输入。语句:functionfname;//其它语句
Endfunction42下面是函数的一些特点:(1)函数定义中不能包含任何时序控制语句。(2)函数至少有一个输入,不能包含任何输出或双向端口。(3)函数只返回一个数据,其缺省为reg类型。(4)传送到函数的参数顺序和函数输入参数的说明顺序相同。43(5)函数在模块(module)内部定义。(6)函数不能调用任务,但任务可以调用函数。(7)函数在Verilog中定义了一个新的范围(scope)。(8)虽然函数只返回单个值,但返回的值可以直接给信号连接赋值。这在需要有多个输出时非常有效。4410.10.2任务任务是一个与函数功能相似的子程序,一般在能用函数的地方,都可用任务代替。但是,任务的功能比函数强,用法更加灵活。语句:tasktname;//其它语句
endtask45下面是任务的一些特点:(1)任务与函数只能用于模块内,可以在块内定义和调用;(2)任务可以定义input和output;(3)任务内可直接用if、for等语句,但不能用always语句;(4)任务一般需要在always块内调用;(5)任务可在调用前定义,也可在调用后定义;(6)每个任务调用的综合一般都由一个电路实现,所以多个任务调用就需要多个电路块。46
下面是一个使用任务的例子,在任务中定义输入输出端口,在模块中调用该任务的方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国实验仪器数据监测研究报告
- 2025年中国雕花皮带市场调查研究报告
- 河北学校人造草坪施工方案
- 钢筋加工工厂化施工方案
- 长方形的周长(教学设计)-2024-2025学年三年级上册数学人教版
- 第9课 开关量的或运算(教学设计)2023-2024学年六年级下册信息技术浙教版
- Unit 3 Families celebrate together Lesson 13教学设计2024-2025学年冀教版八年级英语上册
- 8《推翻帝制 民族觉醒》第1课时《革命先驱孙中山》教学设计-2023-2024学年道德与法治五年级上册统编版(五四制)
- 21古诗词三首《枫桥夜泊》(教学设计)-2024-2025学年语文五年级上册统编版
- 2025年海洋能利用设备项目建议书
- 公司组织架构与管理体系制度
- 2024至2030年中国聚硫橡胶行业市场现状分析及未来前景规划报告
- 2024-2030年中国涂碳箔行业现状调查与投资策略分析研究报告
- 天津市河西区2023-2024学年高一上学期1月期末化学试题(原卷版)
- 2025高考语文步步高大一轮复习讲义65练答案精析
- 部编版八年级语文下册全册单元教材分析
- 2024-2030年中国派对用品行业供需规模调研及发展趋势预测研究报告
- 粤剧中国汉族传统戏剧人类非物质文化遗产代表作宣传课件
- 传染病监测预警与应急指挥大数据引擎平台建设需求
- 2023-2024年度数字经济与驱动发展公需科目答案(第5套)
- 2024年吉林省中考语文真题
评论
0/150
提交评论