0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从零开始学FPGA-Verilog语法基础(中)

电子工程师 来源:FPGA设计论坛 作者:FPGA设计论坛 2021-03-14 10:16 次阅读

我们接着上篇文章继续学习,上次提到了两种赋值语句,让我们接着往下学。

1、块语句

块语句包括两种,一个是顺序块,一个是并行块。

(1)顺序快

顺序快就好比C语言里的大括号“{ }”,在Verilog语法中,用begin…end代替。这里只需要知道,在begin…end中间的语句是顺序执行的就行了。

(2)并行块

并行块可以算是一个新的知识点,与顺序块最大的不同就是并行块中的语句是同时开始执行的,要想控制语句的先后顺序,可以加延时语句控制。这种并行块是用fork…join语句描述。

2、条件语句

条件语句这里不说,和C语言一样。就说一点主意事项。

在使用条件语句时,要注意语句的严整与封闭性。和C语言不同,举个例子

always @(al or d)

begin

if(al==1) q=d;

end

这个例子是说,当al上升沿到来时,d的值赋给q,那么当al=0时又是什么情况呢,事实上,在always块中,如果没有给变量赋值,这个变量就会保持原值,也就是生成了一个锁存器。为了避免这种情况的发生,我们一般这样写

always @(al or d)

begin

if(al==1) q=d;

else q=0;

end

同样在case语句中也要加上default语句避免锁存器的生成,这样可以使设计者更加明确的设计目标,也提高了程序的可读性。

3、case语句

case语句要注意几点,只挑几点重要的,其他的不说了

(1)case语句分项后的表达式的值必须相同,否则就会出现问题,例如上面图片上的result。

(2)与C语言不同,与某一项case语句匹配后,就会跳出case语句,这里没有break语句。

(3)case语句的所有表达式位宽必须相等,例如上图都是16位整型,如果不加以说明,系统会以默认值32位控制表达式位宽。

下面是case,casez,case语句的真值表

bcba498a-8434-11eb-8b86-12bb97331649.jpg

这个表其实还是很好记的

case语句,只有匹配才出“1”

casez语句除了匹配出“1”之外,另外只要遇到“z”就出“1”

case语句除了匹配出“1”之外,另外只要遇到“z”或“x”就出“1”

上图就用到了casez语句来处理不必要考虑的值,这样就可以灵活的设置对信号的默写位进行比较。

下面写了一个小例子来练习一下

使用case语句实现一个四选一多路选择器

module xiaomo(a1,a2,a3,a4,out,s1,s2);

input a1,a2,a3,a4;

input s1,s2;

reg out; //把输出变量声明为寄存器类型

always @(s1 or s2 or a1 or a2 or a3 or a4 or out) //任何信号的变化都会引起输出变量的重新计算

begin

case ({s1,s2}) //位拼接运算

2‘b00: out=a1;

2’b01: out=a2;

2‘b10: out=a3;

2’b11: out=a4;

default: out=1‘bx; //保持语句的严整性

endcase

end

endmodule

4、循环语句

Verilog语法**有4中循环语句,这里只简单说一下C语言里没有的两种

(1) forever语句

连续执行语句,这种语句主要用在产生周期性的波形,用来做仿真信号。个人理解和always语句差不多的功能,但是,forever语句只能用在initial块中。

(2)repeat 语句后面接常量表达式,可以指定循环次数,例如;

repeat (8)

begin

end

表示循环8次相应语句。

5、顺序块和并行块

所谓顺序块就是前面说的begin…end,他的作用就是把多条语句组合到一起执行,在顺序块里面,语句是一条一条顺序执行的,如果遇到#10延迟语句,延迟也是相对于上一条语句的延迟,这一点比较重要。

相对于顺序块的就是并行块,用fork…end语句表示,并行块里的语句是同时执行的。

顺序块和并行块可以嵌套使用。

如果在begin或者fork语句后面加上名字,这个块语句就成了命名块,例如

begin :xiaomo

……

end

命名块有什么好处呢?有了命名块,我们就可以用verilog提供的disable语句来随时终止命名块,例如disable xiaomo;这样,当程序运行到此时,就会禁用命名块,就会直接跳出块语句,相当于C语言里面的break语句一样,看下面这个例子:

6、生成块

生成块语句可以动态的生成Verilog代码,这一声明语句方面了参数化模块的生成。党对矢量中的多个位进行重复操作时,或者进行多个模块的实力引用时,或者在根据参数的定义来确定程序中是否应该包括末端Verilog代码的时候,使用生成语句能够大大简化程序的编写过程。

生成语句可以控制变量的声明、任务或函数的调用,还能对实力引用进行全面的控制。编写代码时必须在模块中说明生成块的实例范围,关键字 generate…endgenerate用来指定该范围。

