第三、四讲 Verilog HDL 行为语句
第04讲 Verilog-HDL语法——第2部分 语法要点
` timescale
`timescale 说明延时单位及延时精度
格式:`timescale <time_unit> / <time_precision> 如:`timescale 1 ns / 100 ps
`timescale必须在模块之前出现 `timescale 1 ns / 100 ps // All time units are in multiples of 1 nanosecond module MUX2_1 (out, a, b, sel); output out; input a, b, sel; wire sel_;
12 'H83a 8'b1100_ 0001 64'hff01 9'O17 32'bz01x 3’b1010_ 1101 6.3 32e- 4 4.1E3 unsized decimal (zero-extended to 32 bits) unsized hexadecimal (zero- extended to 32 bits) 8-bit binary 64-bit hexadecimal (zero- extended to 64 bits) 9-bit octal Z-extended to 32 bits 3-bit number, truncated to 3’b101 decimal notation scientific notation for 0.0032 scientific notation for 4100
hex
oct
dec
bin
ACSII
string
time
strength module
转义符
\t \n \\ \” %% \<1-3 digit octal number>
verilogHDL培训教程华为
verilogHDL培训教程华为近年来,随着人工智能、物联网和5G等新兴技术的快速发展,数字电路设计和FPGA开发方面的需求也越来越迫切。
而Verilog HDL已成为数字电路设计中最受欢迎和广泛使用的硬件描述语言之一。
因此,华为公司推出了一系列的Verilog HDL培训教程,帮助从业人员快速获得这个技能。
华为Verilog HDL培训教程的特点华为Verilog HDL培训教程主要针对初学者和中级学员,旨在让学生掌握Verilog HDL基础和应用。
教程内容科学、系统,结合了中国实际情况,给人耳目一新的感觉。
华为Verilog HDL培训教程遵从"理论与实践相结合"的原则,保证学生能够灵活应用所学知识。
在理论教学方面,华为Verilog HDL培训教程先后介绍和讲解了Verilog HDL的基础概念、语法、数据类型、运算符、模块等。
在实践操作方面,华为Verilog HDL培训教程采用基于FPGA芯片的开发板完成实验,让学生能够真正体验到数字电路设计的工程化过程。
此外,华为Verilog HDL培训教程融合了多元化的教学形式,通过讲解PPT、操作演示视频、实验文档等多种形式进行教学。
教材编制过程中对各章节的课程设计进行了充分的考虑,让学生可以从基础入手,系统性、完整性地掌握Verilog HDL语言。
总之,华为Verilog HDL培训教程尽力使学习过程严谨、声音,减少因知识不足而带来的错误和困惑。
华为Verilog HDL培训教程的课程设置华为Verilog HDL培训教程旨在让学员了解数字电路设计中最常用的硬件描述语言-- Verilog HDL,并在FPGA开发板上完成一些典型实验。
华为Verilog HDL培训教程包含以下章节:第一章:Verilog HDL基础概念在本章中,学生将学习Verilog HDL的起源、产生背景、基本概念、Verilog HDL的体系结构、Verilog HDL模块体系结构等知识。
第三章 verilog hdl的基本语法(kllast)
例: reg clock;//定义一个1位寄存器变量 reg [3:0] counter; //定义一个4位寄存器变量
2.reg(寄存器型) 4种寄存器类型的变量
抽象描述, 不对应具 体硬件
寄存器类型 功能说明
1.间隔符: Verilog 的间隔符主要起分隔文本的作用,可以使 文本错落有致,便于阅读与修改。
间隔符包括空格符(\b)、TAB 键(\t)、换行符(\n)及 换页符。
2.注释符:注释只是为了改善程序的可读性,在编译时不起作用。 多行注释符(用于写多行注释): /* --- */; 单行注释符 :以//开始到行尾结束为注释文字。
reg
常用的寄存器型变量
integer 32位带符号的整数型变量
real
64位带符号的实数型变量,
time 64位无符号的时间变量
integer、real、time的典型应用是高层次的行为建模,不 能进行逻辑综合。
3.memory(存储器型)
memory型是存储器型,是通过建立reg型数组来描述的,可以 描述RAM存储器、ROM存储器和reg文件。
if(Reset) Q = 0; else Q = D;
二、条件语句
2. case语句
Verilog HDL语言中的case语句可以直 接处理多分支选择。
case语句格式:
case (控制表达式) 分支项表达式1:语句1 分支项表达式2:语句2 … 分支项表达式m:语句m default: 语句n endcase
二、条件语句
• 1. if…else语句
(1)if(表达式) 语句 例如: if(x>y) q=x;
verilog语法
第三章 Verilog HDL的基本语法前言Verilog HDL是一种用于数字逻辑电路设计的语言。
用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。
Verilog HDL既是一种行为描述的语言也是一种结构描述的语言。
这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。
Verilog模型可以是实际电路的不同级别的抽象。
这些抽象的级别和它们对应的模型类型共有以下五种:∙系统级(system):用高级语言结构实现设计模块的外部性能的模型。
∙算法级(algorithm):用高级语言结构实现设计算法的模型。
∙RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。
∙门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。
∙开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。
一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。
其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。
利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。
Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。
这种行为描述语言具有以下功能:∙可描述顺序执行或并行执行的程序结构。
∙用延迟表达式或事件表达式来明确地控制过程的启动时间。
∙通过命名的事件来触发其它过程里的激活行为或停止行为。
∙提供了条件、if-else、case、循环程序结构。
∙提供了可带参数且非零延续时间的任务(task)程序结构。
第三章 Verilog HDL的基本语法汇总
512个单元,每个单元为32位
3.3 Verilog HDL的运算符
算术运算符 逻辑运算符 关系运算符 等值运算符 位运算符 缩减运算符 移位运算符 条件运算符 拼接运算符
1.算术运算符
算术运算符包括: + (加法运算符或正值运算符,如x+y,+8) - (减法运算符或负值运算符,如x-y,-90) * (乘法运算符,如x*y) / (除法运算符,如x/y) % (取模运算符,如x % y)
1.间隔符: Verilog 的间隔符主要起分隔文本的作用,可以使 文本错落有致,便于阅读与修改。
间隔符包括空格符(\b)、TAB 键(\t)、换行符(\n)及 换页符。
2.注释符:注释只是为了改善程序的可读性,在编译时不起作用。 多行注释符(用于写多行注释): /* --- */; 单行注释符 :以//开始到行尾结束为注释文字。
3.标识符和关键词
标识符:给对象(如模块名、电路的输入与输出端口、变
量等)取名所用的字符串。以英文字母或下划线开始
如,clk、counter8、_net、bus_A 。
关键词:是Verilog语言本身规定的特殊字符串,用来定义 语言的结构。例如,module、endmodule、input、 output、wire、reg、and等都是关键词。关键词都是小 写,关键词不能作为标识符使用 。出始终根据输入的变化而 更新其值的变量,它一般指的是硬件电路中的各种物理 连接.
例:网络型变量L的值由与门的驱动信号 a和b所决定,即L=a&b。a、b的值发 生变化,线网L的值会立即跟着变化。
a
&L
VerilogHDL语言(PDF)
Verilog 讲义(二)1)续Verilog 基础2)Verilog 形为描述3.4 运算符九类运算符分类包含运算符算术运算符+ - * / %位运算符~ & | ^ ^~or~^缩位运算符& ~& | ~| ^ ^~or~^逻辑运算符! && ||关系运算符> < <= >=相等与全等运算符== != === !==逻辑移位运算符 <<>> 连接运算符 {}: 条件运算符 ?根据操作数的不同,又可分为三类:1)单目运算符只有一个操作数,且运算符位于操作数的左边如:~clk &a ~& 缩位运算符wire [7:0] aparity=^a (奇校验)2)双目运算符a+b a%b {a,b,c}3)三目运算符out=(sel)?a:b;运算符的优先级参:P443.4.1 算术运算符1)减法亦可用作单目运算符,取补运算2)除法运算符:整型类数据小数部分被截去: integer a=7/2=33)% 取余运算 7%2=13.4.2 位运算符1)~a 按位取反2)a&b 按位相与若a,b 位数不同,短的高位补0,(x者补x)3)^ ^~ 双目3.4.3 缩位运算符单目运算符,按位进行逻辑运算,结果产生一位的逻辑值。
A=4’b1001&a ~&a |a ~|a ^a ~^a0 1 1 0 1 0 3.4.3 逻辑运算符a&&b结果为一位的逻辑值若操作数为多位,只要有一位为1,整个操作数看作逻辑1;若有不定态,结果亦为不定态。
3.4.5关系运算符结果为一位的逻辑值。
3.4.6 相等与全等运算符结果为一位逻辑值相等:比较每一位,所有相等,关系满足,若有不定态或高阻态,不定态结果。
全等:与相等比较过程相同,亦将不定态及高阻态作为逻辑状态比较。
3.4.7 逻辑移位运算符<< >> 以0补位。
Verilog HDL 3
图3-2 值变化快于时延间隔
上面例子中的时延值只出现了一个,事实上这只 是一个“上升时延”,连续赋值语句中的时延可 以指定3类时延值:上升时延、下降时延和关闭时 延(值变为x的时延)。这是一种更加精细的时延 定义方式,其语法形式如下: assign # (rise, fall, turn-off ) LHS_target=RHS_expression; 其中rise是上升时延,fall是下降时延,turn-off是关 闭时延。
其具体含义可以根据下面的例子看出来: assign Bus = MemAddr [7:4]; // 没有定义时延, 则所有时延都是0 assign #4 Ask = Quiet || Late; // 只有1个时延 值,表示上升时延、下降时延和关闭时延都是4 assign # (4,8) Ask = Quick ; /* 有2个时延值, 表示上升时延是4,下降时延是8,关闭时延是 4和8之中的较小值,即4 */ assign # (4,8,6) Arb = & DataBus; // 有3个时延值, 表示上升时延是4,下降时延是8,关闭时延是6
3.2 顺序行为建模
顺序行为建模是Verilog HDL行为建模的主 要方法,也是Verilog HDL最能体现其高级 编程语言之处,如果学过其他高级变成语 言(如C语言),就会对本节介绍的诸如ifelse、for循环之类的语法结构非常熟悉。
此外,本节还将介绍过程赋值的特点和用 法。就像连续赋值用于数据流行为建模一 样,过程赋值用于顺序行为建模。
如下例: assign Mux = (S = = 0)? A : 'bz; assign Mux = (S = = 1)? B : 'bz; assign Mux = (S = = 2)? C : 'bz; assign Mux = (S = = 3)? D : 'bz;
Verilog-HDL中的语句
第三章 Verilog-HDL中的语句1.基本语句1.1赋值语句赋值语句分为连续赋值语句和过程赋值语句。
1.1.1连续赋值语句1.连续赋值语句用于把值赋给wire型变量(不能为reg型变量赋值)。
语句形式为:assign A = B & C;a.只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;b.如果计算的结果值有变化,新结果就赋给左边的线网。
2.连续赋值的目标类型♦标量线网 wire a;♦向量线网 wire [7:0] a;♦向量线网的常数型位选择 a[1]♦向量线网的常数型部分选择 a[3:1]♦上述类型的任意的拼接运算结果 {3a[2],a[2:1]}注:多条assign语句可以合并到一起。
3.线网说明赋值连续赋值可作为线网说明本身的一部分。
这样的赋值被称为线网说明赋值。
如: wire Clear = 'b1;等价于 wire clear;assign clear=‘b1;1.1.2 过程赋值语句1.a.过程性赋值是仅仅在initial语句或always语句内的赋值b.它只能对reg型的变量赋值。
表达式的右端可以是任何表达式。
c.过程性赋值分两类:阻塞性过程赋值 =非阻塞性过程赋值<=2.语句内部时延与句间时延a.在赋值语句中表达式右端出现的时延是语句内部时延。
Done = #5 1'b1;b.通过语句内部时延表达式,右端的值在赋给左端目标前被延迟。
即右端表达式在语句内部时延之前计算,随后进入时延等待,再对左端目标赋值。
c.对比以下语句间的时延beginTemp = 1'b1;#5 Done = Temp; //语句间时延控制end3.阻塞性过程赋值a.赋值运算符是“=”的过程赋值是阻塞性过程赋值。
b.阻塞性过程赋值在在下一语句执行前,执行该赋值语句。
例:initialbeginClr = #5 0;Clr = #4 1;Clr = #10 0;end4.非阻塞性过程赋值a .在非阻塞性过程赋值中,使用赋值符号“ <=”。
Verilog HDL语言
2021/8/14
22
5. 等式操作符(Equality operators)
等值操作符包括:
==(等于)、!=(不等于)、===(全等)、 !==(不全等)4种。
2021/8/14
4
2. 信号类型声明
变量类型声明用来说明设计电路的功能描述中,所用的信号 的数据类型以及函数声明。
变量的数据类型主要有连线(wire)、寄存器(reg)、整型 (integer)、实型(real)和时间(time)等类型。
2021/8/14
5
3. 功能描述
功能描述是Verilog HDL程序设计中最主要的部分,用 来描述设计模块的内部结构和模块端口间的逻辑关系,在电 路上相当于器件的内部电路结构。
① 首字符不能是数字。
② 字符数不能多于1024个。 ③ 大小写字母是不同的。
④ 不要与关键字同名。
2021/8/14
18
4.2.6 操作符
操作符也称为运算符,是Verilog HDL预定义的函数名 字,这些函数对被操作的对象(即操作数)进行规定的运算, 得到一个结果。
操作符通常由1~3个字符组成,例如,“+”表示加操作, “==”(两个=字符)表示逻辑等操作,“===”(3个=字符) 表示全等操作。有些操作符的操作数只有1个,称为单目操作; 有些操作符的操作数有2个,称为双目操作;有些操作符的操 作数有3个,称为三目操作。
字符串是用双引号括起来的可打印字符序列,它必须包含在同 一行中。例如,
“ABC”, “A BOY.” ,“A”, “1234” 都是字符串。
第3讲Verilog行为描述
reg_a=reg_b; reg_c=reg_a;
//不改变结果,但不利仿真过程顺序执行过程
12
仿真与综合
用带延时的行为描述进行功能仿真
综合后用工艺库的逻辑块延时参数和线负
载模型延时参数替代了描述中的延时信息
综合后产生的电路连接网表(Netlist)中
块语句结束标识符
2013-6-27
6
过程块
过程语句:initial和always 事件控制敏感表只在语句后出现,以激活过程语
句的执行,只有always有敏感表
块语句标识符:
串行块标识符:begin-end 并行块标识符:fork-join
过程块在块名、局部变量缺省,且只有 一条过程描述语句时,块语句标识符也可缺省
信号名有下降沿就触发事件 例:@( negedge clock) 敏感事件之一触发事件 a=b;
@(敏感事件1 or 敏感事件2 or „)
没有其他组合触发
信号名可以是任何数据类型的标量或矢量
例:@(posedge reset or posedge clear) reg_out=0;
2013-6-27
16
3.有名块
格式: begin:快名 „ end 或
fork:块名
„ join
2013-6-27
17
有名块的块名作用
便于实现对块语句的有效控制 用disable语句终止或提前结束有名块的执行过
程
允许在块内引入局部变量
可定义只在块内起作用的变量
变量名可以和块外的其他变量名相同
input output a,clk; b,c;
第三讲 verilog的基本语法
包含下述不同种类的线网子类型。 wire, tri 用于连线的最常见的线网类型 wor, trior 线或 wand, triand 线与 trireg 此线网存储数值,用于电容节点的建模 tri1, tri0 用于线逻辑的建模,上拉或下拉驱动 supply0, supply1 supply0用于对“地”建模,supply1对电源建 模
如 a[1]
向量的常数型部分选择
如:a[3:1]
上述类型的任意的拼接运算结果
29
连续赋值语句举例
module F A _ D f (A, B, Cin, Sum, Cout ) ; input A, B, Cin; output Sum, Cout ; assign S u m = A ^B ^Cin; assign C o u t = (A & Cin) | (B & Cin) | (A & B) ; endmodule
8
下划线
下划线可以用来分割数的表达式以提高程序的可读 性,但不能用在位宽和进制处,只能用于具体的数字 之间 比如 16’b1010_1011_11111_000 //合法格式 8’b_0011_1011 //非法格式
9
负数
一个数字可以被定义成负数,只要在位宽表达式前 加一个减号 - 8’d5 // 合法格式 8’d-5 //非法格式
BpW和BpR电路图
31
寄存器(register)类型变量
寄存器( 寄存器(register)类型变量 ) register 型变量能保持其值,直到它被赋于新的值。 register 型变量常用于行为建模,产生测试的激励信号。 常用行为语句结构来给寄存器类型的变量赋值。
HDL 第4次课
case语句进行逐位比较以求完全匹配(包括x和z)。 default语句可选,在没有任何条件成立时执行;此时 如果未说明default,Verilog不执行任何动作。 多个default语句是非法的 casez 和 casex
条件语句 每个case分项的分支表达式取值必须不相同。 执行完case分项后的语句,则跳出该case语句结构, 终止case语句执行。 case语句所有表达式值得位宽必须相等,控制表达式 和分支表达式才能进行对应位比较
阻塞赋值 • 符号为“=” • 赋值语句结束立即完成赋 值操作 • 在时序逻辑中使用时,可 能会产生意想不到的结果
module non_block(clk,a,b,c); input clk,a; output b,c; reg b,c; initial begin b = 0; c = 0; end always @( posedge clk) begin b= a; // 非阻塞过程赋值 c = b; // end endmodule
块语句
语句块将两条或更多条语句组合在一起,使其 在格式上看更像一条语句。 在Verilog HDL中有两类语句块,即:顺序块 (begin . . . end)和并行块(fork. . . join) 。
‵ timescale 1ns/100ps 块语句 //时间单位为1ns,时间精度为100ps module sign_wave; reg wave; 顺序块(begin…end) parameter d=10; //声明d是一个参数常量 initial begin begin 语句1; wave= 0; ...... #(d/2) wave=1; 语句n; #(d/2) wave=0; end #(d/2) wave=1; #(d/2) $finish; //系统任务,表示仿真结束 end •块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句 initial $ monitor($time,,,”wave=%b”,wave); 才能执行 //系统任务,表示仿真结束 •块中每条语句中的延迟控制是相对于前一条语句结束时刻的延时控制 endmodule •在进行仿真时,当遇到串行块时,块中第一条语句随即就开始执行;当 串行块中最后一条语句执行完毕后,程序流程控制就跳出串行块,串行块 结束执行;整个串行块的执行时间等于其内部各条语句执行时间的总和
常用Verilog语法
module block; parameter p=0; endmodule
module annotate; defparam test.t.b1.p=2, test.t.b2.p=3; endmodule
3.2.2 变量
变量即在程序运行过程中其值可以改变 的量。
网络数据类型表示结构实体(如门) 之间的物理连接。网络类型的变量不能 储存值,而且它必须受到驱动器(门或 连续赋值语句,assign)的驱动。如果 没有驱动器连接到网络类型的变量上, 则该变量就是高阻的,即其值为z。常用 的网络数据类型包括wire型和tri型。如果 wire型和tri型变量没有定义逻辑强度 (logicstrength),在多驱动源的情况下, 逻辑值会发生冲突,从而产生不确定值。 下表是wire型和tri型变量的真值表。
rega =0; //合法赋值语句 mema =0; //非法赋值语句
如果想对memory中的存储单元进行读写 操作,必须指定该单元在存储器中的地址, 如下: mema[3] =0; //给memory中的第3个存储 单元赋值为0。
3.3 运算符及表达式
Verilog HDL语言的运算符范围很广, 按功能可以分为以下几类:
8‘b10101100 //位宽为8的数的二进制 表示,‘b表示二进制。 8‘ha2 //位宽为8的数的十六进制表示, ‘h表示十六进制。
2 、 x和 z值 x代表不定值,z代表高阻值。Z还有 一种表达方式可以写作“?”。 3、负数
一个数字可以被定义为负数,只需 在位宽表达式前加一个减号,减号必须 写在数字定义表达式的最前面。注意, 减号不可以放在位宽和进制之间,也不 可以放在进制和具体的数之间。如: -8‘d5 //这个表达式代表5的补数(用8 位二进制表示); 8’d-5 //非法格式
Verilog-HDL讲座 第三讲 Verilog-HDL的基本概念
Verilog-HDL讲座第三讲 Verilog-HDL的基本概念
常晓明
【期刊名称】《今日电子》
【年(卷),期】2003(000)010
【摘要】@@ 3.1与门的描述rn我们通过最简单的例子来认识一下Verilog-HDL 的基本用法.
【总页数】4页(P54-57)
【作者】常晓明
【作者单位】太原理工大学
【正文语种】中文
【中图分类】TN7
【相关文献】
1.Verilog-HDL讲座第二讲构筑Verilog-HDL学习所需要的环境 [J], 常晓明
2.基于Verilog-HDL的RISC/DSP微处理器IP核的设计 [J], 陈芙蓉;张向文;曹梅双
3.Verilog-HDL讲座第六讲用Verilog-HDL做CPLD设计目标板的设计和下载软件的使用 [J], 李媛媛;常晓明
4.Verilog-HDL讲座第四讲 Verilog-HDL仿真软件的基本操作 [J], 常晓明
5.Verilog-HDL讲座第五讲典型基本逻辑路的Verilog-HDL描述 [J], 常晓明;李媛媛
因版权原因,仅展示原文概要,查看原文内容请购买。
4 verilog hdl语法
5、$readmemh,$readmemb 属于文件读写控制,其作用是从外部文件中读取数据并放 入存储器中,一个是16进制,一个是2进制 格式:$ readmemh(“数据文件名”,存储器名,起始地址, 结束地址) $ readmemb(“数据文件名”,存储器名,起始地址, 结束地址) 6、$random 产生随机数的系统函数,每次调用都会返回一个32位的随 机数,该随机数是一个带符号整数
12
Examples:
8'b11000101 //位宽为八位的二进制数11000101 8'hd5 //位宽为八位的十六进制数d5; 5'O27 //5位八进制数 4'D2 //4位十进制数2 4'B1x_01 //4位二进制数1x01 5'Hx //5位x(扩展的x),即xxxxx 4'hZ //4位z,即zzzz 8□'h□2A /*在位宽和'之间,以及进制和数值 之间允许出现空格,但'和进制之间,数值间是不允许出 现空格的,比如8'□h2A、8'h2□A等形式都是不合法的 写法 */
'Bx0, 5'b0x110, 'da30, 10'd2,
'hzF
18
练习
下列数字的表示是否正确?
6'd18,
d2,
'hzF
19
下列表达式的位模式是什么? 7'o44 'Bx0 5'bx110 'hA0 10'd2 'hzF 0100100
20
345readmemhreadmemb属于文件读写控制其作用是从外部文件中读取数据并放入存储器中一个是16进制一个是2进制格式readmemh数据文件名存储器名起始地址结束地址readmemb数据文件名存储器名起始地址结束地址6random产生随机数的系统函数每次调用都会返回一个32位的随机数该随机数是一个带符号整数35367fopenfclose打开和关闭文件格式fopenfilenamefclosefilename373839404142430低电平逻辑0或逻辑非1高电平逻辑1或真x或x不确定或未知的逻辑状态z或z高阻态verilog中的所有数据类型都在上述4类逻辑状态中取值其中x和z都不区分大小写也就是说值0x1z与值0x1z是等同的
Verilog高级语法
//逻辑值为“1”
//逻辑值为“1”
//逻辑值为“x” !
// ans = 0
// ans = 1
// ans = 1
// ans = x
//ans = 0 逻辑反
//ans = 1100 按位取反
20
Verilog设计
3.3 运算符
拼接运算符:{}
reg[3:0] A,B; reg[5:0] C; C={ A[3:1], B[3:1] }
4’b1101 && 4’b0101=? 4’b1101 & 4’b0101=?
拼接运算符:{}
4’b1101 && 4’b0101= 1‘b1
缩减运算符
4’b1101 & 4’b0101= 4b’0101
其它
19
Verilog设计
3.3 运算符
逻辑运算符:包括逻辑与&&,逻辑或 ||,逻辑非 !
例如:
data = ‘b11x0; data_expectd= ‘b11x0
data == data_expected // 结果未知,为x data === data_expected // 结果为1
22
Verilog设计
3.3 运算符
缩减运算符(reduction operator)
单目——把操作数中的所有的位进行位运算 与、或、异或、与非、或非、异或非
reg [n-1:0] rega; // nbit 矢量的寄存器型数据类型
矢量通过关键字与变量名之间的方括号的高位/低位表示其 变量的位宽[高位: 低位],最左边的位定义为MSB,最右边的位 定义为LSB。在矢量变量声明中可以通过关键字vectored和 scalared进行扩展声明。
VERILOGHDL语言基础
VERILOGHDL语⾔基础第1节 Verilog HDL语⾔简介Verilog HDL语⾔简介Verilog HDL和VHDL是⽬前世界上最流⾏的两种硬件描述语⾔(HDL:Hardware Description Language),均为IEEE标准,被⼴泛地应⽤于基于可编程逻辑器件的项⽬开发。
⼆者都是在20世纪80年代中期开发出来的,前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发,后者由美国军⽅研发。
HDL语⾔以⽂本形式来描述数字系统硬件结构和⾏为,是⼀种⽤形式化⽅法来描述数字电路和系统的语⾔,可以从上层到下层来逐层描述⾃⼰的设计思想。
即⽤⼀系列分层次的模块来表⽰复杂的数字系统,并逐层进⾏验证仿真,再把具体的模块组合由综合⼯具转化成门级⽹表,接下去再利⽤布局布线⼯具把⽹表转化为具体电路结构的实现。
⽬前,这种⾃顶向下的⽅法已被⼴泛使⽤。
概括地讲,HDL语⾔包含以下主要特征:* HDL语⾔既包含⼀些⾼级程序设计语⾔的结构形式,同时也兼顾描述硬件线路连接的具体结构。
* 通过使⽤结构级⾏为描述,可以在不同的抽象层次描述设计。
HDL语⾔采⽤⾃顶向下的数字电路设计⽅法,主要包括3个领域5个抽象层次。
* HDL语⾔是并⾏处理的,具有同⼀时刻执⾏多任务的能⼒。
这和⼀般⾼级设计语⾔(例如C 语⾔等)串⾏执⾏的特征是不同的。
* HDL语⾔具有时序的概念。
⼀般的⾼级编程语⾔是没有时序概念的,但在硬件电路中从输⼊到输出总是有延时存在的,为了描述这⼀特征,需要引⼊时延的概念。
HDL语⾔不仅可以描述硬件电路的功能,还可以描述电路的时序。
2.1.1 Verilog HDL语⾔的历史1983年,Gateway Design Automation(GDA)硬件描述语⾔公司的Philip Moorby⾸创了Verilog HDL。
后来Moorby成为Verilog HDL-XL的主要设计者和Cadence公司的第⼀合伙⼈。
Verilog HDL数字集成电路设计原理与应用 作者 蔡觉平 第3章
1. 显式连续赋值语句
显式连续赋值语句的语法格式如下:
<net_declaration><range><name>; assign #<delay><name>= Assignment expression;
这种格式的连续赋值语句包含两条语句:第一条语句
是对连线型变量进行类型说明的语句;第二条语句是对这 个连线型变量进行连续赋值的赋值语句。赋值语句是由关 键词assign引导的,它能够用来驱动连线型变量,而且只能 5 对连线型变量进行赋值,主要用于对wire型变量的赋值。
计数字电路更类似于使用一些高级语言(如C语言)进行编程,
17 而且Verilog HDL行为级建模的语法结构与C语言也非常相 似。Verilog HDL提供了许多行为级建模语法结构,为设计 者的使用提供了很大的灵活性。
行为描述常常用于复杂数字逻辑系统的顶层设计中,
也就是通过行为建模把一个复杂的系统分解成可操作的若
end initial过程块在进行仿真时从模拟0时刻开始执行,它
在仿真过程中只执行一次,在执行完一次后该initial过程块
就被挂起,不再执行。如果一个模块中存在多个initial过程 块,则每个initial过程块都是同时从0时刻开始并行执行的。
initial过程块内的多条行为语句可以是顺序执行的,也可以
图3.2-1 Verilog HDL行为描述中模块的构成框架
表3.2-1 Verilog HDL行为描述语句及其可综合性
类 别 过程语句 initial always 串行语句块 begin-end 并行语句块 fork-join 连续赋值语句 assign 过程赋值语句=、<= if-else case,casez,casex forever 循环语句 repeat while for `define 编译向导语句 `include `ifdef,`else,`endif √ √ √ √ √ √ √ √ √ 语 句 可综合性
常见组合逻辑电路
module mult_for(outcome,a,b); 7、 说 明 该 电 路 的 功 能
parameter size=8;
input[size:1] a,b; output [2*size:1] outcome; reg [2*size:1] outcome; integer i; 功 能: 两 个 八 位 数 相 乘
三、常用时序电路模块设计
(一) 简单时序逻辑电路的描述
基本D触发器
module DFF(Q,D,CLK); output Q;
※通常使用always @(posedge clk)或 @(negedge clk)块 来描述时序逻辑。
input D,CLK;
reg Q; always @(posedge CLK)
Q<=D;
endmodule
上升沿有效的边沿结构的D触发器ຫໍສະໝຸດ (二) 复杂时序逻辑电路的描述
※通常在always 过程语句里使用条件语句 来实现较复杂的时序逻辑电路 。
1、带清零端、置1端的D触发器
module DFF1(q,qn,d,clk,set,reset); output q,qn; input d,clk,set,reset; reg q,qn; always @(posedge clk ) begin if(!reset) begin q=0; qn=1; end
2、BCD码—— 七段数码显示 译码器
QUARTUS II编译后的生成的模块符号:
module encoder8_3(outcode,a,b,c,d,e,f,g,h); output[2:0] outcode; input a,b,c,d,e,f,g,h; reg[2:0] outcode; always @(a or b or c or d or e or f or g or h) begin if(h) outcode=3‟b111; else if(g) outcode=3‟b110; else if(f) outcode=3‟b101; else if(e) outcode=3‟b100; else if(d) outcode=3‟b011; 要求:输入高电平 有效,输出为原码, else if(c) outcode=3‟b010; else if(b) outcode=3‟b001; 哪一个输入的优先 else if(a) outcode=3‟b000;
Verilog4行为描述高级语句
`define
编译向导语句 `include `ifdef, `else, `endif
√
√
4.1 过一个模块(module)中,使用 initial和 always
语句的次数是不受限制的。initial语句常用于仿 真中的初始化,initial过程块中的语句仅执行一 次; always块内的语句则是不断重复执行的, always结构在仿真过程中是时刻活动的 。
for
initial begin for(i=0;i<4;i=i+1) out = out +1; end
repeat
initial begin repeat(5) out = out +1; end
while
initial begin i=0; while(i<0) i=i+1; end
always过程语句使用模板
always @(<敏感信号表达式event-expression>)
begin //过程赋值 //if-else,case,casex,casez选择语句 //while,repeat,for循环 //task,function调用 end “always”过程语句通常是带有触发条件的,触发条件写 在敏感信号表达式中,只有当触发条件满足时,其后 的“begin-end”块语句才能被执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6)在case语句中,控制表达式与分支表达式的值之间的比较是一种全等
比较(===),必须保证两者的对应位全等。
例如:
reg [3:0] a; reg [9:0] result; case(a) 4’d0: result = 10 'b0111111111; 4’d1: result = 10 'b1011111111; 4’d2: result = 10 'b1101111111; 4’d3: result = 10 'b1110111111; 4’d4: result = 10 'b1111011111; 4’d5: result = 10 'b1111101111; 4’d6: result = 10 'b1111110111; 4’d7: result = 10 'b1111111011; 4’d8: result = 10 'b1111111101; 4’d9 : result = 10 'b1111111110; default: result =10 'bx; endcase
end
(四) 条件语句
Verilog HDL中有两类条件语句:
If-else语句
case语句
If-else语句
if 语句是用来判定所给定的条件是否满足,根据判定的 结果(真或假)决定执行给出的两种操作之一。
Verilog HDL语言提供了三种形式的 if 语句。
(1) if(表达式)
语句; 例如: if ( a > b ) out1 = int1;
(2)非阻塞赋值方式
赋值符号为“ < =”。 说明:1)非阻塞赋值符“ <= ”与小于等于符“<= ”看起来是一样的,但意义 完全不同,小于等于符是关系运算符,用于比较大小。而非阻塞赋值符用于 赋值操作。 2)非阻塞赋值方式的特点是:在整个过程块结束时才完成赋值操作。
reg b,c; always @( posedge clk ) begin b=a; c=b; end
begin
if(clr = 1) Q=D;
else
end
Q=0;
说明:此过程语句描述了一个时钟下降沿触发,带低电平有效同步 清零端的一个D触发器。
(二) 块语句
块语句通常用来将两条或多条语句组合在一起,使其在格式上看更象一 条语句。
Verilog HDL中有两类块语句: 串行块begin_end语句 并行块fork_join语句(不讲)
reg a,b;
例如://产生波形 parameter APPLY_DELAY = 5; reg[ 7 : 0 ] port _ A; initial begin port _ A = 'h20 ; #APPLY_DELAY Port_A= 'hF2; #APPLY_DELAY Port_A= 'h41; #APPLY_DELAY Port_A= 'h0A; end 执行时,port_A的值如下:
initial 过程语句
一、作用与特点:
initial语句主要用于初始化和波形生成,initial 过程块中的语句顺序执行且仅 执行一次。
二、语法格式:
initial 语句;
或:
initial begin 语句1; 语句2; ..... 语句n; end
例如:reg Yurt; initial Yurt = 2;
说明: ● 块名即该”块”的名字,一个标识符。 ● 如果有块名,则reg型变量、integer型变量、real型变量等可在语句 块内部声明。带块名的语句块可被引用。
例如: / /产生波形: begin #2 S t r e a m = 1; #5 S t r e a m = 0; #3 S t r e a m = 1; #4 S t r e a m = 0; #2 S t r e a m = 1; #5 S t r e a m = 0; end 说明: 假定顺序语句块在第10个时间单位开始执行。两个时间单位后第1 条语句执行,即第12个时间单位。此执行完成后,下1条语句在第1 7 个时间单位执行(延迟5个时间单位)。然后下1条语句在第2 0个时间单 位执行,以此类推。
例如: if(a>b) begin out1<=int1; out2<=int2; end else begin out1<=int2; out2<=int1; end
3) 允许一定形式的表达式简写方式。
例如: if(expression) 等同与 if( expression == 1 ) if(!expression) 等同与 if( expression != 1 )
(3) if(表达式1)
语句1;
else else
........
if(表达式2) if(表达式3)
语句2; 语句3;
(2) if(表达式)
语句1 ;
else
语句2; 例如: if(a>b) out1 = int1; else out1 = int2;
else if else
(表达式m) 语句m;
语句n;
“b=c=a”
0 0 0
1 1 1
0 0 0
1 1 1
nblock模块:
“b=a
c =b”
0 0 0 0
1 1 0
0
1 1 0
0
1
(1)阻塞赋值方式
赋值符号为“=”。 阻塞赋值语句执行的过程是:首先计算右端赋值表达式的取值,然 后立即将计算结果赋值给“=”左端的被赋值变量。如果在一个块语句中,有 多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不 能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。
//连续赋值语句
过程赋值语句
过程赋值语句多用在过程语句当中,一般用于对reg型变量进行 赋值。 过程赋值有阻塞赋值和非阻塞赋值两种方式。
*
module block(c,b,a,clk); input clk,a; output c,b; reg c,b; always @(posedge clk)
例如: if(a>b) out1 = int1; else if (a==b) out1 = int2; else out1 = int3;
几点说明:
1) 三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表 达式。系统对表达式的值进行判断,若为0,x,z,按“假”处理,若为1,按 “真”处理,执行指定的语句。 2) 在if和else后面可以有多个操作语句,此时用begin和end这两个关键词 将几个语句包含起来成为一个复合块语句。
Hale Waihona Puke module nblock(c,b,a,clk); input clk,a; output c,b; reg c,b; always @(posedge clk)
*
begin
b=a; c=b; end endmodule
begin
b<=a; c<=b; end endmodule
仿真结果比较:
block模块:
CLK b a D Q c
说明: clk信号的上升沿到来时,将发生如下的变化:b取a的值,c取b的值(即等于a), 对应实际的硬件电路,只用一个触发器来寄存a的值,又输出给b和c。
reg b,c; always @( posedge clk ) begin b<=a; c<=b; end
说明:
CLK a D Q D Q c
initial begin a=0;b=0; end
always 过程语句
一、特点:
always语句后跟着的语句是否执行,则要看它的触发条件是否满足, 如满足则运行该语句一次,如不断满足则不断地循环执行。
二、语法格式:
always <时序控制> <语句>;
说明: (1) 不带延时控制的always语句:由于always语句是重复执行的,因此下 面的always语句将在0时刻无限循环,这时会发生仿真死锁。 如:always clock = ~ clock; (2) 带延时控制的always语句: 如:always #100 clock = ~ clock; //产生一个50M的时钟。 (3) 带事件控制的always语句:
case 语句
if语句只有两个分支可供选择,case语句是一种多分支选择语句。
case语句有三种表示方式:
1) case(表达式) <case 分支项> endcase
2) casez(表达式) <case 分支项> endcase 3) casex(表达式) <case 分支项> endcase
说明:posedge,negedge为边沿触发的两个关键字
※每一个always 过程最好只由一种类型的敏感信号来触发, 而不要将边沿敏感型和电平敏感型信号列在一起。
例如:
always @(posedge clk or negedge clr) //两个敏感信号都是边沿型 always @(a or b) //两个敏感信号都是电平型
该串行语句块执行过程中产生的波形:
(三) 赋值语句(重点)
Verilog HDL中有两类赋值语句:
连续赋值语句
过程赋值语句
连续赋值语句
以关键字assign 开头的为连续赋值语句,主要用于对wire型变量进行 赋值。 例如: assign c=a&b; 说明:在上面的赋值语句中,a、b、c三个变量皆为wire型变量,a和b的 任何变化,都将随时反应到c上来。 例如:用连续赋值语句构成一个4位的全加器 module adder_4(a,b,ci,sum,co); input[3:0] a,b; input ci; output[3:0]sum; output co; assign {co,sum}=a+b+ci; endmodule