FPGA学习:VHDL设计灵活性&不同设计思路比较
概要
由于VHDL编程实现数字电路具有很高的灵活性,为多种不同的思路编写实现同一种功能提供了可能。这些不同的设计思路,在耗费资源,可靠性,速度上也有很大的差异,往往需要我们根据实际需求和资源条件选择适合的设计思路。
正文
本文以十进制1k计数器作为例子,阐述不同的思路最终形成的数字电路的差异性。该十进制的需求输入输出信号如图
作为硬件设计的初学者,可能还会利用软件设计的思路来编写VHDL代码。假设我们在一个高级语言(相对应机器语言)的环境下,实现一个这样的计数器对于程序员来说,最简单不过了。维护一个自加变量,每当触发条件(这里是时钟上升沿信号)发生时,这个变量的值自加即可。至于输出该变量的每一位,则通过除余法来实现。
若是利用硬件思路来实现,则会想到利用十进制计数器了。通过多个十进制计数器进行级联,即可实现十进制1k计数器。每一个十进制计数器中的数据对应着每一位的数,可以直接输出这些计数器的数据。
这两种设计思路的不同,完成的VHDL的代码,实现的数字电路的各种特性也有很大差异。
- 软件思路
这是软件设计思路写出的VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT1000 IS
PORT (
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 IS
BEGIN
PROCESS ( 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 IS
PORT (
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 IS
BEGIN
PROCESS ( 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设计灵活性&不同设计思路比较的更多相关文章
- Alink漫谈(十二) :在线学习算法FTRL 之 整体设计
Alink漫谈(十二) :在线学习算法FTRL 之 整体设计 目录 Alink漫谈(十二) :在线学习算法FTRL 之 整体设计 0x00 摘要 0x01概念 1.1 逻辑回归 1.1.1 推导过程 ...
- 基于FPGA的通信信号源的设计
通信信号源设计原理 通过设计一个DDS信号源,然后将该信号作为载波信号,再对基带信号进行2ASK.2FSK.2PSK.2DPSK调制,进而产生多种通信信号. 设计框图如下: 将PN序列进行2ASK.2 ...
- ElasticSearch 学习记录之如任何设计可扩容的索引结构
扩容设计 扩容的单元 一个分片即一个 Lucene 索引 ,一个 Elasticsearch 索引即一系列分片的集合 一个分片即为 扩容的单元 . 一个最小的索引拥有一个分片. 一个只有一个分片的索引 ...
- 基于FPGA的VGA可移植模块终极设计【转】
本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯 基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事, ...
- C#彩色艺术化二维码样式设计(仅说思路)
原文:C#彩色艺术化二维码样式设计(仅说思路) 仅讲思路,想要源码的请绕道. 一.样式 1.先看各种二维码的样式吧: (1)最简单的样式--黑白样式,如下图: 图1 最平常见到的二维码样式(如果 ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- PFC电源设计与电感设计计算学习笔记
PFC电源设计与电感设计计算 更新于2018-11-30 课程概览 常见PFC电路和特点1 常见PFC电路和特点1 CRM PFC电路设计计算 CCM PFC电路设计计算 CCM Interleave ...
- 如何学习FPGA?FPGA学习必备的基础知识
如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA 基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...
- FPGA学习之基本结构
如何学习FPGA中提到第一步:学习.了解FPGA结构,FPGA到底是什么东西,芯片里面有什么,不要开始就拿个开发板照着别人的东西去编程.既然要开始学习FPGA,那么就应该从其基本结构开始.以下内容是我 ...
随机推荐
- CentOS下安装Nginx服务器
一.nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos7作为安装环境. 1.1 gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果 ...
- sysstat -6.0.2 lib not install
执行oracle安装包./setup.sh 后跳出,无法执行数据库的安装,并提示类似下面 的错误信息-- ERROR:===wed Aug 15 08:43:23 CST 2012===sysstat ...
- pudian
https://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%81%E7%A0%81 http://www.voidcn.com/blog/lionzl/article/ ...
- 【NO.14】jmeter-处理结果
在1台测试机上面处理测试结果并没啥,比较麻烦的是合并2台测试机的测试结果. 首先说说,为什么我们需要使用2台(甚至3台.4台)测试机对服务器发送大量的请求呢?说白了就是测试机配置太弱了,服务器太牛逼. ...
- 移动端为何不使用click而模拟tap事件及解决方案
移动端click会遇到2个问题,click会有200-300ms的延迟,同时click事件的延迟响应,会出现穿透,即点击会触发非当前层的点击事件. 为什么会存在延迟? Google开发者文档中有提到: ...
- 关于CSS格式与布局中的基础知识的简单操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [Leetcode]50. Pow(x, n)
Implement pow(x, n). 我的做法就比较傻了.排除了所有的特殊情况(而且double一般不可以直接判断==),然后常规情况用循环来做.- -||| 直接用循环,时间复杂度就比较大.应该 ...
- Go 程序的性能优化及 pprof 的使用
Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下,我们 ...
- 2、粘包现象(struct模块)
昨天我们所做的套接字是有漏洞的,它会出现粘包现象,没有发现这个问题的我们今天会进行演示.今天也会稍微讲解一下基于udp的套接字. 一.基于udp的套接字 udp是无链接的,先启动哪一端都不会报错 ud ...
- 利用 :before :after伪类实现鼠标悬浮动画效果
1.最近在逛网站的时候,想找一下喜欢的鼠标悬浮效果,避免广告的嫌疑,直接放图了: 2.在实现的时候,如果在直接使用鼠标hover ,transform,进行过渡,不能达到想要的效果,因为同时只能触发一 ...