Verilog中有三种生成语句的方法,分别是循环生成,条件生成和case生成。

(1)循环生成

注:genvar 是关键词,用于生成生成变量,生成变量只存在于生成块中,在确立后的方针代码中,生成变量是不存在的。

xor_loop是赋予生成语句的名字,目的在于沟通它对循环生成语句之中的变量进行层次化引用。因此循环生成语句中的各个异或门的相对层次为:xor_loop[0].gl,xor_loop[1].gl…,xor_loop[31] 这句话什么意思啊

这个例子中的 xor gl (out [ j ] , i0 [ j ], i1 [ j ] );什么意思??求大神指点

当然这个异或门还可用always块实现

生成块程序

generate

for (j=0;j

begin :xiaomo

always @(i0[ j ] or i1[ j ]) out [ j ]=i0[ j ]^i1[ j ];

end

endgenerate

(2)条件生成

(3)case生成

下面是一个例子使用case语句生成N位的加法器

说实话上面这些东西我自己也是看的模模糊糊,好多地方不懂,只能先截个图放这儿了。唉。..基础还是不行啊。..

7、结构语句

(1)initial语句比较简单,这里就不多说了。

(2)always语句

always语句在仿真过程中是不断活动的,always语句后面的语句是否执行,这要看always语句是否满足触发条件。因此,always语句只有和时序控制语句结合才能使用,否则就会被死锁。例如:always areg=~areg;

这个always语句生成一个0延迟的无限跳变过程这时会发生死锁。但是一旦加上时序控制,这条语句就不一样了,例如:

always #10 areg=~areg;

这样的语句就描述的一个周期为20毫秒的跳变信号。所以我们常用这种方法来描述时钟信号,并作为激励信号来测试硬件电路。

看下面这个例子

reg [7:0] counter;

reg tick;

always @(posedge areg)

begin

tick=~tick;

counter=counter+1;

end

这个例子就是说每当信号areg上升沿到来时,信号tick取反,计数器counter加一,这种时间控制是always语句最常用的。

always语句的时间控制模板

如果组合逻辑块语句的输入变量过多容易漏掉,例如:

always @(a or b or c or d or e)

这样的情况下可以用always@ (*)语句来代替,*号自动将所有输入变量默认为敏感信号。

上面所讨论的都是等待信号的值发生变化或者触发时才执行相应语句,我们也可以用wait语句来用电平敏感来控制。例如

always

wait (count_enable) #20 count=count+1;

意思就是说,当count-enable的值为1时,程序延迟20毫秒后计数。

8、任务与函数

书上写了关于任务与函数的区别,写了好多,我觉得区别这两个概念主要看一点就够了,就是看有没有返回值,函数有,任务没有。举个例子

switch_bytes (old_bytes,new_bytes);这是个任务,没有返回值,功能是把新旧两个字节互换位置。

new_bytes=switch_bytes(old_bytes);这是个函数,功能是把旧字节转换后赋值给新字节。有返回值。

下面写一个交通信号灯的程序来学习一下任务这个概念

moudle xiaomo_traffic;

reg clock,red,green,amber;

//定义时钟,红灯,黄灯,绿灯

parameter on=1,off=0,red_tics=350.amber_tics=30,green_ics=200;

//定义红灯等待350个时钟,黄灯等待30个时钟,绿灯等待200个时钟

initial red=0;

initial green=0;

initial amber=0;

//初始化,这里用initial语句保证三条语句同时执行

always

begin

red=on; //红灯亮

light (red,red_tics); //这里用到任务,功能是等待350个时钟的时间,声明看下面程序

amber=on; //黄灯亮

light (amber,amber_tics); //等待30个时钟

green=on; //绿灯亮

light (green,green_tics); //等待200个时钟

end

task:light; //命名任务

output color;

input [31:0] tics;

//注意这里的两个变量要与上面的一一对应,也就是说上面的light(red,red_tics);中的red对应color,red_tics对应tics

begin

repeat(tics); //重复执行tics次下面的语句

@(posedge clock); //等待上升沿,因为这里的tics对应上面的red_tics几个,所以这里要等待相应个上升沿

color=off; //等到相应个上升沿结束时,相应颜色的灯关闭

end

endtask

//下面就是写时钟函数了,用always块

always

begin

#100 clock=0;

#100 clock=1; //每100毫秒产生一次跳变

end

endmoudle

注意:这个程序要找对一一对应关系,例如脉冲模块里的clock对应posedge clock中的clock,程序行与行之间是有联系的,不能随便声明。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5027

    浏览量

    117711
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128438
  • 加法器
    +关注

    关注

    6

    文章

    174

    浏览量

    29729

原文标题:零基础学FPGA-Verilog语法中

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    fpga是用c语言还是verilog

    FPGA(现场可编程逻辑门阵列)开发主要使用的编程语言是硬件描述语言(HDL),其中Verilog是最常用的编程语言之一。而C语言通常用于传统的软件编程,与FPGA的硬件编程有所区别。
    的头像 发表于 03-27 14:38 300次阅读

    Verilog 模块基本结构

    verilog极简语法手册
    发表于 10-23 09:28 0次下载

    从零开始操作STM8寄存器

    电子发烧友网站提供《从零开始操作STM8寄存器.pdf》资料免费下载
    发表于 10-07 16:02 0次下载
    <b class='flag-5'>从零开始</b>操作STM8寄存器

    从零开始ARM》个人看法

    的进步, 感觉自己以前的的汇编都不太一样了. 本书没完全看完, 更不要说看懂.以我现在的水平看懂有点难度.后期会多看几遍多实践下. 就现在的观点谈谈个人一点看法和一些建议. 本书讲解的很基础,每个指令
    发表于 09-08 11:53

    从零开始ARM》+ARM技术的深耕与思考

    本书特点 一是循序渐进,由浅入深。本书针对基础的初学者,以FS4412开发板(基于ARMCortex-A9架构)为例,首先从开发环境的安装和配置及ARM基本指令等相关基础知识开始讲解,然后详细
    发表于 09-03 20:56

    从零开始ARM》真心适合新手小白

    ARM架构一直以来都备受欢迎,无论是在移动设备、嵌入式系统还是服务器领域。然而,对于初学者而言,ARM架构可能显得复杂而晦涩。《从零开始ARM》这本书为初学者提供了一个理想的学习起点,帮助他们逐步
    发表于 09-02 15:29

    【每日一练】参与FPGA技术社区每日学习,轻松掌握Verilog语法

    活动介绍: 每日一练活动主要针对 Verilog 入门常用语法及常用技巧的练习,30个关于语法练习的题目,每天更新一个题目及公布前一天的参考答案及相关解析 活动规则: 每日一练活动结束后,根据参与
    发表于 08-01 10:37

    怎么解决verilog和system verilog语法亮亮的问题呢?

    在创建一个linux系统的时候,安装完gvim,系统默认的gvim的模式是白色背景,黑色字体,无语法亮亮。打开一个python脚本大概是下面这种效果。
    的头像 发表于 07-26 17:37 683次阅读
    怎么解决<b class='flag-5'>verilog</b>和system <b class='flag-5'>verilog</b><b class='flag-5'>语法</b>亮亮的问题呢?

    verilog可综合的语法子集

    可综合的语法是指硬件能够实现的一些语法,这些语法能够被EDA工具支持,能够通过编译最终生成用于烧录到FPGA器件中的配置数据流。
    的头像 发表于 07-23 12:25 805次阅读

    从零开始点亮CW32L052的LED灯

    从零开始创建LED灯工程
    的头像 发表于 07-12 07:54 603次阅读
    <b class='flag-5'>从零开始</b>点亮CW32L052的LED灯

    从仿真器的角度理解Verilog语言2

    要想深入理解Verilog就必须正视Verilog语言同时具备硬件特性和软件特性。在当下的教学过程中,教师和教材都过于强调Verilog语言的硬件特性和可综合特性。将Verilog语言
    的头像 发表于 05-25 15:10 625次阅读
    从仿真器的角度理解<b class='flag-5'>Verilog</b>语言2

    从仿真器的角度理解Verilog语言1

    要想深入理解Verilog就必须正视Verilog语言同时具备硬件特性和软件特性。在当下的教学过程中,教师和教材都过于强调Verilog语言的硬件特性和可综合特性。将Verilog语言
    的头像 发表于 05-25 15:10 673次阅读
    从仿真器的角度理解<b class='flag-5'>Verilog</b>语言1

    FPGA编程语言之verilog语法2

    Verilog HDL是一种用于数字系统设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型也称为模块。Verilog HDL既是一种行为描述的语言
    的头像 发表于 05-22 15:53 563次阅读
    <b class='flag-5'>FPGA</b>编程语言之<b class='flag-5'>verilog</b><b class='flag-5'>语法</b>2

    FPGA编程语言之verilog语法1

    Verilog HDL是一种用于数字系统设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型也称为模块。Verilog HDL既是一种行为描述的语言
    的头像 发表于 05-22 15:52 592次阅读
    <b class='flag-5'>FPGA</b>编程语言之<b class='flag-5'>verilog</b><b class='flag-5'>语法</b>1

    FPGA开发环境的搭建和verilog代码的实现

    FPGA需要良好的数电模电基础,verilog需要良好C语言基础。
    发表于 05-22 15:04 505次阅读
    <b class='flag-5'>FPGA</b>开发环境的搭建和<b class='flag-5'>verilog</b>代码的实现