FPGA学习:VHDL设计灵活性&不同设计思路比较
来源:互联网 发布:皇室战争电磁炮数据 编辑:程序博客网 时间:2024/04/30 11:38
概要
由于VHDL编程实现数字电路具有很高的灵活性,为多种不同的思路编写实现同一种功能提供了可能。这些不同的设计思路,在耗费资源,可靠性,速度上也有很大的差异,往往需要我们根据实际需求和资源条件选择适合的设计思路。
正文
本文以十进制1k计数器作为例子,阐述不同的思路最终形成的数字电路的差异性。该十进制的需求输入输出信号如图
作为硬件设计的初学者,可能还会利用软件设计的思路来编写VHDL代码。假设我们在一个高级语言(相对应机器语言)的环境下,实现一个这样的计数器对于程序员来说,最简单不过了。维护一个自加变量,每当触发条件(这里是时钟上升沿信号)发生时,这个变量的值自加即可。至于输出该变量的每一位,则通过除余法来实现。
若是利用硬件思路来实现,则会想到利用十进制计数器了。通过多个十进制计数器进行级联,即可实现十进制1k计数器。每一个十进制计数器中的数据对应着每一位的数,可以直接输出这些计数器的数据。
这两种设计思路的不同,完成的VHDL的代码,实现的数字电路的各种特性也有很大差异。
- 软件思路
这是软件设计思路写出的VHDL代码:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT1000 ISPORT (CLK : IN STD_LOGIC ;EN : IN STD_LOGIC ;COUT : OUT STD_LOGIC;D0,D1,D2 :OUT INTEGER RANGE 0 TO 9);END ENTITY CNT1000;ARCHITECTURE RT1 OF CNT1000 ISBEGINPROCESS ( CLK )VARIABLE CNT : INTEGER RANGE 0 TO 999;BEGIN IF CLK'EVENT AND CLK = '1' AND EN = '1' THEN IF CNT < 999 THEN CNT := CNT + 1; ELSE CNT := 0; END IF; END IF; IF CNT = 999 THEN COUT <= '1'; ELSE COUT <= '0'; END IF; D0 <= CNT/100; D1 <= CNT/10 - (CNT/100)*10; D2 <= CNT REM 10;END PROCESS;END ARCHITECTURE RT1;
我们利用CNT这个变量来保存计数器当前的数据,每当时钟上升沿该变量自加。当变量达到上限,即将溢出信号置为高电平。D0、D1、D2则用除余法输出每一位的数据。
这是根据该模块生成的RTL预览图。
软件思路总结
通过上面的RTL顶层预览图,可以分析生成的数字电路所占用的位宽为10位
利用了两个除法器,一个取余器
为了实现这些器件,该数字电路所占用的资源多
每次输出均会通过除法器等器件,速度较慢。硬件思路
若是用硬件实现该电路,首先需要实现一个十进制计数器,代码如下
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 ISPORT (CLK : IN STD_LOGIC ;EN : IN STD_LOGIC ;DOUT : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 );COUT : OUT STD_LOGIC);END ENTITY CNT10;ARCHITECTURE RT1 OF CNT10 ISBEGINPROCESS ( CLK )VARIABLE CNT : STD_LOGIC_VECTOR ( 3 DOWNTO 0 );BEGIN IF CLK'EVENT AND CLK = '1' AND EN = '1' THEN IF CNT < 9 THEN CNT := CNT + 1; ELSE CNT := "0000"; END IF; END IF; IF CNT = 9 THEN COUT <= '1'; ELSE COUT <= '0'; END IF; DOUT <= CNT ;END PROCESS;END ARCHITECTURE RT1;
一个十进制计数器代表最终数据的进位,通过计数器的级联,最终实现1k十进制计数器。而说到十进制计数器的级联方式,又有了两种选择
一个是异步级联,一级计数器的溢出信号直接当作下一级的时钟信号使用。
一个是同步级联,本级溢出信号与本级使能信号作为下一级的使能信号,所有时钟共用同一个时钟信号。
- 异步级联
这是异步级连的部分示意图。但是由于实际电路一级一级时钟信号会出现损耗,且溢出信号会有延迟,在级数增多的情况下,延迟被放大,信号的损耗也导致不能支持更多的计数器,从而致使整个数字电路系统出现不稳定的情况。 同步级联
同步级联的原理如上。
本级溢出信号与本级使能信号作为下级使能信号,且多个计数器利用同一时钟信号。由于使用同一时钟信号,上面异步级联所遇到的信号削弱问题就得到了解决,且由于是驱动的使能端,每一级的延迟不会得到积累,且该延迟也不会影响下一个时钟上升沿的下一级计数器的计数行为。故利用这种同步级联的多级计数器可靠性较高。硬件思路总结
下面来总结下硬件设计思路设计出的数字电路的特点。
单个十进制计数器的RTL预览图如图
而本工程利用了三个十进制计数器可推得其位宽为3*4 = 12位
这个数字电路不包含除法器
每次输出为计数器直接输出,无需处理,速度快。总结
通过不同级联方法形成数字电路的分析,可以发现,不同的设计,虽然实现的功能相同,但其可靠性、延展性可能会有不同
同样,利用VHDL编程以不同的思路来实现同样的功能,其利用的资源,计算的速度也是有差别的。
VHDL本身的灵活性决定了其拥有多样化实现方案。通过学习积累实际的案例并加以总结,掌握其中的套路,根据需求和资源,选择合适的实现方案。
由于对FPGA研究较浅,理解可能有不全面的地方,若有异议,欢迎前来讨论。
- FPGA学习:VHDL设计灵活性&不同设计思路比较
- fpga的vhdl设计
- 用VHDL和原理图输入进行CPLD/FPGA设计的粗略比较
- 基于FPGA/CPLD设计与实现UART(VHDL)
- FPGA设计—VHDL语言篇(1) 模块例化
- FPGA中三种同步设计比较
- 【VHDL】VHDL设计一个分频器
- FPGA学习笔记4-VHDL
- FPGA\CPLD设计学习笔记
- FPGA\CPLD设计学习笔记
- VHDL温度控制系统设计
- VHDL编程设计技巧
- VHDL 音乐盒设计
- 状态机的VHDL设计
- 用VHDL设计交通灯
- 浅谈数据库设计---灵活性原则
- fact-dimesion 设计的灵活性
- 基于FPGA/CPLD应用设计的23点经验总结——关于VHDL代码风格
- 2016/8/23
- WordPress 3.6-4.5.2 Authenticated Revision History Information Disclosure
- 第九天:JAVA中的多态,抽象类和接口
- Maven项目中,将普通工程修改为web工程办法
- Error:Unable to start the daemon process.解决
- FPGA学习:VHDL设计灵活性&不同设计思路比较
- Smarty模板技术-自定义函数-1
- Word Rings POJ2949 (Bellman-ford算法,找平均值最大的环)
- centOS7开机直接进入命令界面
- 简单排序(1)
- 我的见解之hibernate(三)
- php之static后期绑定/延迟绑定
- 我的博客
- 三种经典的递归-java