打印
[FPGA]

关于编写verilog代码的小心得

[复制链接]
19265|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 咕咕呱呱孤寡 于 2024-11-16 10:14 编辑

#技术资源# @21小跑堂       #申请原创# @21ic小管家
随着计算机技术、通信技术及微电子技术的飞速发展,现代电子产品已经渗透到生产和生活的各个领域,其中EDA技术发挥了举足轻重的作用。应用FPGA来实现数字系统设计,是目前应用EDA技术设计数字系统的潮流,数字系统设计的理论和方法也在不断地发展和变化。

在大学期间我曾接触过FPGA课程,学习了解了关于数字系统设计的相关知识,在后期也是在课程实验中,做了基于FPGA使用Verilog HDL语言实现多路电压采集的实验。
关于编写Verilog HDL代码,我有以下一些心得看法:
首先,我们需要了解什么是数字系统设计,数字系统是指用来处理逻辑信息,并且对数字信号进行加工、传输和存储的电路实体。其结构包括数据处理器和控制器。而数字系统设计就是将多个数字电路的功能模块有机地组织成一个电子系统,在控制电路控制下,实现数据处理,包括数据信息的存储、传输等功能。
传统的设计方法是由下向上进行设计,最后形成的主要文件是电原理图,而现代方法是自上而下设计,将数字系统划分若干个子系统模块,对每个模块进行细化设计,这里就需要用到我们所需要的编程方式Verilog HDL语言编写程序。
Verilog语言是硬件电路设计常用的描述语言(HDL),用HDL语言的源程序作为归档文件有很多好处:一是资料量小,便于保存;二是可继承性好,当设计其它硬件电路时,可以使用文件中的某些库、进程和过程程序;三是阅读方便,阅读程序很容易看出某一硬件电路的工作原理和逻辑关系,而阅读电原理图,推知其工作原理需要较多的硬件知识和经验,而且看起来也不那么一目了然。如果需要,也可以将HDL语言编写的源程序转换成电原理图形式输出。
在了解了大背景的情况下,需要再次了解学习的就是Verilog语言的基本结构,HDL程序的结构都是以模块化构成的,其大框架结构开头以module为首,结尾以endmodule为尾,模块架构就成型。其具体结构为下:
module 模块名(<输入、输出端口列表>)
端口说明;
input 输入端口;
output 输出端口;
inout 输入/输出端口;
信号类型说明
wire
reg
parameter
逻辑功能描述
assign
always
······
endmodule
在了解了HDL程序结构后,需要掌握其设计时的结构要求,例如:

①Verilog HDL程序是由模块构成的。每个模块包含在module和endmodule中。
②每个Verilog HDL源文件中只有一个顶层模块,其他为子模块。可以每个模块写一个文件。
③每个模块要进行端口说明,说明输入输出端口,然后对模块的功能进行逻辑描述。
④模块中的时序逻辑部分在always块的内部,在always块中只能对寄存器变量赋值。
⑤模块中对端口或其他wire型变量的赋值,必须在always块的外部使用assign语句,通常是将寄存器的值送出。
⑥程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。
⑦除了endmodule语句、begin_end语句和fork_join语句外,每个语句和数据定义的最后必须有分号。
⑧可用/*.....*/和//...对程序作注释。加上必要的注释,可以增强程序的可读性和可维护性。

其次需要学习HDL语言的数据类型及变量常量、运算符以及语法等相关基础设计语言知识,初步进行简单HDL语言的编写,例如以下示例:

module AND4(a,b,out);
output [3:0] out;  //4位输出
input [3:0] a,b;    //4位输入a和b
assign out=a&b; //out=a与b进行按位与
endmodule

示例中AND4是模块名称,该程序主要功能为实现四位数据的按位与运算,从模块的声明开始,最开始就是关键字module ,最后是endmodule。

HDL语言中的一些运算符和语法与C语言中有相似之处,在学习过程中,大家也可以自行结合去理解,更有利于掌握。

基础掌握完成后,了解掌握HDL语言的描述方式,Verilog HDL是一种专门用于数字系统设计的语言,它有三种描述方式,即结构描述方式、数据流描述方式和行为描述方式。在Verilog HDL内部定义了12个基本门级元件模型,引用这些基本门级元件对逻辑电路进行描述,称为门级描述,Verilog HDL门级描述属于结构描述方式。Verilog HDL规定门级元件的输出端口、输入端口必须为线网类型的变量。每个门的输入值为逻辑0、逻辑1、不确定态x和高阻态z四个值之一。当使用这些元件进行逻辑仿真时,仿真软件会根据程序的描述立即给门的输出赋值。简单来说,HDL的门级结构描述很像C语言中的与或非。而数据流描述使用的是连续赋值语句,由关键字assign开始,后面跟着由操作数和运算符等组成的逻辑表达式。另外,行为描述方式是将电路的功能和算法以比较抽象的形式描述出来。主要使用由关键字initial或always定义的两种结构类型的描述语句。initial是一条面向仿真的过程语句,不能用来描述硬件逻辑电路的功能。行为描述方式既适合于设计时序逻辑电路,也适合于设计组合逻辑电路。
结构级的描述在仿真时要优于行为描述,而行为描述在进行综合时更优越一些。在电路规模较大或描述较复杂时序关系时,使用行为描述更有效。
在使用过程中,我觉得门级结构描述方式最好理解,数据流要掌握相应的语句结构也有利于学习,行为描述方式使用的不多,需要不断巩固了解。

在了解了相关的语言知识后,我们学习时是以Xilinx Vivado软件工具进行语言编程平台进行系统学习

以下列出当时做设计的一些成果图:





在我学习的过程中,我认为,掌握好基础才是最重要的,根据一些简单的模块设计,首先去了解一下Verilog HDL语言的结构,再从小模块中进行填充学习,不能好高骛远,循序渐进才能提升自己的编程水平能力。


使用特权

评论回复
沙发
wanduzi| | 2024-9-29 20:46 | 只看该作者
微芯也有FPGA啊?

使用特权

评论回复
板凳
咕咕呱呱孤寡|  楼主 | 2024-9-30 08:53 | 只看该作者
wanduzi 发表于 2024-9-29 20:46
微芯也有FPGA啊?

有的有的

使用特权

评论回复
地板
21mengnan| | 2024-9-30 11:58 | 只看该作者
想学,不知道难不难啊。

使用特权

评论回复
5
单片小菜| | 2024-9-30 13:54 | 只看该作者
这个很难学,没有弄明白。

使用特权

评论回复
6
自己造声卡| | 2024-9-30 14:13 | 只看该作者
这个很难学会

使用特权

评论回复
7
哈根达斯uz| | 2024-9-30 15:44 | 只看该作者
应用FPGA来实现数字系统设计

使用特权

评论回复
8
咕咕呱呱孤寡|  楼主 | 2024-10-8 09:09 | 只看该作者
21mengnan 发表于 2024-9-30 11:58
想学,不知道难不难啊。

基本构架基础的话我觉得能掌握

使用特权

评论回复
9
Chad1989| | 2024-10-14 15:24 | 只看该作者
刚开始搞不懂模块,随便瞎写,反正能跑,几年之后自然懂了

使用特权

评论回复
10
咕咕呱呱孤寡|  楼主 | 2024-10-14 16:50 | 只看该作者
Chad1989 发表于 2024-10-14 15:24
刚开始搞不懂模块,随便瞎写,反正能跑,几年之后自然懂了

是的是的,慢慢摸索出来的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

1832

帖子

2

粉丝