FPGA学习十之Verilog HDL基本语句

姓名:黄楠琳       学号:19020100011        学院:电子工程学院

转自:https://blog.csdn.net/qq_40181592/article/details/101909650

【嵌牛导读】本篇文章介绍了Verilog HDL基本语句及其运用

【嵌牛鼻子】Verilog HDL模块

【嵌牛提问】Verilog HDL的基本语句都有哪些?

【嵌牛正文】

1.过程语句

Verilog中有两种结构化过程语句:initial和always语句,是行为建模的两种基本语句,所有的行为语句只能出现在这两种结构化过程语句里。

每个initial语句和always语句代表一个独立的执行过程(或过程块)。

一个模块可以包含多条always语句和多条initial语句。每条语句启动一个单独的控制流。每条语句都在0时刻开始并行执行。

这两种语句不能嵌套使用。Verilog本质上是并发的,这些块并发执行,而不是顺序执行。

initial语句

initial语句指定的内容只执行一次 ,initial语句主要用于仿真测试,不能进行逻辑综合。

initial语句的格式如下:


举例说明:memory存储器初始化


在这个例子中用initial语句在仿真开始时对各变量进行初始化,注意这个初始化过程不需要任何仿真时问,即在时间内,便可以完成存储器的初始化工作。



下面是用modelsim仿真出来的结果:


一个模块中若有多个initial块,则它们同时并行执行。

块内若有多条语句,需要用begin和end将它们组合,一条语句则不需要。

initial块常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。

always语句

always块内的语句是不断重复执行的,在仿真和逻辑综合中均可使用。

always块的语句是否执行,要看它的触发条件是否满足。如满足则运行过程块一次;如不断满足,则不断地循环执行。

声明格式如下:

always <时序控制> <语句>

always语句由于其不断活动的特性,只有和一定的时序控制结合在一起才有用。

举例:

always clk = ~clk; //这是一个死循环

但如果加上时序控制,以上这个always语句将变为一条非常有用的描述语句:

always #half_period clk = ~clk;

则生成了一个周期为2* half_period的无限延续的信号波形。当经过half_period时间单位时,时钟信号取反,在经过half_period时间单位,就再取反为一个周期。

敏感信号表达式:

always语句的时序控制可以使用事件表达式或敏感信号列表,即当表达式中变量的值改变时,就会引发块内语句的执行。其形式为:


敏感信号表达式中应列出影响块内取值的所有信号。

always的时间控制可以是沿触发也可以是电平触发的,可以单个信号也可以多个信号,中间需要用关键字or连接。


Verilog中,用always块可以设计组合逻辑电路和时序电路。注意一些问题是:

在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出;而且将块的所有输入都列入敏感表是很好的描述习惯。

always @ (a or b or c)

e = a & b & c;

如果在赋值表达式右端引用了敏感信号列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。


always中if语句的判断表达式必须在敏感电平列表中列出。



Verilog中,用always块设计时序电路时,敏感列表中包括时钟信号和控制信号。

always @ ( posedge clk or negedge clr)


每一个always块最好只由一种类型的敏感信号触发,而不要将边沿敏感型和电平敏感型信号列在一起。

如果组合逻辑块语句的输人变量很多,那么编写敏感列表会很烦琐并且容易出错。针对这种情况,Verilog提供另外两个特殊的符号:@*和@(*),它们都表示对其后面语句块中所有输入变量的变化是敏感的。


边沿触发:

在同步时序逻辑电路中,触发器状态的变化仅仅发生在时钟脉冲的上升沿或下降沿,Verilog HDL提供了posedge(上升沿)与negedge(下降沿)两个关键字来进行描述。

电平敏感时序控制:

前面所讨论的事件控制都需要等待信号值的变化或者事件的触发,使用符号@和后面的敏感列表来表示。

Verilog同时也允许使用另外一种形式表示的电平敏感时序控制(即后面的语句和语句块需要等待某个条件为真才能执行)。Verilog语言用关键字wait来表示等待电平敏感的条件为真。


多always语句块

一个模块中可有多个always语句;

每个always语句只要有相应的触发事件产生,对应的语句就执行;

与各个always语句书写的前后顺序无关,它们之间是并行运行的。

always和initial并存:

在每一个模块(module)中,使用initial和always语句的次数是不受限制的。

initial和always块不能相互嵌套。

每个initial和always块的关系都是并行的,所有的initial语句和always语句都是从0时刻并行执行。

例如:

学习了Verilog语法中两种最重要的结构语句initial和always。 需要牢记的是:

一个程序模块可以有多个initial和always过程块。

每个initial和always说明语句在仿真的一开始便同时立即开始运行。

initial语句在模块中只执行一次。

always语句则是不断地活动着。直到仿真过程结束。

always语句后跟着的过程块是否运行,则要看它的触发条件是否满足,如满足则运行过程块一次,再次满足则再运行一次,循环往复直至仿真过程结束。

always的时间控制可以是沿触发也可以是电平触发的,可以单个信号也可以多个信号,中间需要用关键字or或“,”连接。

沿触发的always块常常描述时序行为,如有限状态机。而电平触发的: always块常常用来描述组合逻辑的行为。

2.块语句

