verilog语法

合集下载

verilog基本语法

verilog基本语法

Verilog基本语法【逻辑值】➢逻辑0 表示低电平,GND➢逻辑1 表示高电平,VCC➢逻辑X 表示未知电平,可能是高电平,也可能是低电平➢逻辑Z 表示高阻态,外部没有激励信号,是一个悬空状态注:高阻态的实质:电路分析时高阻态可做开路理解。

可以把它看作输出(输入)电阻非常大,对下级电路无任何影响。

若为0、x、z则按照假处理;若为1,按真处理。

【进制】➢二进制4'b0101 —4位二进制数0101➢十进制数4’d2 —4位十进制数2➢十六进制数4’ha —4位十六进制数aVerilog中若不指定位宽,默认32位;若不指定位宽不指定进制,默认32位宽的十进制数。

【标识符】标识符可以是字母、数字、$和_(下划线)的组合,且开头必须是字母或下划线,区分大小写。

不建议大小写混合使用。

【数据类型】➢寄存器关键字reg,默认初始值位不定值X;reg[31:0] delay_cnt; //[31:0],指定寄存器位宽32位,reg key_reg; // 默认位宽为1.reg类型数据只能在always和initial语句中被赋值。

➢线网表示结构实体的物理连线,包括wire和tri类型➢参数常量,用parameter定义。

parameter H_SYNC = 11'd41;【运算符】➢[条件操作符] ?:例,a?b:c //如果a为真就选b,否则选择c。

result=(a>=b)?a:b;[逻辑运算符] !&& ||[位运算符] ~ & | ^(按位异或)a&b; //自动将位宽小的数高位补零至较大数的位宽,然后按位与操作。

[移位运算符] << >> 用0填补移出的空位。

左移时位宽增加,右移位宽不变。

[位拼接运算符] {}例,{a,b} //将a和b拼接起来,作为一个新信号,a为高位。

c={a,b[3:0]}; //a、b位宽均为8位,c为8+4=12位。

verilog语法

verilog语法

例设计三位全加器
模块名
端口列表
sum[2:0]
module adder ( cout,sum,a,b,cin ); input [2:0] a,b; input cin; output cout; output [2:0] sum; assign {cout,sum}=a+b+cin; endmodule
2.2 Verilog 语法要素
标识符 关键词 空白和注释 常量 字符串 延时# 操作符
1.标识符 标识符(identifiers) 标识符
标识符是用户在描述时给Verilog对象起的名字 对象起的名字 标识符是用户在描述时给 标识符必须以字母(a-z, A-Z)或( _ )开头,后面可以是字母、数字、( $ )或 开头, 标识符必须以字母 或 开头 后面可以是字母、数字、 或 ( _ )。 。 最长可以是1023个字符 个字符 最长可以是 标识符区分大小写, 和 标识符区分大小写,sel和SEL是不同的标识符 是不同的标识符 模块、 模块、端口和实例的名字都是标识符 module MUX2_1 (out, a, b, sel); output out; Verilog标识符 标识符 input a, b, sel; not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1); endmodule
第二讲 Verilog 语法
Verilog模块module Verilog语法要素 Verilog数据类型及逻辑系统
2.1 模块 模块module
模块是verilog设计中的基本功能块,在第一讲有简单交待, 设计中的基本功能块,在第一讲有简单交待, 模块是 设计中的基本功能块 这里详细介绍模块内部构成 module 模块名 ( 端口列 表 ); 端口声明, 端口声明,参数声明

第三讲 verilog的基本语法

第三讲 verilog的基本语法

