第6章 Verilog行为语句

合集下载

第6章-Verilog语句语法

第6章-Verilog语句语法
阻塞 (blocking)赋值方式 (b = a)
b的值立刻被赋成新值a; 完成该赋值语句后才能执行下一句的操作; 可能会由于疏忽,使综合结果未知。
6.4 条件语句
if-else语句
if-else语句使用方法有以下3种:
(1)if(表达式) 语句1;
//非完整性if语句
(2)if(表达式) 语句1;
在敏感信号表达式中,只有当触发条件满足时,其后 的“begin-end”块语句才能被执行。
敏感信号表达式
敏感信号表达式又称事件表达式或敏感信号列表, 即当该表达式中变量的值改变时,就会引发块内
语句的执行。因此敏感信号表达式中应列出影响
块内取值的所有信号。若有两个或两个以上信号 时,它们之间用“or”连接。
例如:
@(a)
//当信号a的值发生改变
@(a or b)
//当信号a或信号b的值发生改变
@(posedge clock) //当clock 的上升沿到来时
@(negedge clock) //当clock 的下降沿到来时
@(posedge clk or negedge reset)
//当clk的上升沿到来或reset信号的下降沿到来
非阻塞赋值仿真波形图 阻塞赋值仿真波形图
阻塞赋值与非阻塞赋值
非阻塞赋值综合结果
阻塞赋值综合结果
非阻塞赋值与阻塞赋值方式的主要区别
非阻塞 (non-blocking) 赋值方式 (b<= a)
b的值被赋成新值a的操作, 并不是立刻完成的, 而是在块结束时才完成;
块内的多条赋值语句在块结束时同时赋值; 可参考对应的同步数字电路。
敏感信号列表可用逗号分隔敏感信号
always @(a or b or cin) always @(a, b, cin)

Verilog学习----条件语句、循环语句、块语句与生成语句

Verilog学习----条件语句、循环语句、块语句与生成语句

Verilog学习----条件语句、循环语句、块语句与⽣成语句1.条件语句(if_else语句)3钟形式的if语句:1)if(表达式)语句。

如if(a>b)out1 = int1;2)if(表达式)语句;else语句;如if(a>b)out1 = int1;elseout1 = int2;3)if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;…………………...else if(表达式m)语句m;else 语句n;条件语句必须在过程块语句中是⽤(initial和always语句),除了这两个语句引导的bedin end块中可以编写条件语句外,模块中的其他地⽅都不能编写。

说明(1)3钟形式的if语句中if后⾯的表达式⼀般为逻辑表达式或关系表达式。

判断若为0、Z、X按假处理,若为1,按真处理执⾏指定语句。

(2)在每个else前⾯有⼀分号,整个语句结束处有⼀分号。

(3)if和else后包含多个操作语句时要⽤begin_end包含成⼀个复合语句。

(4)允许⼀定形式的表达式简写(5)else总是与它上⾯最近的if配对2.case语句case语句提供⼀种多分⽀选择语句,形式如下:(1)case(表达式)<case分⽀项> endcase(2)casez(表达式)<case分⽀项> endcase(3)casex(表达式)<case分⽀项> endcasecase分⽀项格式如下分⽀表达式:语句;default:语句;说明:1)分⽀表达式⼜可以称为常量表达式。

2)当控制表达式与分⽀表达式相等时就执⾏分⽀表达式后的语句,如没有相等的就执⾏default后的语句。

3)default项可有可⽆,⼀个case语句只准有⼀个default项。

4)每个case的分⽀表达式的值必须互不相等,否则就会出现问题。

5)执⾏完case分项后的语句则跳出case语句结构,终⽌case语句。

verilog行为级描述

verilog行为级描述

verilog行为级描述Verilog行为级描述Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。

在Verilog中,行为级描述是一种描述电路行为的方法。

本文将介绍Verilog行为级描述的基本概念、语法规则和一些实例应用。

一、Verilog行为级描述的基本概念1.1 模块和端口Verilog中的模块是一个独立的电路单元,可以包含输入端口、输出端口和内部信号。

每个端口都有一个方向(输入或输出)和一个数据类型(比特、向量等)。

1.2 运算符和表达式Verilog中支持各种运算符,包括算术运算符、逻辑运算符、位运算符等。

表达式是由运算符和操作数组成的公式,用于描述电路中的信号逻辑运算。

1.3 过程块过程块是Verilog中用于描述电路行为的基本单位。

过程块可以包含一系列的语句,用于描述电路的运行逻辑。