在Verilog HDL描述逻辑功能中,当操作需要多条Verilog HDL语句才能描述时,这时就需要用块语句将多条Verilog HDL语句复合在一起。

begin–end 串行块

begin ……end之间可以添加多条语句,并且语句是按照出现的顺序执行的。

如果语句前面有延时符号“#”,那么延时的长度相对于前一条语句而言的。

由begin ……end构成的块语句形式为:


其中可以在begin后声明该块的名字,一个标识名。块内声明语句可以是参数声明语句、reg型变量声明语句、integer型变量声明语句和real 变量声明语句。

顺序块(串行块)有以下特点:

(1)块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。

(2)每条语句的延迟时间是相对于前一条语句的仿真时间而言的。

(3)直到最后一条语句执行完,程序流程控制才跳出该语句块。

fork–join并行块

fork–join之间可以添加多条语句,并且语句的关系是并行的,是同时执行的。

如果语句前面有延时符号“#”,那么延时的长度是相对于fork ……join块开始时间而言的。即块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的。

当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。

块名即标识该块的一个名字,相当于一个标识符。

块内说明语句可以是参数说明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句和事件(event)说明语句。

起始时间和结束时间

在并行块和顺序块中都有一个起始时间和结束时间的概念。

顺序块起始时间就是第一条语句开始被执行的时间,结束时间就是最后一条语句执行完的时问。

而对于并行块来说,起始时间对于块内所有的语句是相同的,即程序流程控制进入该块的时间,其结束时间是按时间排序在最后的语句执行结束的时间。

3.赋值语句

两种赋值方法:连续赋值(Continuous Assignment), 过程赋值(Procedural Assignment)。

过程赋值:阻塞赋值(Blocking Assignment),非阻塞赋值(Nonblocking Assignment)。

连续赋值

连续赋值

连续赋值常用于数据流行为建模。

连续赋值语句,位于过程块语句外,常以assign为关键字。

它只能为线网型变量赋值,并且线网型变量也必须用连续赋值的方法赋值。

注意:只有当变量声明为线网型变量后,才能使用连续赋值语句进行赋值。

语句格式: assign 赋值目标线网变量 = 表达式

特点

连续赋值语句中“=”的左边必须是线网型变量,右边可以是线网型、寄存器型变量或者是函数调用语句。

连续赋值语属即刻赋值,即赋值号右边的运算值一旦变化,被赋值变量立刻随之变化。

assign可以使用条件运算符进行条件判断后赋值。

过程赋值

过程赋值

多用于对reg型变量进行赋值,这类型变量在被赋值后,其值保持不变,直到赋值进程又被触发,变量才被赋予新值。

过程赋值主要出现在过程块always和initial语句内。

分为阻塞赋值和非阻塞赋值两种,它们在功能和特点上有佷大不同。

非阻塞赋值

(1)非阻塞(Non_Blocking)赋值方式

操作符: “<=”;非阻塞赋值符“<=”与小于等于符“<=”看起来是一样的,但意义完全不同。

其基本语法格式如下:

寄存器变量(reg) <= 表达式/变量;

如 b <= a;

非阻塞赋值在整个过程块结束后才完成赋值操作。即在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;

在语句块中,连续的非阻塞赋值操作是同时完成的,即在同一个顺序块 中,非阻塞赋值表达式的书写顺序,不影响赋值的结果。



在clk的上升沿,将data的值赋给reg_c,同时将reg_c原来的值(不是data)赋值给reg_d。即:上面语句所赋的变量值不能立即就为下面的语句所用,要等到过程块结束,同时并行赋值。

阻塞赋值

(2)阻塞(Blocking)赋值方式

操作符: “ = ”

基本语法格式如下:

寄存器变量(reg) = 表达式/变量;

如 b = a;

阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该条语句结束后立刻改变。

如果在一个块语句中有多条阻塞赋值语句,那么写在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了(blocking)一样,因而被称为阻塞赋值。

连续的阻塞赋值操作是顺序完成的。




为了避免出错,在同一个always块内,最好不要将输出再作为输入使用,为了用阻塞赋值方式完成与上述非阻塞赋值同样的功能,可采用两个always块来实现,如下所示。

在下面的例子中,两个always过程块是并发执行的。


总的来说,多条阻塞赋值语句是顺序执行的,而多条非阻塞语句是并行执行的.

在使用always块描述组合逻辑(电平敏感)时使用阻塞赋值,在使用always块描述时序逻辑(边沿敏感)时使用非阻塞赋值。建立latch模型时,采用非阻塞赋值语句。在一个always块中同时有组合和时序逻辑时,采用非阻塞赋值语句。

不要在同一个always块内同时使用阻塞赋值和非阻塞赋值。

无论是使用阻塞赋值还是非阻塞赋值,不要在不同的always块内为同一个变量赋值。因为佷难保证不会引起赋值冲突。

阻塞语句,如果没有写延迟时间看起来是在同一时刻运行,但实际上是有先后的,即在前面的先运行,然后再运行下面的语句,阻塞语句的次序与逻辑行为有很大的关系。

而非阻塞的就不同了,在begin-end之间的所有非阻塞语句都在同一时刻被赋值,因此逻辑行为与非阻塞语句的次序就没有关系。在硬件实现时这两者有很大的不同。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容