TOP HA
18
参数值的模块引用
module TOP3(NewA,NewB,NewS,NewC); input NewA, NewB; output NewS,NewC; HA #(5,2) Ha1 (NewA, NewB, NewS, NewC);
//第1个值5赋给参数AND_DELAY,该参数在模块HA中说明。 //第2个值2赋给参数XOR_DELAY,该参数在模块HA中说明。
asiccenterarnoldshi在过程块alwaysinitial中对变量赋值时忘了把它定义为寄存器类型reg或已把它定义为连接类型了wire把实例的输出连接出去时把它定义为寄存器类型把模块的输入信号定义为寄存器类型
TJIC
第三章 verilog的基本语 verilog的基本语 法
天津大学电子科学与技术系史再峰 shizaifeng@
连续赋制语句用于把值赋给线网型变量(不能为寄 存器型变量赋值) 语句形式为:assign A = B & C;
连续赋值语句在什么时候执行呢? 只要在右端表达式 的操作数上有事件(事件为值的变化)发生时,表达式 即被计算;如果结果值有变化,新结果就赋给左边的 线网。
28
连续赋值的目标类型
标量线网 向量线网 向量的常数型位选择 ,
endmodule
19
课堂练习课堂练习-参数传递
假定一个模块为BK,内部 两个参数P1,P2;另外一 个模块为HA,内部参数P3, P4 其在TOP模块中实例化调 用的名称分别为U1, U2 请尝试在top模块中用两种 不同的方法改变其参数值 p1-p4分别为1,2,3,4
TOP U2 U1
20
二、变 量
24
补充: 补充:CMOS NOR

Verilog 常用语法及举例

Verilog 常用语法及举例
1,仅仅用于组合逻辑赋值。 2,用于条件赋值。 3,被赋值者类型必须是wire。
常用语句之五 for
for (i == 0; i< 100 ; i= i+1)
1,用于循环语句中。 2,循环次数必须是个常量。 3,i为integer(整型)类型。
小练习
1,分频电路设计,设计一个8分频。 2,设计一个0~23的计数器,在数码管上显示出来。 3,改进上述计数器,增加一个拨码输入,当拨码 为0时,数码管上显示一个固定值。当拨码为1时, 计数器继续计数。 4,按键去抖设计。每按键一次,数码管显示加1。 5,电子密码锁设计。
阻塞赋值与非阻塞赋值
阻塞赋值用在组合逻辑中。在always中使用 符号 = 非阻塞赋值用在时序逻辑中。在always中使 用符号 <=
阻塞赋值与非阻塞赋值
阻塞赋值 always @ (a,b,c) begin b = a; c = b; end
a
a
非阻塞赋值
always @ (posedge clk) begin b <= a; c <= b; end
常用语句之三 begin end
If (a == b)
begin c <= d; e <= f; g <= h; end 1,begin—end里面的所 有语句都是顺序执行。
常用语句之四 assign
assign a = b & c; assign a = (d ==1’b0) ? 0 : 1;
a b c b c
组合逻辑和时序逻辑
时序逻辑
时序逻辑需要时钟,输入变化不会引起输出立即变化。 而是要参考时钟沿的变化。 只能用非阻塞赋值的always语句实现。 结果会生产寄存器。

verilog语法

verilog语法

verilog语法Verilog语法是一种用于描述电路行为的高级语言,该语言包括硬件描述语言(HDL),它是用于描述电路结构的抽象级别的编程和验证的语言。

Verilog语法可以用于描述各种电路,例如数字电路、模拟电路、混合电路和电力电路。

它可以被编译到电路设计软件中,例如VHDL和FPGA,以生成真实的电路。

Verilog语法也可以用于设计和模拟计算机硬件,以及通用门阵列(FPGA)和软件可编程逻辑器件(CPLDs)。

它是一种开放式标准,因此,可以轻松地编写可以被各种工具识别的代码,使其可以被用于多个目的。

Verilog语法的另一个重要特性是它可以被用于建立完整的计算机系统,这是在其他语言中实现不易的。

Verilog语言具有许多不同类型的代码模块,其中包括文件输入和输出模块,模块句法,连接句法,结构化代码,运算符及其他语句。

文件输入和输出模块可以让您访问外部文件的数据,模块句法可以让您定义自定义模块,而连接句法可以用于定义系统中的数据流程,结构代码可以用于实现复杂的电路,而运算符和语句可以控制电路的运行方式。

在Verilog语言中,有很多种不同类型的语句。

它们可以分为三类:控制语句,转移语句和计算(运算)语句。

控制语句用于控制程序的流程,如循环、条件语句和操作符。

转移语句可以控制程序的运行方式,如延迟、忽略和停止,而计算(运算)语句可以实现算术和逻辑运算,以及多种数据类型的处理。

Verilog语法可以被用于编写可以用于在各种硬件上运行的软件。

Verilog代码的优势在于它可以用于编写可重用的代码以及更高效的代码,它可以将复杂的电路结构编译成更加细粒度的电路,并且可以显著地减少系统开发时间和成本。