常用的过程块有始终块(always block)和过程生成块(generate block)。

二、Verilog行为级描述的语法规则2.1 模块定义Verilog中使用module关键字定义模块,后面跟着模块的名称和端口列表。

端口列表中包含每个端口的方向和数据类型。

2.2 信号声明在模块内部,可以使用wire或reg关键字声明信号。

wire用于声明连续的信号,reg用于声明时序的信号。

2.3 时序控制语句Verilog中常用的时序控制语句有if语句、case语句和for循环语句。

这些语句用于根据不同的条件执行不同的操作,实现复杂的电路行为。

2.4 实例化和连接Verilog中可以通过实例化将一个模块嵌入到另一个模块中。

实例化时需要连接各个模块的端口,以建立模块之间的信号传输。

三、Verilog行为级描述的应用实例下面是一个使用Verilog行为级描述实现的4位全加器的例子:```verilogmodule full_adder(input a,input b,input cin,output sum,output cout);wire w1, w2, w3;assign w1 = a ^ b;assign w2 = w1 ^ cin;assign sum = w2;assign w3 = a & b;assign cout = w3 | (w2 & cin);endmodule```在这个例子中,full_adder模块有三个输入端口(a、b和cin)和两个输出端口(sum和cout)。

第6章 Verilog行为语句

