第三章_常用Verilog语法之一
- 格式:ppt
- 大小:258.50 KB
- 文档页数:56
verilog 基本语法Verilog基本语法Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。
它具有强大的建模能力,能够描述复杂的数字系统,并用于逻辑设计和硬件验证。
本文将介绍Verilog的基本语法,以帮助读者对这种语言有一个基本的了解。
1. 模块声明在Verilog中,所有的设计都是通过模块来实现的。
模块是Verilog 的基本组织单位,类似于其他编程语言中的函数或类。
模块声明由关键字module开头,后面跟着模块的名称和输入输出端口的定义。
例如:module my_module(input a, b, output c);// 模块的主体endmodule2. 端口声明在模块声明中,使用关键字input和output来声明输入和输出端口。
输入端口用于接收信号,输出端口用于输出信号。
端口可以是单个的信号,也可以是信号的数组。
例如:input a, b; // 单个输入端口output c; // 单个输出端口input [7:0] d; // 输入信号的数组3. 信号声明在Verilog中,使用关键字wire、reg、integer等来声明信号。
wire用于声明连续的信号,reg用于声明时序的信号,integer用于声明整数变量。
例如:wire a, b; // 连续信号reg [7:0] c; // 时序信号,有8位integer d; // 整数变量4. 时钟和复位在数字电路中,时钟和复位信号是非常重要的。
在Verilog中,可以使用关键字input来声明时钟和复位信号,并在模块的输入端口中定义。
例如:input clk; // 时钟信号input rst; // 复位信号5. 运算符Verilog支持各种运算符,包括算术运算符、逻辑运算符、位运算符等。
算术运算符用于执行加减乘除等操作,逻辑运算符用于执行与或非等逻辑操作,位运算符用于执行位操作。
例如:a =b + c; // 加法运算d = ~(a & b); // 与运算和非运算6. 控制结构在Verilog中,可以使用if语句、case语句等控制结构来实现条件判断和多路选择。
第三章 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中的语句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 .在非阻塞性过程赋值中,使用赋值符号“ <=”。
硬件描述语言和数字系统设计第3章 VerilogVerilogVerilog 基本语法主讲教师:郑朝霞华中科技大学电子系郑朝霞华中科技大学电子系郑朝霞23.1 3.1 Verilog Verilog Verilog HDLHDL 基本模块说明3.2 3.2 Verilog Verilog Verilog HDLHDL 中的词汇约定3.3 3.3 Verilog Verilog Verilog HDLHDL 数据类型3.4 3.4 Verilog Verilog Verilog HDLHDL 运算符主要内容主要内容::华中科技大学电子系郑朝霞33.1 Verilog Verilog HDLHDL 基本模块说明�module 能够表示:�物理块,如IC 或ASIC 单元�逻辑块,如一个CPU 设计的ALU 部分�整个系统�每一个模块的描述从关键词module 开始,有一个名称(如SN74LS74,DFF ,ALU 等等),由关键词endmodule 结束。
module 是层次化设计的基本构件逻辑描述放在module 内部Verilog 模块(module)结构基本要素Verilog知识点:3.1.1 端口信息输入//输出说明3.1.23.1.2 输入3.1.3 逻辑功能描述华中科技大学电子系郑朝霞43.1.1端口信息2,端口等价于硬件的引脚(pin)1,端口在模块名字后的括号中列出3,端口可以说明为input,output及inout �模块通过端口与外部通信华中科技大学电子系郑朝霞5华中科技大学电子系郑朝霞6Verilog 模块的结构由在module 和endmodule 关键词之间的四个主要部分组成:- 1- 1.. 端口信息: module combination(a, b, c, d ); - 2- 2- 2. . 输入/输出说明 : input a, b, c ;input a, b, c ; output d ;output d ; -//-//-//输入/输出端口信号类型声明,缺省为wire 型 : - 3- 3- 3. . 内部信号: wire x; wire x; - 4- 4- 4. . 功能定义: assign d = a | x ; assign d = a | x ; assign x = ( b & ~c ); endmodule3.1.2 端口说明华中科技大学电子系郑朝霞73.1.3 逻辑功能描述module mux2to1 (out, a, b, mux2to1 (out, a, b, sel sel sel);); input a, b, input a, b, sel sel sel;; output out;wire out;assign out=( assign out=(sel)?b:a sel)?b:a sel)?b:a;;endmodule两路选择器的RTL 级描述1:华中科技大学电子系郑朝霞8两路选择器的RTL 级描述2:module mux2to1 (out, a, b, mux2to1 (out, a, b, sel sel sel);); input a, b, input a, b, sel sel sel;; output out;reg reg reg out;out;always @( always @( sel sel sel or a or b)or a or b) if (! if (! sel sel sel) out = a;) out = a; else out = b;endmodule实例化(module instances):�1. 端口信息�2. 输入/输出说明�3. 逻辑功能描述(实例化实现功能描述)华中科技大学电子系郑朝霞9华中科技大学电子系郑朝霞10module mux2to1 (out, a, b, mux2to1 (out, a, b, sl sl sl);); input a, b, input a, b, sl sl sl;; output out;not u1 ( u1 (nsl nsl nsl, , , sl sl sl );); and u2 ( u2 (sela sela sela, a, , a, , a, nsl nsl nsl);); and u3 ( u3 (selb selb selb, b, , b, , b, sl sl sl);); or u4 (out, u4 (out, sela sela sela, , , selb selb selb););endmodule两路选择器的门级描述-实例化:华中科技大学电子系郑朝霞11�请在下面的空格中填入适当的符号使其成为右图的Verilog 模块 : module block1(a, b, module block1(a, b, ——, , ——, , —— ); input input ——, , ——, , ——; —————— d, d, d, —— ; assign d = a | ( b & ~c) ; assign e = ( b & ~c ); _______练习:编写Verilog Verilog HDLHDL 模块a b cd e华中科技大学电子系郑朝霞12module moduleblock1(a, b, c , d , e ); input input a , b , c ;o utput d, e ; assign d = a | ( b & ~c) ;assign d = a | ( b & ~c) ; assign e = ( b & ~c );assign e = ( b & ~c ); ee ndmodule 练习答案:编写Verilog Verilog HDL HDL 模块a b cde华中科技大学电子系郑朝霞133.2 3.2 Verilog Verilog Verilog HDLHDL 中的词汇约定知识点:�3.2.1 术语及定义�3.2.2 空白符和注释�3.2.3 3.2.3 VerilogVerilog 采用的四值逻辑系统�3.2.4 整数常量和实数常量�3.2.5 字符串�3.2.6 标识符�3.2.7 系统任务及函数�3.2.8 编译指导 �3.2.9 文本包含�3.2.10 文本替换3.2.1 术语及定义1.空白符:空格、tabs及换行2.标志符(Identifier):Verilog中对象(如模块或信号)的名字3.LSB:最低有效位(Lease significant bit)4.MSB:最高有效位(Most significant bit)华中科技大学电子系郑朝霞14华中科技大学电子系郑朝霞153.2.2 空白符和注释module MUX2_1 (out, a, b, module MUX2_1 (out, a, b, sel sel sel);); // Port declarationsoutput out;input input sel sel sel; // control input; // control input input b, a; / input b, a; /** data inputs data inputs **/ wire wire sel sel sel_, a1, b1;_, a1, b1; / /**The The netlist netlist netlist logic selects input logic selects input logic selects input ””a ” when sel sel sel = 0 and it selects = 0 and it selects = 0 and it selects ””b ” when when sel sel sel = 1. = 1. = 1. **/ not not1 ( not1 (sel sel sel_, _, _, sel sel sel);); and and1 (a1, a, and1 (a1, a, sel sel sel_)_); and and2 (b1, b, and2 (b1, b, sel sel sel); ); or or1 (out, a1, b1);endmodule格式自由使用空白符提高可读性及代码组织。
Verilog语言是一种硬件描述语言(HDL),用于描述和设计数字电路。
它广泛应用于数字系统的建模、验证和综合,是数字电路设计领域中的重要工具之一。
在Verilog中,模块是最基本的组织单位,模块中包含了电路的功能和行为描述。
本文将介绍Verilog语言的基本语法和模块写法,以帮助读者更好地理解和应用Verilog语言。
一、Verilog基本语法1. 注释在Verilog中,使用双斜杠(//)进行单行注释,使用/* */进行多行注释。
注释可以提高代码的可读性,便于他人理解和维护。
2. 变量声明Verilog中的变量可以分为寄存器变量(reg)和线网(wire)两种类型。
寄存器变量用于存储状态信息,线网用于连接各个逻辑门的输入和输出。
3. 逻辑运算符和位运算符Verilog中包括逻辑运算符(与、或、非等)和位运算符(与、或、异或等),用于对信号进行逻辑和位级操作。
4. 控制语句Verilog支持if-else语句、case语句等控制语句,用于根据不同条件执行不同的操作。
5. 模拟时钟在Verilog中,时钟是电路中的重要部分,通常使用时钟信号来同步各个元件的动作。
时钟可以通过周期性方波信号来模拟,使用$period 函数可以定义时钟的周期。
6. 仿真指令Verilog提供了多种仿真指令,用于初始化信号、设置仿真时间、输出波形图等操作,有助于仿真和调试电路。
二、模块写法1. 模块定义在Verilog中,一个模块包含了一组功能相关的硬件描述,可以看作是一个小型电路的抽象。
模块通过module关键字进行定义,其中包括模块名、输入输出端口声明等信息。
```verilogmodule adder(input wire [3:0] a,input wire [3:0] b,output reg [4:0] c);// 模块内部逻辑描述endmodule```2. 端口声明模块的端口包括输入端口(input)和输出端口(output),可以通过wire和reg进行声明。
verilog语言语法Verilog是一种硬件描述语言,用于描述数字电路中的逻辑和物理结构,它针对数字电路的建模和仿真进行了设计,Verilog语言具有简单易学、灵活性高等特点。
本文将对Verilog语言进行详细的介绍,包括语法、数据类型、运算符等。
Verilog语言是一种基于模块的编程语言,其语法基本上与C语言相似。
Verilog语言可以分为两部分:模块声明和模块体。
模块声明部分用于定义输入输出端口,模块体用于描述模块中的行为。
1. 模块声明部分模块声明部分包括模块名、输入输出参数、端口等。
模块定义:模块名即模块定义的名字。
模块端口列表:模块端口列表即模块所定义的所有端口,包括输入和输出端口。
模块声明的格式如下所示:module module_name (port_declaration);2.模块体模块体用于描述模块中的行为,包括时序逻辑和组合逻辑,并且有自己的代码块。
模块体包括数据类型、变量声明、变量赋值、组合逻辑和时序逻辑等。
其中,变量声明常常是最重要的部分。
Verilog语言中常见的变量声明类型:reg:表示寄存器类型变量,用在时序逻辑中;parameter:表示常量类型变量,用于定义常量。
二、数据类型Verilog语言中数据类型主要包括三种:位向量、整数和实数。
1.位向量位向量是Verilog语言中最基本的数据类型。
位向量用于描述各种宽度的二进制数据,可以是有符号或无符号。
位向量的格式如下:[MSB: LSB] vector_nameMSB表示最高位的编号,LSB表示最低位的编号。
例如:wire [7:0] data_in;2.整数类型整数类型表示整型数字,可以是有符号或无符号。
整数类型的格式为:integer int_name;实数类型用于表示浮点数或实数。
实数类型的格式为:三、运算符Verilog语言中有多种运算符,包括算术运算符、比较运算符、逻辑运算符和位运算符等。
下面将介绍常见的运算符。
常用Verilog 语法3.1 模块的结构Verilog 的基本设计单元是“模块”(block )。
一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能。
上面的设计中,模块中的第二、三行说明接口的信号流向,第四、五行说明了模块的逻辑功能。
从这一例子可以看出,Verilog 结构位于module 和endmodule 声明语句之间,每个Verilog 程序包括4个主要部分:端口定义、I/O 说明、内部信号声明和功能定义。
3.1.1模块的端口定义模块的端口声明了模块的输入输出口,格式如下:module 模块名(口1,口2,口3,口4,……);在引用模块时其端口可以用两种方法连接:(1)在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义的端口名,例如:模块名(连接端口1信号名。
连接端口2信号名,连接端口3信号名,……,);(2)在引用时用“.”符号,标明原模块是定义时规定的端口名,例如:模块名(.端口1名(连接信号1名),端口2名(连接信号2名),……,);这样表示的好处在于可以用端口名与被引用模块的端口相对应,而不必严格按端口顺序对应,提高了程序的可读性和可移植性。
3.1.2 模块内容模块的内容包括I/O 说明,内部信号声明和功能定义。
1. I/O 说明的格式输入口: input[信号位宽-1:0] 端口名1;输出口: output[信号位宽-1:0] 端口名1;输入/输出口:inout[信号位宽-1:0] 端口名1;I/O 说明也可以写在端口声明语句里,格式如下:module module_name(input port1,input port2,…output port1,output port2…);2. 内部信号说明在模块内用到的和与端口有关的wire 和reg 类型变量的声明。
如:reg[width-1:0] R 变量1,R 变量2…;wire[width-1:0] W 变量1,W 变量2…;3. 功能定义模块中最重要的部分是逻辑功能定义部分,有3种方法可在模块中产生逻辑。