Verilog语法总结x
更新时间:2022-09-28 13:38:12 阅读: 评论:0
0
Verilog语法总结
数电基础
能够存储1位二值信号的基本单元电路统称为触发器
根据逻辑功能的不同特点,可以将数字电路分成两大类:
组合逻辑电路和时序逻辑电路。
组合逻辑电路中,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。
时序逻辑电路中,任一时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态。或者说还与以前的输入有关,因此时序逻辑必须具备记忆功能。
block:ublock
ledrp..l]
c
L>
d
o
N
rl
sy5_ri_n匚「
sy?_dk_■kUC1'
组合逻辑电路
逻辑值
时序逻辑电路
逻辑0:表示低电平,也就对应我们电路GND;
逻辑1:表示高电平,也就是对应我们电路的
VCC;
逻辑X:表示未知,有可能是高电平,也有可能
是低电平;
逻辑Z:表示高阻态,外部没有激励信号,是一个悬空状态。
数字进制格式
buF
VCC
bufifL
•:mii.T『-Stated..
Drs^bledDfr^Uiiknownli
"OHoWjFal,LogiclowrGround.VSS,NegativeiAsrtion
HHighTu©LogicHightRower.VDDP
VCC^PositiwAsrtion
■J('Jik-io^"i:0€CursatLogicalWhich
CannotResakedConflict
0
Verilog数字进制格式包括二进制、八进制、十进
0
制和十六进制。
一般常用的为二进制、十进制和十六进制。
二进制表示如下:4'b0101表示4位二进制数字0101
十进制表示如下:4'd2表示4位十进制数字2(二进制0010)
十六进制表示如下:4'ha表示4位十六进制数字a(二进制1010)
16'b1001」010_1010_1001=16'h9AA9
第一个表示用几个二进制位可以表示、’为语法、b为二进制,d为十进制,h为16进制,后面则表示要输出输入的字。(括号内为二进制表示,因为最终在计算机中都会变为二进制表示)
标识符
标识符可以是任意一组字母、数字、$符号和_(下划线)符号的组合;
但标识符的第一个字符必须是字母或者下划线;
标识符是区分大小写的;
数据类型
在Verilog语言中,主要有三大类数据类型:寄存器数据类型、线网数据类型和参数数据类型。
寄存器类型:
寄存器表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器储存的值寄存器数据类型的关键字是reg,reg类型数据的默认初始值为不定值x
//regdefine
reg[31:]delay_ci:t;延时计数#
regkcy_rcg;>
reg类型的数据只能在always语句和initial语句中被赋值。
如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器;
如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线;
线网类型:
线网数据类型表示结构实体(例如门)之间的物理连线。线网类型的变量
不能储存值,它的值是由驱动它的元件所决定的。
驱动线网类型变量的元件有门、连续赋值语句、assign等。
如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻的,即其值为z
11//圳if亡define屮
wirekey_flag;
参数类型:
参数其实就是一个常量,在VerilogHDL中用parameter定义常量。我们可以一次定义多个参数,参数与参数之间需要用逗号隔开。每个参数定义的右边必须
是一个常数表达式。
//paianueteidefinepaxairueteipexamjeteipaiameteipaiamjetei
4.31R.G-3LCD
H_5YNC
H_DI5P匸FRCMT:-i_rOTAL
LI1id1;
LI112;
11'd.480;
LI'd.2;
ll'd525;
//■行同歩
/V行显示后沿行有效藪拯//■行显示前沿//■行扫茹周期
参数型数据常用于定义状态机的状态、
数据位宽和延迟大小等。
采用标识符来代表一个常量可以提高程序的可读性和可维护性。
在模块调用时,可通过参数传递来改变被调用模块中已定义的参数。
运算符
符号使用方法说明
~a
a&b
a|b
将a的每个位进行取反
将a的每个位与b相同的位进行相与
将a的每个位与b相同的位进行相或
符号
使用方法
说明
<<
a<<b
将a左移b位
>>
a>>b
将a右移b位
将a的每个位与b相同的位进行异或
两种移位运算都用0来填补移出的空位。左移时,位宽增加;右移时,位宽不变4'b1001<<2=6'b100100;
4'b1001>>1=4'b0100;
优先级
最高
次高
碾0符号
使用方法
说明
{}
{a,b}
将a和b拼接起来,作为个新信号
常用的关键字
关键字
含义
module
模块开始定义
input
输入端口定义
output
输出端口定义
inout
双向端口定义
parameter
信号的参数定义
wire
wire信号定义
reg
reg信号定义
always
产生Reg信号语句的关键字
assign
产生wire信号语句的关键字
begin
语句的起始标志
end
语句的结束标志
edge/podge/negedge
时序电路的标志
ca
Ca语句起始标记
default
Ca语句的默认分支标志
endca
Ca语句结束标记
if/el语句标记
el
for
endmodule
if/el语句标记
for语句标记
模块结束定义
模块的结构
Verilog的基本设计单元是“模块"(block)。
一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能。
Lnoduleblock(afb,crd.);
inputa;b;
outputcfd;
4
assignc=a|Id;
assignd.=a&b;
7
endmodule
initial和always
initial语句它在模块中只执行一次。
它常用于测试文件的编写,用来产生仿真测试信号(激励信号),或者用于对存储器变量赋初值
always语句一直在不断地重复活动。
〃给输入信号初始值
Ellnlt±albegin
sylk
to.jchkey
sysi'stn
30
end
toiich_key
toiich_key
touch_keytouchkey
<=1'hO;
<=1'bu;
<=1'bO;
<=1'hl;<=1'bl;
<=1'bO;
<=1'bl;<=L'bO;
"产生的时钟,周期为always#12sylk<=~Bylk;
但是只有和一定的时间控制结合在一起才有作用。
always的时间控制可以是沿触发,也可以是电平触发;
可以是单个信号,也可以是多个信号,多个信号中间要用关键字or连接。always语句后紧跟的过程块是否运行,要看它的触发条件是否满足。
沿触发的always块常常描述时序逻辑行为。
//计数器对系统时钟计数,计时0・2秒
□always@(podgesys_clkornegedgesys_rst_n)beginif(!sys_xst_n)
counter<=24fd.0;
elif(counter<241dlOO0_0000)
counterv=counter+1rbl;
el
counter<=24f(10;
end
由关键词or连接的多个事件名或信号名组成的列表称为“敏感列表”
电平触发的always块常常描述组合逻辑行为。
always@«orborcordoreorforgorhorporm)bagx口
out1=a?(b+c):(d+e);
ont;2=f?(g+Pi):(p+m);
I-end
如果组合逻辑块语句的输入变量很多,那么编写敏感列表会很烦琐并且容易出错。
always0(*)begin
outl=a?(b+c):(d十巳);
ou~t2=f?(g+h):(p+m);
-end
@(*)表示对后面语句块中所有输入变量的变化都是敏感的。
赋值语句
阻塞赋值可以认为只有一个步骤的操作:
即计算RHS并更新LHS。
非阻塞赋值的操作过程可以看作两个步骤:
(1)赋值开始的时候,计算RHS;
(2)赋值结束的时候,更新LHS。