第6章  Verilog行为语句
Verilog程序书写格式自由,一行可以写几个语句, 一个语句也可以分多行写。
除了endmodule等少数语句外,每个语句的最后必 须有分号。
可用 /*……*/ 和 //……对Verilog程序作注释。
1.模块( module )声明
ห้องสมุดไป่ตู้块声明包括模块名字,模块输入、输出端 口列表。模块定义格式如下:
例如:
@(a)
//当信号a的值发生改变
@(a or b)
//当信号a或信号b的值发生改变
@(posedge clock) //当clock 的上升沿到来时
@(negedge clock) //当clock 的下降沿到来时
@(posedge clk or negedge reset)
//当clk的上升沿到来或reset信号的下降沿到来
Verilog HDL行为语句
类别 过程语句
块语句 赋值语句 条件语句 循环语句
编译向导语句
语句 initial always 串行块begin-end 并行块fork-join 持续赋值assign 过程赋值=、<= if-else case for repeat while forever `define `include `ifdef, `else, `endif
else
begin q<=d;qn<=~d; end
end
endmodule
6.2 块语句
块语句是由块标志符begin-end或并行块fork-join界定的一 组语句,当块语句只包含一条语句时,块标志符可以缺省。
begin-end串行块中的语句按串行方式顺序执行。比如: begin regb=rega; regc=regb; end

Verilog行为级描述

Verilog行为级描述

Verilog⾏为级描述前⾔在数据流级描述中已经将硬件建模从⽐较底层的门级结构提升到了数据流级。

但数据流级描述除了个别语句外,主要的部分还是使⽤操作符来描述电路的逻辑操作或者计算公式,没有实现真正意义上的功能描述。

⾏为级描述则可以实现从抽象层次更⾼的级别来描述功能电路。

initial与always语句在Verilog 中有两种结构化过程语句:initial语句和always语句,它们是⾏为级建模的两种语句。

其他所有的⾏为语句只能出现在这两种结构化过程语句⾥。

Verilog中各个执⾏流程并发执⾏,⽽不是顺序执⾏的,每个initial语句和 always语句代表⼀个独⽴的执⾏过程,每个执⾏过程从仿真时间0开始执⾏,并且这两种语句不能嵌套使⽤。

initial语句所有在initial语句内的语句构成了⼀个initial 块。

initial块从仿真0时刻开始执⾏,在整个仿真过程中只执⾏⼀次。

如果⼀个模块中包括若⼲个initial 块,则这些initial块从仿真0时刻开始并发执⾏,且每个块的执⾏是各⾃独⽴的。

如果在块内包含多条⾏为语句,那么需要将这些语句组成⼀组⼀般是使⽤关键字begin和end将它们组合为⼀个块语句;如果块内只有⼀条语句,则不必使⽤begin和 end。

举例:module stimulus;reg x,y, a,b,m;initialm=1'b0;initialbegin#5 a=1'b1;#25 y=1'b1;endinitialbegin#10 x=1'b0;#25 y=1'b1;endinitial#50 $finish;endmodule三条initial语句在仿真0时刻开始并⾏执⾏。

如果在某⼀条语句前⾯存在延迟#,那么对这条initial语句的仿真将会停顿下来,在经过指定的延迟时间之后再继续执⾏。

always 语句always语句包括的所有⾏为语句构成了⼀个always语句块。

Verilog学习----结构语句、任务语句、函数语句和系统任务

Verilog学习----结构语句、任务语句、函数语句和系统任务

Verilog学习----结构语句、任务语句、函数语句和系统任务1.结构说明语句initial与always说明语句;initial语句:initialbegin语句1;语句2;"""""""语句n;end例⼦:⽤initial 块对存储器变量赋初始值initialbeginareg=0; //初始化寄存器aregfor(index=0;index<size;index=index+1)memory[index]=0; //初始化⼀个memoryend⽤initial语句来⽣成激励波形initialbegininputs = 'b000000; //初始时刻为0#10 inputs = 'b011001; (’是英⽂输⼊法中的标号)#10 inputs = 'b011011;#10 inputs = 'b011000;#10 inputs = 'b001000;endalways语句Always<时序控制><语句>always语句由于其不断活动的特性,只有和⼀定的时序控制结合在⼀起才有⽤。

如果⼀个always语句没有时序控制,则这个always语句将会使仿真器产⽣死锁。

见下例:[例3]:always areg = ~areg;但如果加上时序控制,则这个always语句将变为⼀条⾮常有⽤的描述语句。

见下例:[例4]:always #half_period areg = ~areg;这个例⼦⽣成了⼀个周期为:period(=2*half_period) 的⽆限延续的信号波形,常⽤这种⽅法来描述时钟信号,作为激励信号来测试所设计的电路。

reg[7:0] counter;reg tick;always @(posedge areg)begintick = ~tick;counter = counter + 1;endalways的时间控制可以是边沿触发也可以是电平触发可以是单个信号也可以是多个信号,中间⽤or 连接。

Verilog中各种语句含义及用法简述

Verilog中各种语句含义及用法简述

Verilog中各种语句含义及⽤法简述Verilog中各种语句含义及⽤法简述⼀般认为Verilog HDL在系统级抽象⽅⾯⽐VHDL略差⼀些,⽽在门级开关电路描述⽅⾯⽐VHDL要强的多写了第⼀个verilog程序,是⼀个加法器内容如下module adder(count,sum,a,b,cin);input[2:0] a,b;input cin;output count;output [2:0] sum;assign{count,sum}=a+b+cin;endmodule开始编译出现了⼏次错误,后来发现给实体的命名和程序中实体要⼀致⽽且⼤⼩写要⼀样,整个程序是嵌套再module和endmodule当中的⽽其中的注释和C/C++类似,⽤//和来标明module compare(equal,a,b);output equal;input [1:0] a,b;assign equal=(a==b)?1:0;//和C语⾔中的相同endmoduleverilog的基本设计单元是“模块(BLOCK)”。

⼀个模块由两个部分组成,⼀部分描述端⼝,⼀部分描述逻辑功能,即定义输⼊是如何影响输出的。

如下module block(a,b,c,d);input a,b;output c,d;assign c="a|b";assign d="a"&b;endmodule模块中最重要的部分是逻辑功能定义。

有三种⽅法可以再模块中产⽣逻辑。

1、⽤“assign”声明语句如:assign a="b"&c;2、⽤实例元件,如同调⼊库元件⼀样如:and and_inst(q,a,b);3、⽤“always”块如:always @(posedge clk or posedge clr) //always块⽣成了⼀个带有异步清除端的D触发器。

beginif(clr) q<=0;else if(en) q<=d;end采⽤assign语句是最常⽤的⽅法之⼀。

《verilog_数字系统设计课程》(第二版)思考题答案

《verilog_数字系统设计课程》(第二版)思考题答案

绪论1.什么是信号处理电路?它通常由哪两大部分组成?信号处理电路是进行一些复杂的数字运算和数据处理,并且又有实时响应要求的电路。

它通常有高速数据通道接口和高速算法电路两大部分组成。

2.为什么要设计专用的信号处理电路?因为有的数字信号处理对时间的要求非常苛刻,以至于用高速的通用处理器也无法在规定的时间内完成必要的运算。

通用微处理器芯片是为一般目的而设计的,运算的步骤必须通过程序编译后生成的机器码指令加载到存储器中,然后在微处理器芯片控制下,按时钟的节拍,逐条取出指令分析指令和执行指令,直到程序的结束。

微处理器芯片中的内部总线和运算部件也是为通用目的而设计,即使是专为信号处理而设计的通用微处理器,因为它的通用性也不可能为某一特殊的算法来设计一系列的专用的运算电路而且其内部总线的宽度也不能随便的改变,只有通过改变程序,才能实现这个特殊的算法,因而其算法速度也受到限制所以要设计专用的信号处理电路。

3.什么是实时处理系统?实时处理系统是具有实时响应的处理系统。

4.为什么要用硬件描述语言来设计复杂的算法逻辑电路?因为现代复杂数字逻辑系统的设计都是借助于EDA工具完成的,无论电路系统的仿真和综合都需要掌握硬件描述语言。

5.能不能完全用C语言来代替硬件描述语言进行算法逻辑电路的设计?不能,因为基础算法的描述和验证通常用C语言来做。

如果要设计一个专用的电路来进行这种对速度有要求的实时数据处理,除了以上C语言外,还须编写硬件描述语言程序进行仿真以便从电路结构上保证算法能在规定的时间内完成,并能通过与前端和后端的设备接口正确无误地交换数据。

6.为什么在算法逻辑电路的设计中需要用C语言和硬件描述语言配合使用来提高设计效率?首先C语言很灵活,查错功能强,还可以通过PLI编写自己的系统任务,并直接与硬件仿真器结合使用。

C语言是目前世界上应用最为广泛的一种编程语言,因而C程序的设计环境比Verilog HDL更完整,此外,C语言有可靠地编译环境,语法完备,缺陷缺少,应用于许多的领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二、块语句begin-end
块语句是由块标志符begin-end界定的一组语句。 当块语句只包含一条语句时,块标志符可以缺省。 begin-end串行块中的语句按顺序执行。比如: begin b=a; c=b; end //块执行完后,b、c 的值是相同的
三、 赋值语句

assign持续赋值语句
case语句
case语句的使用格式如下:
case (敏感表达式) 值1: 语句1; //case分支项 值2: 语句2; …… 值n: 语句n; default:语句n+1; endcase
BCD码—七段数码管显示译码器
module decode4_7(decodeout,indec); output[6:0] decodeout; input[3:0] indec; reg[6:0] decodeout; always @(indec) begin case(indec) //用case语句进行译码 4'd0:decodeout=7'b1111110; 4'd1:decodeout=7'b0110000; 4'd2:decodeout=7'b1101101; 4'd3:decodeout=7'b1111001; 4'd4:decodeout=7'b0110011; 4'd5:decodeout=7'b1011011; 4'd6:decodeout=7'b1011111; 4'd7:decodeout=7'b1110000; 4'd8:decodeout=7'b1111111; 4'd9:decodeout=7'b1111011; default: decodeout=7'bx; endcase end endmodule
七、任务与函数
任务(task)
任务定义格式: task <任务名>; //注意无端口列表 端口及数据类型声明语句; 其它语句; endtask 任务调用的格式为: <任务名>(端口1,端口2,……); 需要注意的是:任务调用时和定义时的端口变量应是 一一对应的。
使用任务时,需注意
任务的定义与调用须在一个module模块内。
阻塞赋值 module block(c,b,a,cclk,a; reg c,b; always @(posedge clk) begin b=a; c=b; end endmodule
阻塞赋值与非阻塞赋值
非阻塞赋值仿真波形 图
阻塞赋值仿真波形图
阻塞赋值与非阻塞赋值
`define
编译向导语句 `include `ifdef, `else, `endif