Verilog语法在电路设计中发挥着至关重要的作用,它可以被用于描述电路结构,帮助设计师更容易地创建和处理电路,它还可以被用于设计计算机硬件和实现复杂的电路功能,因此可以帮助减少系统开发的成本和时间。

总的来说,Verilog语法是一种功能强大而易于使用的电路设计编程语言,可以被用于描述电路结构,编写可重用的代码,以及创建和处理复杂的电路,它可以大大简化系统开发,减少系统开发时间和成本。

常用Verilog语法

常用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 中的一些语法

有关Verilog 中的一些语法

有关Verilog 中的一些语法位运算符1) ~ //取反2) & //按位与3) | //按位或4) ^ //按位异或5) ^~ //按位同或(异或非)逻辑运算符在Verilog HDL语言中存在三种逻辑运算符:1) &&逻辑与2) || 逻辑或3) !逻辑非等式运算符在Verilog HDL语言中存在四种等式运算符:1) == (等于)2) != (不等于)3) === (等于)4) !== (不等于)"=="和"!="又称为逻辑等式运算符。

其结果由两个操作数的值决定。

由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。

而"==="和"!=="运算符则不同,它在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,两个操作数必需完全一致,其结果才是1,否则为0。

"==="和"!=="运算符常用于case表达式的判别,所以又称为"case等式运算符"。

位移运算符左移:右边的添0右移:左边的添0,移除的位舍去举例:4’b1001<<1 = 5’b10010; 4’b1001<<2 = 6’b100100;1<<6 = 32’b1000000; 4’b1001>>1 = 4’b0100; 4’b1001>>4 = 4’b0000;位拼接运算符1.{a,b[3:0],w,3’b101}也可以写成为{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}2.{4{w}} //这等同于{w,w,w,w}3.{b,{3{a,b}}} //这等同于{b,a,b,a,b,a,b}负数:一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。

verilog基本语法、模块写法

verilog基本语法、模块写法

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进行声明。

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

2.关键词 Verilog HDL 定义了一系列保留字,叫做关键词。注意只有小 写的关键词才是保留字。例如,标识符always (这是个关键 词)与标识符ALWAYS(非关键词)是不同的。
always and assign begin buf buf if0 bufif1 case casex casez cmos deassign default defparam disable edge else end endcase endmodule endfunction endprimitive endspecify endtable endtask event for force forever fork function highz0 highz1 if ifnone initial inout input integer join large macrmodule medium module nand negedge nmos nor not notif0 notif1 or output parameter pmos posedge primitive pull0 pull1 pullup pulldown rcmos real realtime reg release repeat rnmos rpmos rtran rtranif0 rtranif1 scalared small specify specparam strong0 strong1 supply0 supply1 table task time trantranif0 tranif1 tri tri0 tri1 triand trior trireg vectored wait wand weak0 weak1 while wire wor xnor xor
3.空白符和注释
module MUX2_1 (out, a, b, sel); 格式自由 // Port declarations 单行注释 使用空白符提高可读性及代码组 output out; 到行末结束 织。Verilog忽略空白符除非用于 input sel, // control input 分开其它的语言标记。 b, /* data inputs */ a; /* The netlist logic selects input ”a” when 多行注释,在/* */内 sel = 0 and it selects ”b” when sel = 1. */ not (sel_, sel); and (a1, a, sel_), (b1, b, sel); // What does this // line do? or (out, a1, b1); endmodule
第二讲 Verilog 语法
Verilog模块module Verilog语法要素 Verilog数据类型及逻辑系统
2.1 模块module
模块是verilog设计中的基本功能块,在第一讲有简单交待, 这里详细介绍模块内部构成 module 模块名 ( 端口列 表 ); 端口声明,参数声明
C格式来声明端口
//D 触发器 module D_FF (input d, clk, clr, output reg q,qb); ………… ………… endmodule
例设计三位全加器
模块名
端口列表
sum[2:0]
module adder ( cout,sum,a,b,cin ); input [2:0] a,b; input cin; output cout;
例SR触发器模块
//SR 触发器 module SR_FF (Q, Q_n,S,R); output Q, Q_n; //端口声明 input S,R; nand n1(Q, S,Q_n); nand n2(Q_n,R,Q);
S
Q
R
Q_n
nand为verilog中的 与非门门级原语部件
endmodule
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
合法和非法标识符
合法的: shift_reg_a busa_index bus263 非法的: 34net //不能用数字开头 a*b_net //不能含有非字母符号*
n@263 //不能含有非字母符号@
标识符书写注意项:
1、用有意义的有效的名字如Sum 、CPU_addr等。 2、用下划线区分词。 3、采用一些前缀或后缀,如 时钟采用Clk 前缀:Clk_50,Clk_CPU; 低电平采用_n 后缀:Enable_n; 4、统一一定的缩写如全局复位信号Rst。 5、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块 保持一致。 6、参数采用大写,如SIZE 。
wire,reg和其它类型 的变量声明
可选 低层模块实例 always和initial块,所有 行为语句都在块内 必须出现
数据流语句 (assign)
任务和函数
endmodule


