




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3讲 Verilog行为描述,授课教师:邹兴平 电邮地址:zou_,2020/10/1,2,内容提纲,行为描述构成框架 块语句 赋值语句 高级程序语句 任务与函数,2020/10/1,3,Verilog模块的基本结构,Module name(ports) / 模块定义 port declarations / 端口类型说明 Data type declarations / 数据类型说明 Functionality / 描述体 Timing specificaton Endmodule / 结束行,2020/10/1,4,行为描述和结构描述,模块的描述方式也称建模方式 行为级建模(系统级、算法级
2、、RTL级) 模块内部只包含过程块和连续赋值语句 结构级建模(门级和开关级) 只包含模块实例和基本元件实例 混合建模方式:行为级和结构级,2020/10/1,5,一、Verilog HDL行为描述的构成框架,1、过程块的组成 模块定义 参数定义 /可选 端口类型说明 数据类型说明 描述体 结束行 描述体有多个并行的过程块组成,2020/10/1,6,2.过程块,VerilogHDL的行为描述以过程块为基本组成单位,一个模块的行为描述由一个或多个并行运行的过程块组成。 过程块的定义: 过程语句(initial和always)(事件控制敏感表)(斜体部分可缺省) 块语句开始表示符:块名 ,有名块,
3、可缺省 块内局部变量说明:可缺省 过程赋值语句或高级程序语句 块语句结束标识符,2020/10/1,7,过程块,过程语句:initial和always 事件控制敏感表只在语句后出现,以激活过程语句的执行,只有always有敏感表 块语句标识符: 串行块标识符:begin-end 并行块标识符:fork-join 过程块在块名、局部变量缺省,且只有 一条过程描述语句时,块语句标识符也可缺省,2020/10/1,8,3.过程语句initial和always,都从0时刻开始执行 initial无触发条件,只执行一次; always以触发条件执行,或无触发条件时一直执行 一个module的行为描述中可
4、以有多个initial和 always语句,即有多个过程块存在,且相互独立,并行运行 都不能嵌套使用,2020/10/1,9,举例:产生2个时钟的行为描述,module clk_gen_demo(clock1,clock2); output clock1,clock2; reg clock1,clock2; initial begin clock1=0; clock2=1; end always begin #50 clock1= clock1; end always begin #100 clock2=clock2; end end Module,2020/10/1,10,二、块语句,由块标
5、识符begin-end和fork-join界定的一组行为描述语句 是行为描述的打包处理,形式上与一条语句相一致 只能出现在行为描述中,但不局限于过程语句之后,在高级程序语句中也需要用到块语句,2020/10/1,11,1.串行块begin-end,按语句排列顺序串行执行 可以有额外的时间延时(前一条执行结束下一条开始前的延时),但只是用于仿真(替代器件延时信息),不用于综合 用带延时的行为描述进行功能仿真,便于观察功能模块执行的内部细节;而在逻辑综合时,综合工具将忽略描述中的延时信息,2020/10/1,12,举例,带延时的串行块描述 begin #10 reg_a=reg_b; #10 re
6、g_c=reg_a; end 不带延时的串行块描述 begin reg_a=reg_b; reg_c=reg_a; end /不改变结果,但不利仿真过程顺序执行过程,2020/10/1,13,仿真与综合,用带延时的行为描述进行功能仿真 综合后用工艺库的逻辑块延时参数和线负载模型延时参数替代了描述中的延时信息 综合后产生的电路连接网表(Netlist)中附加了上述延时参数,从而网表的模拟过程中大致能观察到实际的延时和执行过程,2020/10/1,14,2.并行块fork-join,块中的每条语句都同时开始执行,与先后顺序无关,延时都相对于块的起始执行时刻 并行块起始执行时刻就是流程控制转入并行块
7、的时刻,块结束时刻则是执行时间最长的语句结束的时刻 并行块的行为描述可以理解为电路上电后各模块同时开始工作的过程,2020/10/1,15,举例,带延时的串行行块描述 begin #10 reg_a=reg_b; #10 reg_c=reg_a; end 带延时的并行块描述 fork #10 reg_a=reg_b; #10 reg_c=reg_a; join,2020/10/1,16,举例,module wave_gen_para(wav); output wav; reg wav; initial fork wave=0; #50 wave=1; #100 wave=1; #150 wav
8、e=1; #200 wave=1; join endmodule,2020/10/1,17,3.有名块,格式: begin:快名 end 或 fork:块名 join,2020/10/1,18,有名块的块名作用,便于实现对块语句的有效控制 用disable语句终止或提前结束有名块的执行过程 允许在块内引入局部变量 可定义只在块内起作用的变量 变量名可以和块外的其他变量名相同 一定是寄存器类型,2020/10/1,19,三、赋值语句,1.过程赋值语句 过程块中的赋值语句均称过程赋值语句 过程赋值语句只能对寄存器类变量赋值,2020/10/1,20,过程赋值举例,Reg_a=8b1011_1100
9、; reg_a3=1b0; Reg_a7:4=4b1010; mem_a3=8h5d carry,sum=reg_a+reg_b;/用连接符整体赋值,2020/10/1,21,2.过程赋值语句的两种延时模式,1)外部模式 格式:=; 过程:定时控制求表达式赋值 举例: 1.延时控制:#延时量 #10 reg_a=reg_b; 2.事件控制:(事件控制敏感表) (clock) reg_a=reg_b;,2020/10/1,22,事件控制分类,(信号名) 信号名有变化就触发事件 例:(clock) a=b; (posedge信号名) 信号名有上升沿就触发事件 例:( posedge clock)
10、a=b;,2020/10/1,23,(negedge信号名) 信号名有下降沿就触发事件 例:( negedge clock) a=b; (敏感事件1 or 敏感事件2 or ) 敏感事件之一触发事件 没有其他组合触发 信号名可以是任何数据类型的标量或矢量 例:(posedge reset or posedge clear) reg_out=0;,2020/10/1,24,1)内部模式 格式:= ; 过程:求表达式延时赋值 举例: 1.延时控制:#延时量 reg_a=#10 reg_b; 2.事件控制:(事件控制敏感表) reg_a= (clock) reg_b;,2020/10/1,25,比较
11、,外部延时 fork #10 reg_a=reg_b; #10 reg_b=reg_a; join 内部延时 fork reg_a= #10reg_b; reg_b= #10reg_a; join,2020/10/1,26,敏感事件列表在always过程块中的使用,实现组合逻辑功能 事件表达式不能包含posedge和negedge 所以输入信号都要出现在敏感事件列表中 实现时序逻辑功能 可以任意表达式 不要求输入信号出现在敏感表中,2020/10/1,27,3.阻塞过程和非阻塞过程,过程赋值语句中,赋值算符“=”称为阻塞型赋值。在串行块中,前一语句的赋值结束前,后一语句不能被执行,故称之为阻塞
12、执行过程 非阻塞赋值算符“=”不受前面语句执行的影响,直接由块起始时刻开始执行 同一块中建议不混用=和= 非阻塞赋值提供了在串行块中的一种并行执行的表达方法,2020/10/1,28,举例:阻塞赋值,module demo_seri_block(a,b,c,clk); input a,clk; output b,c; always(posedge clk) begin b=a; c=b; end endmodule,2020/10/1,29,综合结果,2020/10/1,30,举例:并行赋值,module demo_pal_block(a,b,c,clk); input a,clk; outp
13、ut b,c; always(posedge clk) fork b=a; c=b; join endmodule,2020/10/1,31,2020/10/1,32,举例:非阻塞赋值,module demo_seri_block(a,b,c,clk); input a,clk; output b,c; always(posedge clk) begin b=a; c=b; end endmodule,2020/10/1,33,4.连续赋值语句assign,有的书籍叫做数据流描述方式 用于对连线类变量赋值 赋值过程始终保持,右边表达式的变化随时反映到左边变量,主要用于描述组合逻辑电路 不能出现
14、在过程块中 以assign为先导,可缺省 没有非阻塞型赋值算符 可以多重驱动,2020/10/1,34,举例,连续赋值: module demo_and_assign(c,a,b); input a,b; output c; assign c=a endmodule,2020/10/1,35,5.过程连续赋值语句assign/deassign,force/release,assign/deassign 在寄存器类变量中连续赋值 优先级高于过程赋值,有一定的强制性 由deassign解除强制赋值 assign与deassign通常成对出现 必须对寄存器变量整体赋值,不能部分赋值 没有存储器类的过
15、程连续赋值,2020/10/1,36,举例:异步清零触发器,Module dff_asyn(q,d,clear,clk); output q; input d,clear,clk; reg q; always(clear) if(!clear) assign q=0 else deassign q; always(posedge clk) q=d; enmodule,2020/10/1,37,Force/release,作用与assign/deassign相同 可以用于寄存器量和连线类量 对寄存器变量而言,比assign/deassign有更高的优先级 用于模拟验证过程的快速调试,2020/1
16、0/1,38,四、高级程序语句,借用C语言中的编程语句,描述过程的行为特征更加明显 只能出现在对模块进行行为描述的过程块中 分类: 条件语句if-else 散列语句case 循环语句forever,repeat,while,for 生成语句generate,2020/10/1,39,1.条件语句if-else,1)if(条件表达式)块语句 条件表达式为逻辑真和逻辑1时条件成立,其他如o、x、z均为条件不成立 一条没有else语句的if语句映射到硬件上,形成的时一个锁存器。如: always(enable or data) if(enbale) out=data;,2020/10/1,40,2)
17、if(条件表达式)块语句 else 块语句,always(enable or data_a or data_b) if(enable) out=data_a; else out=data_b; 综合结果将产生一个二选一的MUX,比锁存器简单的多,2020/10/1,41,3)if (条件表达式1) 块语句1 else if(条件表达式2) 块语句2 else if(条件表达式n) 块语句n else 块语句n+1,常用于多路选择控制 条件判断的先后顺序隐含条件的优先级关系 注意有时电路设计不需要优先级 可以嵌套使用 如无块标识符,else语句与最近的if配对,2020/10/1,42,举例,用
18、于指令译码(略) 嵌套使用 if(条件表达式1) if(条件表达式2) a=a+b; else a=a+c;,2020/10/1,43,if(条件表达式1) begin if(条件表达式2) a=a+b; end Else a=a+c;,2020/10/1,44,举例:同步清零D触发器,module dff_sync(q,d,clear,clk); output q; input d,clear,clk; reg q; always(posedge clk) if(!clear) q=0; else q=d; enmodule,2020/10/1,45,举例:异步清零D触发器,module d
19、ff_async(q,d,clear,clk); output q; input d,clear,clk; reg q; always(clear or posedge clk) if(!clear) q=0; else q=d; enmodule,2020/10/1,46,2.Case语句,常用于译码或有限状态机的描述 分类: case casez casex,2020/10/1,47,1)case,格式 case(敏感表达式) 值1:块语句1 值2:块语句2 值n:块语句n default:块语句n+1 endcase 敏感表达式与各项值的比较是按位作全等比较,2020/10/1,48,举
20、例,module demo_case(sig); input sig; always(sig); case(sig) 1b1: $display(“signal value is 1”); 1b0: $display(“signal value is 0”); 1bx: $display(“signal is unknown”); 1bz: $display(“signal is high impedence”); endcase endmodule,2020/10/1,49,2)casez和casex,casez:忽略比较表达式两边的z部分 Casex:忽略比较表达式两边的x和z部分 举例:
21、 Casez(r3:0) 4b011z:表达式1; 4b011x:表达式2;,2020/10/1,50,3.循环语句forever,forever块语句 永久循环语句 格式: forever 块语句,2020/10/1,51,举例,module clk_gen(clk); output clk; Reg clk; Initial Begin Clk=0; #20; Forever #5 clk=clk; end endmodule,2020/10/1,52,循环语句repeat,格式 repeat(循环次数计算表达式) 块语句 步骤: 计算循环次数,并保存 块语句执行一次 循环次数减一 结果为
22、零,循环结束,否则继续循环,2020/10/1,53,举例:用移位加的方法实现乘法器,module mulitiplier(result,op_a,op_b); parameter size=8; inputsize:1 op_a,op_b; output2*size:1result; reg2*size:1shift_opa,result; regsize:1 shift_opb;,2020/10/1,54,always(op_a or op_b); begin result=0; shift_opa=op_a; shift_opb=op_b; repeat(size) begin #100
23、 ; if(shift_opb1)result=result+shift_opa); shift_opa=shift_opa1; end end endmodule,2020/10/1,55,Result=shift_opashift_opb 注意寄存器位宽定义 Size应用,可参数化设计,2020/10/1,56,循环语句while,格式: while(循环执行条件表达式) 块语句 步骤: 判断条件表达式 条件表达式为真,执行块语句;为假,跳出循环 执行块语句结束后继续判断,直至跳出循环,2020/10/1,57,举例:计算变量中1的个数,module demo_count(var,coun
24、t); parameter var_size=8,cnt_size=4; input var_size:0 var; ouput cnt_size:0 count; reg cnt_size:0 count; reg car_size:0 temp_var;,2020/10/1,58,always(var) begin count=0; tmp_var=var; while(tmp_var) begin if(tmp_var0) count=count+1; tmp_var=tmp_var1; end end endmodule,2020/10/1,59,举例:另一种描述方式,module d
25、emo_count(var,count); parameter var_size=8,cnt_size=4; input var_size:0 var; ouput cnt_size:0 count; integer i; reg cnt_size:0 count;,2020/10/1,60,always(var) begin count=0; i=0; while(ivar_size); begin count=count+tmp_vari; i=i+1; end end endmodule,2020/10/1,61,循环语句for,格式 for(表达式1;表达式2;表达式3) 块语句 fo
26、r语句可以看作是while的一种简约表达形式,2020/10/1,62,举例:综合应用,module demo_decode(); /port and data type declaration always(posedge clock) begin casez(opcode) 3b1?:alu_out=acc; 3b000:while(bloc_wr_enable) repeat(5)(posedge clock) begin ramaddress=data_bus; address=address+1; end,2020/10/1,63,3b011: begin:load integer
27、i; for(i=0;i256;i=i+1); (negedge clock) data_bus=rami; end default:$disp (“illegal oecode!n *fatal error*”); endcase end enmodule,2020/10/1,64,循环中断语句disable,中断正在执行的循环或任务 格式 disable 块名或任务名 实际改变有名块的执行过程,只是与循环语句结合后,为循环进程的中断控制提供了实现的手段,2020/10/1,65,举例, Begin:top for(i=0;in;i=i+1) begin:inner if(a=0) disa
28、ble inner; if(a=b) disable top; end end ,2020/10/1,66,8.Wait语句,格式 wait (条件表达式) 块语句 相当于定时控制中的时间控制,但电平触发 执行过程 判断条件表达式所代表的信号电平 高电平,则继续执行;低电平,则等待,2020/10/1,67,举例:完整的收发系统,顶层模块 Module produce_receiver; wire 7:0 data; wire prod_ready,cons_ready; producer prod_bloc(data,prod_ready,cons_ready); receiver rec_
29、bloc(data,prod_ready,cons_ready); enmodule,2020/10/1,68,数据接收模块,module receiver(data,prod_ready,con_ready) input 7:0 data; input prod_ready; output cons_ready; reg cons_ready; reg 7:0 data_buf; always begin cons_ready =1; forever begin wait(prod_ready) data_buf=data; cons_ready=0; wait(!prod_ready) c
30、ons_ready =1; end end endmodule,2020/10/1,69,数据发送模块,Module producer(data;prod_ready,con_ready); output 7:0 data; output prod_ready; intput cons_ready; reg prod_ready; reg 7:0 data_buf; always begin prod_ready =1; forever begin wait(cons_ready) data=new_producde_data; prod_ready=0; wait(!cons_ready)
31、prod_ready =0; end end endmodule,2020/10/1,70,9.有名事件,格式 event 事件名列表 除网线类型和寄存器类型外的另一种特殊数据类型,无值的概念,只表明一个抽象的事件在某一特定时刻或特定条件下被触发。触发过程语句 -事件名: 事件触发状态可以通过(事件名)的方式进行检测 主要用于模块间的通信握手,2020/10/1,71,举例:计数并统计1的位数,Module top; wire 15:0 number; wire 3:0 count; number_gen ng(number); bit_count bc(number,count); endm
32、odule,2020/10/1,72,计数模块,module number_gen(number); ouput 15:0 number; reg 15:0 number; event ready; initial number=0; always begin #50 number=number+1; #50 -ready; end endmodule,2020/10/1,73,统计模块,module bit_count(number,count); input 15:0 number; output 3:0 count; reg 3:0 count; reg15:0 num_buf; int
33、eger i; always begin top.ng.ready num_buf=nunber; count=0; for(i=0,i16;i=i+1) if(num_bufi ) count=count+1; end endmodule,2020/10/1,74,五、任务与函数,1.任务 格式: task 任务名 端口与类型说明 局部变量说明 块语句 endtask,2020/10/1,75,说明,任务的定义和引用都在一个模块内部 任务定义与模块定义类似 任务内部没有过程语句,但可以包含定时控制部分 任务引用与模块调用一样,需通过任务名端口调用实现 任务可以调用别的任务和函数,也可以调用任
34、务本身 可以在任务内用disable将任务中断,2020/10/1,76,举例:用task实现译码器中的乘法器,module demo_dec_task; reg 15:0 mem0:1023; reg 9:0 pc; reg 31:0 acc; reg 15:0 ir; initial pc=0; always begin ir=mempc; case(ir15:13) 3b111:multiply(acc,memir12:0); endcase #100 pc=pc+1; end,2020/10/1,77,续,Task multiply(op_a.op_b); input 32:1 op_a; input 16:1 op_b; reg 32:1 shift_opa,result,op_a; reg 16:1 shift_opb; begin result=0; shift_opa=op_a; sh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年广西地理中考真题及答案
- 13 必修1 第二单元 第12讲 光合作用的影响因素及应用
- 特色小吃店长期承包合作协议
- 场地运营风险管理与保险合同范本
- 高端制造业项目保证金质押担保服务协议
- 拆除工程安全责任书
- 菜鸟驿站快递网点所有权变更合同模板
- 熔化凝固教学课件
- abc字母教学课件
- 2024-2025学年福建省龙岩市连城县一中高一下学期月考地理试题及答案
- (CNAS-CL01-2018认可准则)内审核查表
- 2024年模型模具加工合同范本
- 广东省高州市2023-2024学年高一下学期期中考试数学
- 食堂工作人员考核方案
- 国家基本公卫(老年人健康管理)考试复习题及答案
- 临床营养(043)(正高级)高级卫生专业技术资格考试试卷及答案指导(2025年)
- 6S视觉管理之定置划线颜色管理及标准样式
- 重庆市旋挖成孔灌注桩工程技术规程
- 贵州省黔西南布依族苗族自治州2023-2024学年六年级下学期6月期末数学试题
- 中考字音字形练习题(含答案)-字音字形专项训练
- 广东省中山市2022-2023学年三年级下学期语文期末考试试卷(含答案)
评论
0/150
提交评论