一、 always过程语句
always过程语句使用模板:
always @(<敏感信号列表>) begin …… end 敏感信号列表:当该列表中变量的值改变时,就 会引发块内语句的执行。 因此敏感信号列表中应包含影响块内语句执 行的所有信号。若有两个或两个以上信号时,它 们之间用关键词“or”连接。
任务与函数的比较
八、顺序执行与并发执行
两个或更多个“always”过程块、 “assign”持续赋值语句、实例元件调用 等操作都是同时执行的。 在“always”模块内部,其语句如果是非 阻塞赋值,也是并发执行的;而如果是 阻塞赋值,则语句是按照指定的顺序执 行的,语句的书写顺序对程序的执行结 果有着直接的影响。
阻塞赋值在该语句结束时就立即完成赋值操作。
阻塞赋值与非阻塞赋值
非阻塞赋值 module non_block(c,b,a,clk); output c,b; input clk,a; reg c,b; always @(posedge clk) begin b<=a; c<=b; end
endmodule
Verilog-2001新的规定
Verilog-2001标准中对敏感信号列表新的规定: 1)敏感信号列表中可用逗号分隔敏感信号,比如: always @(a or b or cin) 等价于 always @(a,b,cin) 2)在描述组合逻辑电路时,在敏感信号列表中使用通 配符“*”,表示包括该过程块中所有的敏感信号,比 如: always @(a or b or cin) 等价于 always @(*) 等价于 always @ *
for语句
for语句的使用格式如下(同C语言):
for(表达式1;表达式2;表达式3)语句;
即: for(循环变量赋初值;循环结束条件;循环变量增值) 执行语句;
用for语句描述七人投票表决器
module voter7(pass,vote); output pass; input[6:0] vote; reg[2:0] sum; reg pass; integer i; always @(vote) begin sum=0; for(i=0;i<=6;i=i+1) if(vote[i]) sum=sum+1; if(sum[2]) pass=1; //超过4人赞成,则通过 else pass=0; end endmodule
主要用于对wire型变量的赋值。 比如: wire a, b ,c; assign c=a&b;
过程赋值语句
过程赋值语句多用于对reg型变量进行赋值。 (1)非阻塞(non_blocking)赋值方式
赋值符号为“<=”, 如:b<= a;
非阻塞赋值在整个过程块结束时才完成赋值操 作。 (2)阻塞(blocking)赋值方式 赋值符号为“=”, 如:b= a;
上面的get0函数循环核对输入数据x的每一位,计算出x中
0的个数,并返回一个适当的值。
在使用函数时,需注意

