第4章 Verilog HDL行为级建模
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
块的嵌套
Verilog HDL数字系统设计及仿真
块内所有语句都结束时,跳出块
initial begin a=0; fork #5 b=1; #10 c={a,b}; join #15 d={b,a}; end
16
块的命名
Verilog HDL数字系统设计及仿真
①命名块中可以声明局部变量; ②块被命名后就变成了设计层次的一 个组成部分,可以对块内的变量进行 层次访问; ③命名块可以被禁用。
条件真则执行
30
for循环
Verilog HDL数字系统设计及仿真
语法形式
for(初始化条件; 判断条件; 变量控制) begin reg [7:0] temp; 循环体语句 reg [7:0] i; end reg [7:0] mem [0:3]; for(i=0;i<mem_size;i=i+1) mem[i]=0; for(i=temp;i>0;i=i>>1) begin if (i[0]==1) count=count+1; end
always @ (posedge clock ) always @ (posedge clock or negedge reset)
12
顺序块
Verilog HDL数字系统设计及仿真
以关键字begin…end将多条语句封装 成块 按顺序执行
initial initial begin begin a=0; a=0; b=1; #5 b=1; c={a,b}; #10 c={a,b}; d={b,a}; #15 d={b,a}; end end
9
时序控制方式
Verilog HDL数字系统设计及仿真
基于延迟的控制
always #5 a=~a; initial clock=0; always #10 clock=~clock;
基于电平敏感的控制
使用wait语句
initial clock=0; always begin #15 clock=1; #5 clock=0; end
initial结构
Verilog HDL数字系统设计及仿真
initial结构的主要功能就是进行初始化, 是设计者进行信号和变量初始化的时 候常用的形式。 initial结构仅在仿真开始的时候被激活 一次,然后该结构中的所有语句被执 行一次,执行结束后就不再执行。
6
Verilog HDL数字系统设计及仿真
26
Verilog HDL数字系统设计及仿真
第三,case语句不需要break,这是针对有C语 言背景的设计者的。 第四,case语句中只能有一个default语句,而且 建议必须使用default,也是为了得到最后综合的 电路不会生成锁存器。
27
再看本章范例
Verilog HDL数字系统设计及仿真
28
循环语句
Verilog HDL数字系统设计及仿真
while循环 for循环 repeat循环 forever循环
wenku.baidu.com29
while循环
Verilog HDL数字系统设计及仿真
语法形式
while (判断条件) begin 循环体语句; end reg [7:0] temp; while(temp) begin if(temp[0]) count=count+1; temp=temp>>1; end
22
if的嵌套使用
Verilog HDL数字系统设计及仿真
if(a>0) if(a>b) begin a=a-i; i=i+1; end else ……
if(a>0) begin //这两处相当于加入大括号 if(a>b) begin a=a-i; i=i+1; end end // 这两处相当于加入大括号 else ……
仅含一条语句时
initial a=1;
包含多条语句时
initial begin a=1; b=0; end 相当于C语言中的大括号
7
Verilog HDL数字系统设计及仿真
用initial生成信号
initial begin a=0;b=0; #15 a=0;b=1; #15 a=1;b=0; #15 a=1;b=1; #15 a=0;b=0; end
21
注意事项
Verilog HDL数字系统设计及仿真
第一,if所接的条件判断中必须返回一个逻辑值。 第二,如果待执行的语句有多条时,可以使用 begin…end来进行封装。 第三,if语句可以嵌套使用,一定要注意if和else 的对应关系 第四,if语句是有优先级的,这点对于后期的门 级网表有着直接影响。 第五,注意“;”出现的位置,是在每一条可执 行语句之后,if和else对应的代码行都没有分号 第六,对于每一个出现的if结构,都要有一个else 对应条件为假的情况
19
if语句
Verilog HDL数字系统设计及仿真
第一类,仅有if,没有else语句
if(condition) statement;
第二类,有一对if…else语句
if(condition) statement_1; else statement_2;
第三类,有嵌套的if…else if…else结构
事件过多可用*号
always @(*)
11
Verilog HDL数字系统设计及仿真
以某一个信号的名称作为敏感事件,表示 的是对信号的电平值敏感,即信号只要发 生了变化,就要执行always结构,所有的 组合逻辑电路采用的都是这种控制方式 时序电路采用的敏感列表一般是边沿敏感 的,信号的边沿用posedge(上升沿)和 negedge(下降沿)来表示
13
并行块
Verilog HDL数字系统设计及仿真
以关键字fork … join将多条语句封装 成块 所有语句并行执行
initial fork a=0; #5 b=1; #10 c={a,b}; #15 d={b,a}; join
14
注意
Verilog HDL数字系统设计及仿真
并行块容易引起竞争 适用于绝对时间的控制 实际建模中并行块不可综合 仅适用顺序块即可
if(condition1) statement_1; else if(condition2) statement_2; else if(condition3) statement_3; //可以出现多个 else statement_4;
20
示例
Verilog HDL数字系统设计及仿真
if(clock= =1) q=d; //clock为1时执行此句 if(sel= =1) out=A; //sel为1时执行此句 else out=B; //sel非1时执行此句 if(Sum < 60) Total_C = Total _c + 1; else if (Sum < 75) Total_B = Total_B + 1; else Total_A = Total_A + 1;
第4章 Verilog HDL行为级建模
Verilog HDL数字系统设计及仿真
本章内容
Verilog HDL数字系统设计及仿真
initial结构和always结构 顺序块和并行块 if语句和case语句 循环语句 阻塞性赋值与非阻塞性赋值
2
行为级模型范例
Verilog HDL数字系统设计及仿真
23
添加空else
Verilog HDL数字系统设计及仿真
防止出现锁存器
if(a>b) out=a; else ; //添加一个空语句
24
case语句
Verilog HDL数字系统设计及仿真
关键字为case、default、endcase 基本结构
case(表达式) 分支1:语句1; 分支2:语句2; …… default:默认项; endcase
31
初始化存储器
repeat循环
Verilog HDL数字系统设计及仿真
语法形式
repeat (次数) begin 循环体语句 end
reg [7:0] mem [0:3]; initial begin i=0; repeat (4) begin mem[i]=0; i=i+1; end end
17
Verilog HDL数字系统设计及仿真
命名块示例
module top; initial begin: block_name //在begin或fork后加冒号,接上名称即可 reg local_variable; //可以声明局部变量 reg i; …… end endmodule
18
块的禁用
4
Verilog HDL数字系统设计及仿真
另一形式
always @( A or B or C or D or S1 or S0 or En begin if(!En_) Y=0; else begin if(S1= =1'b1) begin if(S0= =1'b1) Y=D; else Y=C; end else begin if(S0= =1'b1) Y=B; else Y=A; end 5 end end
无需电路图,更注重功能
module MUX4x1(Y,A,B,C,D,S1,S0,En_); output Y; input A,B,C,D; input S1,S0; input En_; 输出必须定义成为reg reg Y; …… endmodule
3
Verilog HDL数字系统设计及仿真
always @( A or B or C or D or S1 or S0 or En_) begin if(En_==1'b0) Y=0; else begin case({S1,S0}) 2'b00:Y=A; 2'b01:Y=B; 2'b10:Y=C; 2'b11:Y=D; default:Y=0; endcase end end
8
always结构
Verilog HDL数字系统设计及仿真
always结构在仿真过程中是时刻活动 的,它的语句结构如下:
always <时序控制方式> 执行语句
如果没有控制方式的参与,此结构中 的语句可能会一直执行并发生死锁, 或者变成类似数据流级的语句
always a=~a; always sum=a+b; 死锁 assign sum=a+b;
Verilog HDL数字系统设计及仿真
使用关键字disable
reg [15:0] flag; integer i; initial begin flag=16'h0100; i=0; begin: block1 //命名块 while(i<16) begin if(flag[i]) //判断flag的每一位,直到为1时执行后面的顺序块 begin $display("Encountered a True bit at element number %d",i); disable block1; //禁用block1 end i=i+1; end end end
基于事件的控制
使用最多
10
基于事件的控制
Verilog HDL数字系统设计及仿真
“@”引导的事件列表
always @ (敏感事件列表)
可以使用or或者“,”来隔开 多个事件
always @ (a or b) sum =a+b;
只要事件发生就执行always中的语句
always @( A or B or C or D or S1 or S0 or En_)
reg [1:0] ctl; case(ctl) 2'b00:out=a+b; 2'b01:out=a-b; 2'b10:out=!a; 2'b11:out=!b; default: ; endcase
25
注意事项
Verilog HDL数字系统设计及仿真
第一,case语句中的每个分支条件必须不同,变 量的位宽要严格相等,还要使用明确指定宽度的 方式,避免使用“'d”等不指明宽度的分支条件。 第二,case语句中的每个分支可以接多条待执行 语句,只需要使用begin…end即可 …… 2'b01:begin out=a-b; sum=a+b; end ……
always @( A or B or C or D or S1 or S0 or En_) begin if(En_==1'b0) Y=0; else begin case({S1,S0}) 2'b00:Y=A; 2'b01:Y=B; 2'b10:Y=C; 2'b11:Y=D; default:Y=0; endcase end end