VHDL全名Very-High-Speed Integrated Circuit Hardware Description Language ,是一种标准硬件描述语言。下面通过60进制计数器来分析VHDL的语法,以及一些硬件设计的理解。

60进制计数器,顾名思义,是每60个时间单位输出一个脉冲信号。60进制可以利用小于60进制的计数器的累加来达成相应的功能。主要有以下两种思路:

一种是直接其中的一个计数器通过时钟型号累加,另一个则是接受第一个计数器的进位信号,而进行加法计数。他们共用一个时钟信号,为并行进位。

一种是高位计数器的时钟连着低位计数器的进位信号,从而进行增加。

这里取第二种思路,通过一个10进制的计数器和一个6进制的计数器来实现60进制计数器。

顶层图如下



下面我们用VHDL语言来实现。

首先是6进制计数器。

注意!!器件最好不要以数字作为开头

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

这部分是库的声明。1164库中包括了大部分标准的类型,器件。

而unsigned中则包括了如加法等器件。

entity counter_6 is
port(
clk,clrn,en:in std_logic;
dout:out std_logic_vector (3 downto 0);
cout:out std_logic);
end counter_6;

这部分为这个文件所描述的总器件端口的声明,类似编程中主函数的声明。

architecture counter_6_arch of counter_6 is

这下面就是器件内部的描述内容、类似编程中的主函数实现。

signal douti:std_logic_vector (3 downto 0);
begin
process(en,clk,clrn,en)
begin
if clrn = '0' then
douti <= "0000";
elsif clk'event and clk = '1' and en = '1' then
if douti < 5 then
douti <= douti+1;
else douti <= "0000";
end if;
end if; if douti = 5 then
cout <= '1';
else cout <= '0';
end if;
dout <= douti;
end process;
end counter_6_arch;

十进制的计数器和六进制的类似,代码如下。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity counter_10 is
port(
clk,clrn,en:in std_logic;
dout:out std_logic_vector (3 downto 0);
cout:out std_logic);
end counter_10; architecture counter_10_arch of counter_10 is
signal douti:std_logic_vector (3 downto 0);
begin
process(en,clk,clrn,en)
begin
if clrn = '0' then
douti <= "0000";
elsif clk'event and clk = '1' and en = '1' then
if douti < 9 then
douti <= douti+1;
else douti <= "0000";
end if;
end if; if douti = 9 then
cout <= '1';
else cout <= '0';
end if;
dout <= douti;
end process;
end counter_10_arch;

将以上两个进制计数器编写完成后,复制到总工程目录下,开始编写上面顶层图所描述的内容。

这部分代码与之前的类似

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all; entity counter_60 is
port(
CLK,EN,CLRN:in std_logic;
tens_digit:out std_logic_vector(3 downto 0);
single_digit:out std_logic_vector(3 downto 0);
cout:out std_logic);
end counter_60; architecture rout1 of counter_60 is

这里就是对包含的器件进行声明了。其中包含哪些端口,是那种类型的数据,要和之前的命名的一样。

这里的d触发器直接调用系统提供的了,记得导包。可以自己用VHDL写一个或者定制一个,然后把VHD文件粘贴到本工程下面引用。

类似编程中间对引用的函数的声明。

component counter_10 is
port(
clk,en,clrn:in std_logic;
dout:out std_logic_vector(3 downto 0);
cout:out std_logic);
end component;
component counter_6 is
port(
clk,en,clrn:in std_logic;
dout:out std_logic_vector(3 downto 0);
cout:out std_logic);
end component; component dff is
port(
clk,d,clrn:in std_logic;
q:out std_logic);
end component; signal tens_wire,single_wire: std_logic_vector(3 downto 0);
signal cout_10,cout_6: std_logic;
signal dff_out: std_logic; begin
ctr10 : counter_10 port map(clk=>CLK,en=>EN,clrn=>CLRN,dout=>single_wire,cout=>cout_10);

这里就是对线路的说明了,之前定义了好多线,在这里连上即可。

类似实例化上面引用的函数。格式如下:

实例化后器件的名字:要实现的器件名 port map (port名=>接上的线或端口,port名=>接上的线或端口,…);

    my_dff : dff port map(d=>cout_10,clk=>CLK,clrn=>CLRN,q=>dff_out);