函数的定义与调用须在一个module模块内。 函数只允许有输入变量且必须至少有一个输入变量, 输出变量由函数名本身担任,在定义函数时,需对函数 名说明其类型和位宽。 定义函数时,没有端口名列表,但调用函数时,需列 出端口名列表,端口名的排序和类型必须与定义时的相 一致。这一点与任务相同 函数可以出现在持续赋值assign的右端表达式中。 函数不能调用任务,而任务可以调用别的任务和函数, 且调用任务和函数个数不受限制。
五、循环语句
在Verilog中存在四种类型的循环语句,用来控制
语句的执行次数。这四种语句分别为:
(1)forever:连续地执行语句;多用在“initial”
块中,以生成时钟等周期性波形。 (2)repeat:连续执行一条语句n次。
(3)while:执行一条语句直到某个条件不满足。
(4)for:有条件的循环语句。
第6章 Verilog行为语句
Verilog HDL行为语句
类别 initial 过程语句 块语句 always 串行块begin-end 并行块fork-join √ √ 语句 可综合性
赋值语句
持续赋值assign
过程赋值=、<= if-else

√ √ √ √
条件语句 循环语句
case for repeat while forever
函数的目的是返回一个值,以用于表达式计算 函数的定义格式:
function <返回值位宽或类型说明> 函数名; 端口声明; 局部变量定义; 其它语句; endfunction
<返回值位宽或类型说明>是一个可选项,如果 缺省,则返回值为1位寄存器类型的数据。
函数举例
function[7:0] get0; input[7:0] x; reg[7:0] count; integer i; begin count=0; for (i=0;i<=7;i=i+1) if(x[i]=1'b0) count=count+1; get0=count; end endfunction
宏替换`define
`define语句用于将一个简单的名字或标志符(或称
为宏名)来代替一个复杂的名字或字符串,其使用 格式为: `define 宏名(标志符) 字符串
如:`define sum ina+inb+inc+ind
在上面的语句中,用简单的宏名sum来代替了一个复杂的 表达式ina+inb+inc+ind,采用了这样的定义形式后,在后 面的程序中,就可以直接用sum来代表表达式 ina+inb+inc+ind了。
定义任务时,没有端口名列表,但需要紧接着进行输入 输出端口和数据类型的说明。 当任务被调用时,任务被激活。任务的调用与模块调用 一样通过任务名调用实现,调用时,需列出端口名列表,
端口名的排序和类型必须与任务定义中的相一致。
一个任务可以调用别的任务和函数,可以调用的任务和 函数个数不限。
函数( function )
//当clk的上升沿到来或reset信号的下降沿到来 注意:避免将边沿敏感信号和电平敏感信号列在一起。
敏感信号列表举例
1位全加器的设计:
module full_add (a,b,cin,sum); input a,b,cin; output [1:0] sum; reg[1:0] sum; always @ (a or b or cin) begin sum=a+b+cin; end endmodule
敏感信号列表
例如:
@(a) @(a or b) @(posedge clock) @(negedge clock) //当信号a的值发生改变 //当信号a或信号b的值发生改变 //当clock 的上升沿到来时 //当clock 的下降沿到来时
相关文档
最新文档