原创 FPGA学习手记(二) 简单功能仿真及Verilog基础电路设计

2011-7-30 10:51 4769 10 11 分类: FPGA/CPLD

FPGA学习手记(二) 简单功能仿真及Verilog基础电路设计

看了某兄的一篇文章,讲到学FPGA切不可急功近利,大概是受到STM32C语言库快速入门的影响,在学习FPGA时,给自己制定了学习方针如是:掌握FPGA开发的一般流程 学习基本外设的设计方法 NIOS II硬件系统的搭建→设计并DIY简单的项目 ……

回首而顾,这不正是急功近利的典型例子?在经历了漫长的综合编译并成功在开发板上搭建NIOS II以后,发现自己并没有学会什么,自己不过是在将FPGA一步步转化成MCU来用。为了防止这弯路越走越深,开始学习基础的电路设计知识和Verilog用法,同时翻出了尘封已久的数电书(阿杜一定恨死朱红了,哈哈)。之后准备再了解一下Quartus下的仿真,以及Modelsim,如果没有用好仿真工具,也是会平添许多麻烦的。

把共性的东西用好以后再解决特性的问题,当然不能离开实际,在学的过程中动手操作。在余秋雨先生看来,读万卷书、行往里路就是要拿自己的理性与考察看待只是和脚下的路的关系,看时间与空间的关系,再反观书中谢谢是对的,那些没有写好。我很佩服这样的观点,现在做工程与搞理论的,如果埋头行路或是塞听读书,大概都是没有前途的吧。呵呵,又扯远了……

在学习电路之前,有必要先补充一些东西,即Quartus II的集成的一些非常实用的功能。

 

一、Netlist Viewers

还是以上一次的HelloFPGA为例,Quartus II除了提供HDL语言的开发环境,还提供了Netlist Viewers工具便于通过可视化界面直观的理解HDL语言在各层的表现形式(如寄存器传送级)。

Netlist Viewer工具包括RTL ViewerTechnology Map ViewerState Machine Viewer三种,其位置在Task栏中,可分别通过双击相应的图标获取该视图。也可在工具栏的ToolsNetlist Viewers中找到。

20110730104509001.jpg

 

其中RTL Viewer可生成寄存器传送级电路,双击RTL Viewer,可看到RTL视图如下:

20110730104510002.jpg

 

由于这个模块的逻辑结构十分简单,只是将按键信号取反控制LED,基本不需要可视化图形的帮助就能理解,但是一些复杂的工程就需要这些工具的辅助。通过左侧的Hierarchy栏,可以将了解每一层的组成。

20110730104510003.jpg

 

RTL只相当于一种中间形式的描述结构,而Technology Map Viewer描述了代码综合后的实际电路结构,由于本例的结构十分简单,所以和实际电路形式与RTL视图相同。下面是一个四路选择器的Technology Map视图,内部结构已经展开:

20110730104510004.jpg

 

我们可以看到,组合逻辑电路都是靠逻辑门的组合实现的,而这就是PLD器件的基本原理:所有组合逻辑都可以靠逻辑门电路加以实现,而所有时序电路可以靠触发器和逻辑门电路实现。

State Machine Viewer用于状态机,以后用到了再说。了解Verilog代码对应的RTL和硬件结构对于FPGA使用者来说十分重要,毕竟FPGA不仅仅是在使用语言和编写代码,而是在设计实际的硬件。

 

二、简单功能仿真

仿真的作用不消我说,这里说一下不用TestBench的简单功能仿真。通过点击 20110730104510005.jpg 新建一个波形文件,保存为HelloFPGA.vwf

20110730104511006.jpg

 

在左侧的空白处点击右键,选择Insert Node or Bus,插入要仿真的信号。

20110730104511007.jpg

 

这里可以直接输入信号名称,我们选择Node Finder,使用查找工具。

20110730104512008.jpg

 

Filter可以设置查找过滤,点击List显示可用的信号节点,通过下面的箭头选择要仿真的信号节点。

20110730104512009.jpg

 

一路OK后,选中输入信号Key,这时候可以在右侧Key的时间轴中拖动选中一段时间,通过左侧工具栏进行置0、置1等操作。这里选择 20110730104512010.jpg Key设置成时钟信号。

20110730104512011.jpg

 

这里将信号终止时间设置为1us,将时钟周期设置为100ns

20110730104513012.jpg

 

Key信号就被设置成了一个周期100ns的时钟信号。

20110730104513013.jpg

 

确认一下没有选择第三方的仿真工具,如下图。点 20110730104513014.jpg 对工程进行编译,再点 20110730104513015.jpg 进行仿真。

20110730104514016.jpg

 

仿真结果如下,可以看到,LED信号对于Key信号会有延时存在延时。

20110730104514017.jpg

 

通过Zoom选项放大缩小视图,在空白处右键选择Insert Time Bar插入时间条,将两个时间条拖到相应位置,可以看到延时为10ns左右。当然了,这个仿真工具只能在功能上验证波形的正确与否,更加复杂的仿真需要通过第三方工具来进行。