ctr6 : counter_6 port map(clk=>dff_out,en=>EN,clrn=>CLRN,dout=>tens_wire,cout=>cout_6);
tens_digit<=tens_wire;
single_digit<=single_wire;
cout<= cout_10 and cout_6;
end rout1;

可以生成RTL看看对不对



这是总器件的图



这是10进制加法器的图

最后自己愉快的仿真下就好了。

敲了有一阵VHDL的代码了,下面是一些杂七杂八的东西。

首先,所有语言都是通的,VHDL其实和一些面向过程的语言非常类似,而且最后打包成黑箱,还可以直接实例化调用,有些面向对象的感觉了。最先开始比较喜欢利用顶层图直接设计,比较直观,但是当工程复杂起来,VHDL的优势就显现出来了。强逻辑性,无需了解细节上面的电路实现,还有比较灵活的模块关系。

VHDL还有几种实现方式,一种是类似上面,把目标分成模块,一个模块一个模块的实现,最后把东西连起来达到最终目的。另一种就是直接列出真值表,利用when else 直接根据输入,输出相应结果。最后一种是数据流描述,说直白点,就是类似面向过程的编程,有一定的逻辑语句和处理。以上几种方式组合起来,根据不同的设计要求,利用合适的方式完成就好了。

VHDL学习记录的更多相关文章

  1. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  2. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  3. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  4. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  5. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  6. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  7. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  8. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  9. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

随机推荐

  1. Java ee 与安卓环境搭建个人心得

    最近加了个IT俱乐部,第一次作业就是搞定eclipse,完成Java ee 与安卓环境搭建.为此我上网看了好多教程,之前我安装了Java,可以说省了不少事,而且还了解一点安装方法.流程网上都有,但是不 ...

  2. .net 设置webbrowser控件使用的IE版本

    当我们在使用.net的Webbrowser控件时,发现webbrowser展示的内容和我们用浏览器展示的内容不一致,甚至出现:'JSON' is undefined. 原因是webbrowser使用的 ...

  3. JS数组去重的十种方法

    一.前言: 我们在实际工作中,或者在面试找工作时,都会用到或者被问到一个问题,那就是"数组如何去重".是的,这个问题有很多种解决方案,看看下面的十种方式吧! 二.数组去重方式大汇总 ...

  4. IDEA教程(转载)

    https://github.com/judasn/IntelliJ-IDEA-Tutorial

  5. umask的作用

    --umask的作用---------------2013/11/15 umask的作用就是当用户创建一个文件时,设置默认的目录和文件权限. 创建非目录文件时,用666减umask值(目录文件用777 ...

  6. fstab设置开机挂载--鸟哥[阅读]

    設定開機掛載: 手動處理 mount 不是很人性化,我們總是需要讓系統『自動』在開機時進行掛載的!本小節就是在談這玩意兒! 另外,從 FTP 伺服器捉下來的映像檔能否不用燒錄就可以讀取內容?我們也需要 ...

  7. window响应拖拽文件操作

    window响应拖拽文件操作 1.首先调用DragAcceptFiles,让控件或者窗体支持文件拖动操作函数功能:用来为拖放文件作初始化.函数原型: void DragAcceptFiles( HWN ...

  8. 安卓开发中Spinner控件的使用

    在安卓手机应用开发中,Spinner对象常用方法有以下五种. 用法 1 :以资源方式,静态展示 Spinner 选项 用法 2 :以代码方式,动态展示 Spinner 选项 用法 3 :同时显示图片和 ...

  9. 自定义类似于Jquery UI Selectable 的Vue指令v-selectable

    话不多说,先看效果. 其实就是一个可以按住鼠标进行一个区域内条目选择的功能,相信用过Jquery UI 的都知道这是selectable的功能,然而我们如果用Vue开发的话没有类似的插件,当然你仍然可 ...

  10. 安装 CentOS 时, BIOS 设置界面,找不到虚拟镜像

    安装 CentOS 时, 遇到 BIOS 设置界面,找不到虚拟镜像  1. 启动电脑或重启电脑,当电脑还没有进入window图标界面,按F2或DEL 2. 左下角有一个 Advanced Mode(F ...