module能够表示: 物理块,如IC或ASIC单元 逻辑块,如一个CPU设计的ALU部分 整个系统 每一个模块的描述从关键词module开始,有一个名称(如 SN74LS74,DFF,ALU等等),由关键词endmodule结束。
端口声明
a[2:0]
cout
adder
cin
b[2:0]
output [2:0] sum;
assign {cout,sum}=a+b+cin; endmodule
数据流语句
这个例子描述了一个三位的加法器。从例子中可以看出整个 Verilog HDL程序是嵌套在module和endmodule声明语句里 的,只出现了一个assign语句。

模块端口等价于芯片的管脚(pin) 模块通过端口与外部通信
端口列表和端口声明
端口等价于硬件 的引脚(pin)
端口在模块名字 后的括号中列出
端口可以说明为 input, output及 inout
端口声明

input 输入端口 output 输出端口 inout 双向端口
也可以采用类似ANSI
D_FF d2 (d[ 2], clk, clr, q[ 2], qb[ 2]);
D_FF d3 (d[ 3], clk, clr, q[ 3], qb[ 3]);

当设计大规模系统时,端口太多,记住端口顺序不大可 能,可以采用按名连接方法。
D_FF d0 (.d(d[ 0]), .clk(clk), .clr(clr), .q(q[ 0]), .qb(qb[ 0]));
模块中只出现在低层次模块实例化
模块实例化(module instances)
可以将模块的实例通过端口连接起来构成一个大的系 统或元件。 在上面的例子中,REG4有模块DFF的四个实例。注 意,每个实例都有自己的名字(d0, d1, d2, d3)。实例 名是每个对象唯一的标记,通过这个标记可以查看每 个实例的内部。 实例中端口的次序与模块定义的次序相同。


模块实例化与调用程序不同。每个实例都是模块的一 个完全的拷贝,相互独立、并行。
.端口与外部信号的连接
在调用模块时,可以用顺序连接和按名连接把模块定义的 端口与外部信号连接起来

顺序连接:需要连接的信号需要与模块声明的端口列表一致; 按名连接:端口和外部信号按名字连clk, clr, q[ 0], qb[ 0]); D_FF d1 (d[ 1], clk, clr, q[ 1], qb[ 1]);
4.整数常量和实数常量
Verilog中,常量(literals)可是整数也可以是实数 整数的大小可以定义也可以不定义。整数表示为: <size>‟<base><value> 其中 size :大小,由二进制数表示的位数(bit)表示。缺省为32位 base:数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为10进制 value:是所选数基内任意有效数字,包括X、Z。 实数常量可以用十进制或科学表示法表示。
4位寄存器设计
module D_FF (d, clk, clr, q, qb); .... endmodule module REG4( d, clk, clr, q, qb); output [3: 0] q, qb; input [3: 0] d; input clk, clr; D_FF d0 (d[ 0], clk, clr, q[ 0], qb[ 0]); D_FF d1 (d[ 1], clk, clr, q[ 1], qb[ 1]); D_FF d2 (d[ 2], clk, clr, q[ 2], qb[ 2]); D_FF d3 (d[ 3], clk, clr, q[ 3], qb[ 3]); endmodule
模块中的5个部分并没全部出现, 只出现在低层次模块实例 化
D触发器模块
//D 触发器 module D_FF (d, clk,clr,q,qb); output q, qb; input d,clk,clr; always块行为描述语句 reg q, qb;//输出端口q, qb值保存 always @(posedge clk) begin if (clr) q=1‟b0; else 该模块内包括always行为 q=d; 块语句 end not (qb,q); endmodule
相关文档
最新文档