20110730104515018.jpg

 

另外,仿真工具栏常用的功能如下,可以自己琢磨一下:

20110730104515019.jpg

 

三、基础电路设计

这里所说的基础电路,是数电中的基本组合逻辑及时序电路。这次先开个头,说多了太勤快显得我名不副实……

 

1.全加器

这是一个全加器模块,a_inb_in为加数,c_in为输入进位,sum为加和, c_out为输出进位。根据全加器的真值表,以及K图等方式,化简后可以得到逻辑关系(化简结果不唯一):

SUM=A⊕BCin

Cout=AB+BC+CA

 

数电忘光光的童鞋可以回去翻书了,呵呵,懒兔不再赘述。其真值表如下:

A

B

Cin

Sum

Cout

0

0

0

0

0

0

0

1

1

0

0

1

0

1

0

0

1

1

0

1

1

0

0

1

0

1

0

1

0

1

1

1

0

0

1

 

module FULLADD(a_in, b_in, c_in, sum, c_out);

input a_in,b_in,c_in;

output sum,c_out;

 

assign sum = a_in ^ b_in ^ c_in;

assign c_out = (a_in & b_in) | (b_in & c_in) | (a_in & c_in);

 

endmodule

 

可以看到,其RTL视图是通过与上述逻辑关系式相同的逻辑来表述代码的,但是这样的描述非常不直观,而且需要先行计算逻辑关系表达式。

20110730104516020.jpg

我觉得,其实采用下面的方式,将逻辑关系式替换成三个1位二进制数直接相加,产生的进位和加和通过{ }符号连接起来,高位在前。

assign sum = a_in ^ b_in ^ c_in;

assign c_out = (a_in & b_in) | (b_in & c_in) | (a_in & c_in);

 

assign {c_out,sum}=a_in+b_in+c_in;

 

这样得到的RTL结果如下,代码被描述成两个加法器,然而经过综合编译后,其硬件组成和上面的表达方法是完全相同的,也就是说Quartus II自动进行了转换和化简。

20110730104516021.jpg

 

下面是一个N位全加器的代码,其中N通过WIDTH定义,这里定义为8位。采用parameterdefine的方式,可以增加代码的可读性和复用性,这和C是一样的。

module FULLADD(a_in, b_in, c_in, sum, c_out);

 

parameter WIDTH = 8;

 

input[WIDTH-1:0] a_in,b_in;

input c_in;

output[WIDTH-1:0] sum;

output c_out;

 

assign {c_out,sum}=a_in+b_in+c_in;

 

endmodule

 

RTL视图,只是数据线宽改变了:

20110730104516022.jpg

 

仿真结果,结果正确性没的说,只是输出数据之间存在毛刺一样的波形,放大后发现是不正确的数据,一般我们认为这是竞争冒险导致的,然而jlx_cuc君则不这么认为,本着做学问的态度,有兴趣的朋友可以看看,传送门由简单的加法器揭秘FPGA底层实现

20110730104516023.jpg

 

嗯嗯,先到这里吧,今天起的太早了,啊呜~~~

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户245457 2015-10-23 16:55

看了就留下痕迹
相关推荐阅读
用户412852 2011-10-20 19:41
VGA输出接口电路设计
不知道是在学校学的东西多还是走出来了学的多,据说楷哥就是嫌工作阻碍了自己的进步才回去读研的,而大多数人还是参加了工作才发现自己以前什么都不会的吧。总之知识离了实践便百无一用,作为多数派中的一员,还...
用户412852 2011-10-19 23:21
MSP430户外运动环境监测仪(含完整原理图、PCB工程及测试软件)
消失了好长时间了,回来写点东西。虽然兔子很懒还有些散漫,不过这段时间的消失绝不是在家睡大觉或打游戏度过的。8月份入职的时候没想到竟然要参加军训,于是被拉到昌平的山脚下封闭训练了二十多天。那是一段教官就...
用户412852 2011-08-05 11:26
VB.NET开发全功能串口调试助手 (含完整工程)
小记:VB.NET的串口通信用了很长时间了,也只用Write和Read这样的方法,以前都是用这种方式做上位机软件,如此足矣。而前几天研究GSM模块时对串口返回的数据总是把握不好,参考开发板附送的例...
用户412852 2011-08-05 11:07
生活小记 2011-08-05 再谈理想
生活小记 2011-08-05 再谈理想   近日突发的奇想,让我不得不开始由衷地敬佩老美。记得自己还是大学生的时候,对水中探测器布设产生了想法,于是了解到了声纳监听网络;前日忽然想到如果能够在台湾...
用户412852 2011-07-27 18:28
FPGA学习手记(一) FPGA入门及建立FPGA开发环境
FPGA学习手记(一) FPGA入门及建立FPGA开发环境 一直没有勇气涉足FPGA领域,虽说在学院限选课里也学过大规模可编程逻辑器件,接触过Quartus II和VerilogHDL,但毕竟大学课...
EE直播间
更多
我要评论
1
10
关闭 站长推荐上一条 /3 下一条