VHDL体会

时间:2019-05-12 13:08:52下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《VHDL体会》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《VHDL体会》。

第一篇:VHDL体会

学习心得

——《eda技术实用教程》

本学期对《eda技术实用教程--vhdl版》的学习为我的专业知识学习打开了一个全新的窗口——微电子技术领域。对eda技术,我更是有了全新的认识。

微电子技术的进步主要表现在大规模集成电路加工技术即半导体工艺技术的发展上,使得表征半导体工艺水平的线宽已经达到了纳米级。所以,集成电路设计正在不断地向超大规模、极低功耗和超高速的方向发展。

而现代电子设计技术的核心已日趋转向基于计算机的电子设计自动化技术,即eda技术。eda技术就是依赖功能强大的计算机,在eda工具软件平台上,对以硬件描述语言hdl为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。eda技术使得设计者的工作仅限于利用软件的方式,即利用硬件描述语言和eda软件来完成对系统硬件功能的实现,这是电子设计技术的一个巨大进步。eda技术在进入21世纪后,得到了更大的发展。嵌入式处理器软核的成熟,使得sopc步入大规模应用阶段。电子技术领域全方位融入eda技术,除了日益成熟的数字技术外,传统的电路系统设计建模理念发生了重大的变化。同时,eda使得电子领域各学科的界限更加模糊,更加互为包容。这些都利于设计人员利用eda技术进行电子系统设计,如全定制或半定制asic设计,fpga/cpld开发应用和印制电路板。

从eda技术的特点不难看出,相比于传统的数字电子系统或ic设计,eda技术拥有独特的优势。在传统的数字电子系统或ic设计中,手工设计占了较大的比例。因此,也存在很多缺点。例如:复杂电路的设计、调试十分困难;由于无法进行硬件系统仿真,如果某一过程存在错误,查找和修改十分不便;设计过程中产生大量文档,不易管理;可移植性差等。相比之下,eda技术有很大不同。它运用hdl对数字系统进行抽象的行为与功能描述到具体的内部线路结构描述,从而可以在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可以大大降低设计成本,缩短设计周期。由于有各类库的支持,能够完成各种自动设计过程。它极大地简化了设计文档的管理,逻辑设计仿真测试技术也日益强大。vhdl在现在的eda设计中使用最多,也拥有几乎所有主流eda工具的支持。vhdl作为一个规范语言和建模语言,不仅可以作为系统模拟的建模工具,而且可以作为电路系统的设计工具,可以利用软件工具将vhdl源码自动地转化为文本方式表达的基本逻辑元件连接图,即网表文件。这种方法显然对于电路自动设计是一个极大的推进。它具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。eda技术良好的可移植性与可测试性,将所有设计环节纳入统一的自顶向下的设计方案中。它不但在整个设计流程上充分利用计算机的自动设计能力、在各个设计层次上利用计算机完成不同内容的仿真模拟,而且在系统板设计结束后仍可利用计算机对硬件系统进行完整的测试。

书中通过大量的图示对pld硬件特性与编程技术进行了形象的讲解,不仅融合了之前学习的关于电路设计的知识还将eda的技术加入其中。对vhdl语言的详尽讲解更是让我深刻理解了vhdl语言的编程原理。由于本门课程是一门硬件学习课程,所以实验必不可少。通过课程最后实验,我体会一些vhdl语言相对于其他编程语言的特点。

相对于其它计算机语言的学习,如c 或汇编语言,vhdl 具有明显的特点。这不仅仅是由于vhdl 作为一种硬件描述语言的学习需要了解较多的数字逻辑方面的硬件电路知识,包括目标芯片基本结构方面的知识更重要的是由于vhdl 描述的对象始终是客观的电路系统。由于电路系统内部的子系统乃至部分元器件的工作状态和工作方式可以是相互独立、互不相关的,也可以是互为因果的。这表明,在任一时刻,电路系统可以有许多相关和不相关的事件同时并行发生。例如可以在多个独立的模块中同时入行不同方式的数据交换和控制信号传输,这种并行工作方式是任何一种基于cpu 的软件程序语言所无法描绘和实现的。传统的软件编程语言只能根据cpu 的工作方式,以排队式指令的形式来对特定的事件和信息进行控制或接收。在cpu 工作的任一时间段内只能完成一种操作。因此,任何复杂的程序在一个单cpu 的计算机中的运行,永远是单向和一维的。因而程序设计者也几乎只需以一维的思维模式就可以编程和工作了。vhdl 虽然也含有类似于软件编程语言的顺序描述语句结构,但其工作方式是完全不同的。软件语言的语句是根据cpu 的顺序控制信号,按时钟节拍对应的指令周期节拍逐条运行的,每运行一条指令都有确定的执行周期。但 vhdl 则不同,从表面上观,vhdl 的顺序语句与软件语句有相同的行为描述方式,但在标准的仿真执行中有很大的区别。vhdl 的语言描述只是综合器赖以构成硬件结构的一种依据,但进程语句结构中的顺序语句的执行方式决非是按时钟节拍运行的。实际情况是其中的每一条语句的执行时间几乎是0(但该语句的运行时间却不一定为0),即1000 条顺序语句与10 条顺序语句的执行时间是相同的。在此,语句的运行和执行具有不同的概念(在软件语言中,它们的概念是相同),的执行是指启动一条语句,允许它运行一次,而运行就是指该语句完成其设定的功能。

通过实验,我认识到理论要与实际结合,培养动手动脑能力的重要性,做事情要抱着一丝不苟的态度,这样才能做好事情。同时也入一步了解到eda的强大之处,硬件电路的优秀的地方,对硬件方面更感兴趣了。这门课程的学习,为我以后的专业知识的学习打下了良好的基础。篇二:vhdl 编程的一些心得体会 vhdl 编程的一些心得体会(转)vhdl 是由美国国防部为描述电子电路所开发的一种语言,其全称为(very high speed integrated circuit)hardware description language。与另外一门硬件描述语言 verilog hdl 相比,vhdl 更善于描述高层的一些设计,包括系统级(算法、数据通路、控制)和行为级(寄存器传输级),而且 vhdl 具有设计重用、大型设计能力、可读性强、易于编译等优点逐渐受到硬件设计者的青睐。但是,vhdl 是一门语法相当严格的语言,易学性差,特别是对于刚开始接触 vhdl 的设计者而言,经常会因某些小细节处理不当导致综合无法通过。为此本文就其中一些比较典型的问题展开探讨,希望对初学者有所帮助,提高学习进度。

一. 关于端口 vhdl 共定义了 5 种类型的端口,分别是 in, out,inout, buffer及 linkage,实际设计时只会用到前四种。in 和 out 端口的使用相对简单。这里,我们主要讲述关于 buffer和inout 使用时的注意事项。

与 out 端口比,buffer 端口具有回读功能,也即内部反馈,但在设计时最好不要使用 buffer,因为 buffer类型的端口不能连接到其他类型的端口上,无法把包含该类型端口的设计作为子模块元件例化,不利于大型设计和程序的可读性。若设计时需要实现某个输出的回读功能,可以通过增加中间信号作为缓冲,由该信号完成回读功能。

双向端口 inout 是四种端口类型中最为特殊的一种,最难以学习和掌握,为此专门提供一个简单程序进行阐述,部分程序如下:...? ① datab<=din when ce=’1’ and rd=’0’ else ②(others=>’z’);③ dout<=datab when ce=’1’ and rd=’1’ else ④(others=>’1’);? ? 程序中 datab 为双向端口,编程时应注意的是,当 datab 作为输出且空闲时,必须将其设为高阻态挂起,即有类似第②行的语句,否则实现后会造成端口死锁。而当 datab 作为有效输入时,datab 输出必须处于高阻态,对于该例子中即,当 ce=’1’ and rd=’1’时,二.信号和变量

常数、信号和变量是 vhdl 中最主要的对象,分别代表一定的物理意义。常数对应于数字电路中的电源或地;信号对应某条硬件连线;变量通常指临时数据的局部存储。信号和变量功能相近,用法上却有很大不同。

表 1 信号与变量主要区别

号 变量

赋值延迟 至少有△延时 无,立即变化 相关信息 有,可以形成波形 无,只有当前值 进程敏

感 是 否 全局性 具有全局性,可存在于多个进程中 只能在某个进程或子程序中有效 相互赋值关系 信号不能给变量赋值 变量可以给信号赋值

对于变量赋值操作无延迟,初学者认为这个特性对 vhdl 设计非常有利,但这只是理论上的。基于以下几点原因,我们建议,编程时还是应以信号为主,尽量减少变量的使用。

(1)变量赋值无延时是针对进程运行而言的,只是一个理想值,对于变量的操作往往被综合成为组合逻辑的形式,而硬件上的组合逻辑必然存在输入到输出延时。当进程内关于变量的操作越多,其组合逻辑就会变得越大越复杂。假设在一个进程内,有关于变量的 3 个 级连操作,其输出延时 分别为 5ns,6ns,7ns,则其最快的时钟只能达到 18ns。相反,采用信号编程,在时钟控制下,往往综合成触发器的形式,特别是对于 fpga 芯片而言,具有丰富的触发器结构,易形成流水作业,其时钟频率只受控于延时最大的那一级,而不会与变量一样层层累积。假设某个设计为 3 级流水作业,其每一级延时分别为 10ns,11ns,12ns,则其最快时钟可达 12ns。因此,采用信号反而更能提高设计的速度。(2)由于变量不具备信息的相关性,只有当前值,因此也无法在仿真时观察其波形和状态改变情况,无法对设计的运行情况有效验证,而测试验证工作量往往会占到整个设计

70%~80%的工作量,采用信号则不会存在这类问题。

(3)变量有效范围只能局限在单个进程或子程序中,要想将其值带出与其余进程、子模块之间相互作用,必须借助信号,这在一定程度上会造成代码不够简洁,可读性下降等缺点。

当然,变量也具有其特殊的优点,特别是用来描述一些复杂的算法,如图像处理,多维数组变换等。

三.位(矢量)与逻辑(矢量)bit 或其矢量形式 bit_vector只有’0’和’1’两种状态,数字电路中也只有’0’和’1’两种逻辑,因此会给初学者一个误区,认为采用位(矢量)则足够设计之用,而不必像std_logic那样出现’x’,’u’,’w’各种状态,增加编程难度。但实际情况却并非如此,以一个最简单 d型触发器设计为例 ? ? ① process(clk)② begin ③ if clk’event and clk=’1’ then ④ q<=d;⑤ end if;⑥ end process;? ? 实际中 clk 对数据端 d的输入有一定的时间限制,即在 clk 上升沿附近(建立时间和保持时间之内),d必须保持稳定,否则 q输出会出现亚稳态,如下图所示。

当 clk 和 d时序关系不满足时,由于 bit 只有’0’或’1’,系统只能随机的从’0’和’1’中给 q 输出,这样的结果显然是不可信的;而采用 std_logic 类型,则时序仿真时会输出为一个’x’,提醒用户建立保持时间存在问题,应重新安排 d和 clk 之间时序关系。

此外,对于双向总线设计(前面已提及)、fpga/cpld上电配置等问题,如果没有’z’,’x’等状态,根本无法进行设计和有效验证。

四.关于进程

进程(process)是 vhdl 中最为重要的部分,大部分设计都会用到 process 结构,因此掌握process 的使用显得尤为重要。以下是初学和使用 process 经常会出错的例子。1.多余时钟的引入

在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序:

① process(ctl_a)-贪吃蛇

一、课程设计目的

1)巩固和加深所学电子技术课程的基本知识,提高综合运用所学知识的能力; 2)培养根据课题需要选用参考书、查阅手册、图表和文献资料的能力,提高学生独立解决工程实际问题的能力 3)通过设计方案的分析比较、设计计算、元件选择及电路安装调试等环节.初步掌握简单实用电路的工程设计方法。4)提高动手能力.掌握常用仪器设备的正确使用方法,学会对简单实用电路的实验调试和对整机指标的测试方法,5)学习vhdl和verilog hdl语言,熟悉de0电路板。提高对软件与硬件之间关系的认识与了解

二、设计任务与要求

设计任务:设计一个贪吃蛇小游戏

要求和指标:

1.用ps2键盘作为输入设备,用lcd作为显示器。2.自定义蛇的图像和老鼠的图像,用四个按键控制蛇的运动方向,完成贪食蛇游戏,蛇撞“墙”、边或者游戏时间到,游戏结束。3.老鼠出现的地方是随机的,在某个地点出现的时间是蛇走15步的时间,如果15步之内没有被吃掉,它就会在其它地方随机出现。;4.在旁边显示得分情况和游戏的剩余时间。

三、方案设计与论证

1、vga显示

vga标准是一种计算机显示标准,最初是由ibm公司在1987 年提出的一种

视频传输标准,在彩色显示器领域得到了广泛应用。vga管脚中,vga_hs和vga_vs分别是水平扫描信号和竖直扫描信号,vga_r, vga_g和vga_b是颜色控制信号,控制当前显示的像素色彩。利用水平扫描信号和竖直扫描信号实现二维平面的像素扫描显示,程序中中我們利用cnt_h与cnt_v信号来控制,以确认程序正确的将色彩输出到屏幕上。将屏幕分成30*40的矩阵,每个矩阵块根据不同的值赋予不同的颜色。屏幕是从最左上角的(4,4)坐标开始扫描更新,可以将屏幕视为x-y平面來看,根据矩阵点值赋予不同颜色绘制游戏框架并且实时显示蛇与老鼠

在做vga显示前先进行了彩条显示,以确保颜色显示正确,结果如下:

根据彩条显示绘制游戏框架,并定义蛇与老鼠的颜色。

第二篇:VHDL实验报告

《创新实验》实验报告

—基于VHDL的编程和硬件实现

一、实验目的 1.2.3.4.熟悉和掌握硬件描述语言VHDL的基本语法及编写; 掌握软件Xilinx ISE 10.1的使用; 熟悉SDZ-6电子技术实验箱的使用;

了解节拍脉冲发生器等基本电路的实现;

5.了解八位二进制计数器的功能与设计; 6.学习键盘和七段数码管显示的控制和设计。

二、实验内容

1.Xilinx ISE 10.1软件的使用;

2.节拍脉冲发生器等基本电路的实现; 3.八位二进制计数器的实现 4.键盘扫描及显示的实现

三、实验器材

1、PC机

2、SDZ-6电子技术实验箱

3、正负5V电源

4、I/O接口线

四、软件的使用

在安装Xilinx10.1软件时,需要一个ID号,其实这个ID号是可以重复使用的,几个同学在官网注册后就可以共享ID号了。

安装完成之后就可以使用这个软件编写相应的VHDL的程序。1.新建工程

File—>New Project 弹出下面的对话框

输入工程名后单击Next。然后根据本实验的实验箱进行以下设置。

以后的步骤一般都是单击Next(有些资料上会介绍有些这些步骤的具体功能,但对于本实验不必用到),最后单击Finish,完成新建一个工程。在窗口的左边会出现刚刚新建的工程,如下:

2.新建一个VHDL的源文件。

在上图中,右击工程选择New Source,弹出如下对话框。

在对画框的左边选择VHDL Module,输入文件的名字(改名字最好是你定义的实体的名字)。单击Next。出现下面的对话框。

该对话框主要是对外部端口的编辑。可以直接跳过,即单击Next,在源文件上编辑端口。然后在接下来的对话框中单击Finish。完成建立一个源文件。窗口右边就会出现刚才编辑的源文件。

3.编写和编译代码

将事先编好的代码复制到源文件里,然后保存文件。选中左边的文件名,在窗体的左边出现如下编辑文档内容。

选择Synthesize —XST—》Check Syntax,双击Check Syntax,开始编译源文件。

4.软件仿真

其实仿真这一步可要可不要,很多程序都不需要仿真,有些程序即使仿真出错,但是最后结果却可以出来。因此,我们做实验时很少仿真,此处也不再赘述了。

5.综合

首先根据实验箱的安排布局,找到程序中外部接口的对应实验箱上的接口,进行接口对应,双击如下图所示的选项。

出现接口窗口如下,进行设置(具体参见老师发的文档SDZ电子实验箱的使用说明文档)保存,关闭即可

然后如下图从Implement Design开始依次双击综合。

6.下载

双击Configure Target Device综合完成之后,就出现下载对话框。右击鼠标键盘选择Add Xilinx Device,选择.bit文件。然后右击选择Program,就将程序烧录到实验板上了。

五、节拍脉冲发生器电路实现

1、实验题目:

参照时标系统的设计方法,用组合逻辑方法设计一个简单的节拍脉冲发生器,产生图1-6所示的节拍脉冲,并用单脉冲验证设计的正确性。在实验报告中画出完整电路,写出W1、W0和N1的表达式。

图1-6 简单的节拍脉冲发生器一周期的波形

设计提示:

1、由波形图求出节拍脉冲W1和W0的表达式,进而组合成N1的表达式。

2、注意节拍电平T1和T0的翻转时刻应在M0下降沿与M的上升沿同时出现的时刻。

3、注意D触发器的触发翻转要求。

2、实验步骤:

1.根据题目确定输出结果的逻辑表达式

W1M*M0*T1

W0M*M0*T1*S

N1W1W0

2.画出电路图

3.确定输入输出的外部端口 输入端口:M(由时钟产生)输出端口:W1,W0,N1 4.根据电路图写代码 5.编译,调试

3、实验代码 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;——头文件

entity clk_div is

Port(clk : in STD_LOGIC;

w0 : out STD_LOGIC;

w1 : out STD_LOGIC;

N1 : out STD_LOGIC);end clk_div;

architecture Behavioral of clk_div is signal count : std_logic_vector(3 downto 0):=“0000”;signal a : std_logic;signal b : std_logic;signal temp : integer range 0 to 50;signal Q : std_logic;begin process(clk,Q)

begin if(clk'event and clk='1')then

——对clk进行分频

temp <= temp+1;if(temp =49)then

Q <= not Q;

end if;temp <= 0;end if;if(Q'event and Q='1')then

if(count =“1111”)then

count <=(others =>'0');else

count <=count+1;end if;end if;a <=(not clk and count(0))and count(1);

b <=(not clk and count(0))and(not count(1)and count(2));end process;w1 <= a;w0 <= b;N1 <=a or b;end Behavioral;

4、硬件实现与注意事项

硬件实现主要说的是外部端口和实验箱的对应问题。M:接的是时钟脉冲,即P150 W1:接LED灯显示结果,即P45 W0:接LED灯显示结果,即P44 N1:接LED灯显示结果,即P47 注意事项:

1.时钟脉冲频率太高,结果会显示的很快,因此首先对CLK进行50倍的分频。将频率降低以便观察结果。2.由于时钟频率过高,可能仿真不出来,因此就不必仿真。3.可能有些组编译通过但在综合时出现错误(是有关BUF的),这时就需要在CLK之前接入一个缓冲器。具体的加入代码如下: library UNISIM;

——头文件 use UNISIM.VComponents.all;entity test is

Port(clk : in STD_LOGIC;end test;

architecture Behavioral of test is signal ck:std_logic;

component IBUF

——定义缓冲器

port(I:in STD_LOGIC;

O:out STD_LOGIC);end component;begin UO:IBUF port map(I=>clk,O=>ck);——以后的ck代替clk 六、八位二进制计数器的实现 1. 实验题目

请用VHDL编写一个八位二进制计数器,具有异步清零功能、同步置数、计数功能。实验验证时,须用单脉冲进行验证。计数器的输出显示在显示器上。〖显示器可以是:①七段数码显示器,②LED发光二极管。〗

2. 实验代码

library IEEE;

——头文件 use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;library UNISIM;use UNISIM.VComponents.all;

entity Counter8 is

Port(set : in STD_LOGIC;

——低电平置数

reset : in STD_LOGIC;

——低电平异步清零

key : out STD_LOGIC;

——键盘输出口

clk : in STD_LOGIC;

——键盘的输入口,当成单脉冲使用

co : OUT STD_LOGIC;

——进位

architecture example of Counter8 is signal ck: std_logic;signal cc: std_logic;signal down : STD_LOGIC_VECTOR(7 DOWNTO 0):=“00000000”;signal kk : std_logic:='0';put : in STD_LOGIC_VECTOR(7 DOWNTO 0);——置数

load : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

——LED显示

end Counter8;

component IBUF

——设置缓冲器 port(I : in STD_LOGIC;

O : out STD_LOGIC);end component;

begin

key <=kk;load <=down;co <=cc;U0:IBUF port map(I=>clk,O=>ck);p0:PROCESS(ck)begin if(ck' event and ck='0')then

IF(set ='0')THEN

——低电平置数 down <=put;ELSE

down <=down+1;END IF;END IF;

IF(reset ='0')then

——低电平异步清零 down <=“00000000”;END IF;if(down=“11111111”)then

——进位设置 cc <='1';else cc <='0';end if;end process p0;end example;

3. 硬件实现与注意事项 硬件实现:

clk:接键盘的行或列,即P 29

key :接键盘的行或列与clk相对应,即P34 reset :接数字开关,即P62 set:接数字开关,即P61 co :接电平显示,即P45 put(0-7):全部接数字开关,即P73 P74 P70 P71 P68 P69 P63 P67 load(0-7):全部接电平显示,即P59 P60 P57 P58 P48 P49 P46 P47

注意事项: 1.由于在综合时出了问题,本实验在输入clk之前加入了一个缓冲器 2.在实验中发现数字开关的抖动比键盘大,就选用键盘作为单脉冲。3.本实验在题目的基础上,新增了进位显示功能。

七、键盘扫描及显示的实现 1.实验题目

请用VHDL编写一个键盘扫描程序,对实验箱上的4×4键盘(蓝色部分)进行扫描。当有某个键被按下时,该键的键值被显示在显示器上。〖显示器可以是:①七段数码显示器,②LED发光二极管。〗

2.实验代码

library IEEE;

——头文件 use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;library UNISIM;use UNISIM.VComponents.all;

ENTITY KEYDIS IS

PORT(clk

: IN std_logic;

——扫描时钟

row

: OUT std_logic_vector(3 DOWNTO 0);

column : IN std_logic_vector(3 DOWNTO 0);

dyp

: OUT std_logic_vector(7 DOWNTO 1));

——数码管显示 END KEYDIS;

ARCHITECTURE arch OF KEYDIS IS SIGNAL div_cnt : std_logic_vector(1 downto 0):=“00”;SIGNAL scan_key : std_logic_vector(3 DOWNTO 0):=“1110”;SIGNAL key_code : std_logic_vector(3 DOWNTO 0):=“0000”;

SIGNAL dyp_tmp : std_logic_vector(7 DOWNTO 1):=“0000001”;SIGNAL COUNT : INTEGER range 0 TO 30;signal ck : std_logic;component IBUF

——缓冲器的声明

port(I:in STD_LOGIC;

O:out STD_LOGIC);end component;BEGIN U1:IBUF port map(I=>clk,O=>ck);row <= scan_key;dyp <= dyp_tmp;PROCESS(ck)BEGIN

IF(ck' EVENT AND ck = '1')THEN

div_cnt <= div_cnt + 1;

END IF;

IF(ck' EVENT AND ck = '1')THEN

COUNT <= COUNT + 1;

PROCESS(div_cnt(1 downto 0))

——扫描行(out)输出,和时钟频率一样

BEGIN

CASE div_cnt(1 downto 0)IS

WHEN “00”=>

scan_key<=“1110”;WHEN “01”=> scan_key<=“1101”;WHEN “10”=> scan_key<=“1011”;WHEN “11”=>

IF COUNT = 30 THEN COUNT <= 0;END IF;END IF;END PROCESS;

scan_key<=“0111”;

WHEN OTHERS =>

NULL;

END CASE;END PROCESS;

PROCESS(ck)BEGIN IF(ck'EVENT AND ck='1')THEN

CASE scan_key IS

WHEN “1110” =>

CASE column IS

WHEN “1110” =>

key_code <= “0000”;

——编码器输入

WHEN “1101” =>

key_code <= “0001”;

WHEN “1011” =>

key_code <= “0010”;

WHEN “0111” =>

key_code <= “0011”;

WHEN OTHERS =>

NULL;

END CASE;

WHEN “1101” =>

CASE column IS

WHEN “1110” =>

key_code <= “0100”;

WHEN “1101” =>

key_code <= “0101”;

WHEN “1011” =>

key_code <= “0110”;

WHEN “0111” =>

key_code

WHEN OTHERS =>

NULL;

END CASE;

WHEN “1011” =>

CASE column IS

WHEN “1110” =>

key_code

WHEN “1101” =>

key_code

WHEN “1011” =>

key_code

WHEN “0111” =>

key_code

WHEN OTHERS =>

NULL;

END CASE;

WHEN “0111” =>

CASE column IS

WHEN “1110” =>

key_code

WHEN “1101” =>

key_code

WHEN “1011” =>

key_code

WHEN “0111” =>

key_code

WHEN OTHERS =>

NULL;

END CASE;

WHEN OTHERS =>

key_code <= “1111”;

END CASE;

END IF;

<= “0111”;

<= “1000”;

<= “1001”;

<= “1010”;

<= “1011”;

<= “1100”;

<= “1101”;

<= “1110”;

<= “1111”;

END PROCESS;

--显示键值

PROCESS(key_code)

BEGIN--延时防抖动

IF COUNT = 0 THEN--

IF key_code = NOT “0000” THEN

CASE key_code IS

WHEN “0000” =>

dyp_tmp <= “1111110”;

WHEN “0001” =>

dyp_tmp <= “0110000”;

WHEN “0010” =>

dyp_tmp <= “1101101”;

WHEN “0011” =>

dyp_tmp <= “1111001”;

WHEN “0100” =>

dyp_tmp <= “0110011”;

WHEN “0101” =>

dyp_tmp <= “1011011”;

WHEN “0110” =>

dyp_tmp <= “1011111”;

WHEN “0111” =>

dyp_tmp <= “1110000”;

WHEN “1000” =>

dyp_tmp <= “1111111”;

WHEN “1001” =>

dyp_tmp <= “1111011”;

WHEN “1010” =>

dyp_tmp <= “1110111”;

WHEN “1011” =>

dyp_tmp <= “0011111”;

WHEN “1100” =>

dyp_tmp <= “1001110”;

WHEN “1101” =>

dyp_tmp <= “0111101”;

WHEN “1110” =>

dyp_tmp <= “1001111”;

WHEN “1111” =>

dyp_tmp <= “1000111”;

WHEN OTHERS =>

NULL;

END CASE;

——编码器输出并且数码管显示

END IF;--END IF;

END PROCESS;END arch;

3.硬件实现与注意事项 硬件实现:

clk:接扫描时钟,即P150 column(0-3):对应于键盘的列值,即P34 P33 P36 P35 row(0-3): 对应于键盘的行值,即P30 P31 P27 P29 dyp(1-7):对应于数码管显示,即P123 P125 P127 P129 P132 P133 P134 注意事项:

1.扫描时钟与显示时钟是不对应的,扫描的时钟快一些,显示时钟是在扫描时钟基础上的延时,该功能由参数COUNT实现。扫描程序和显示程序是分开写的。2.行和列其实没什么区别,只要按照正确的秩序来排列column和row结果就出正确。从另一方面,要得到正确的,希望的扫描数值,就必须安排好这行和列。以上的硬件实现的安排,是我们组测试了几遍的结果。3.代码中有很多语法如When else、With select、Case,其中有很多的技巧值得我们举一反三的。比如,键盘扫描时如何显示1110 1101 1011 0111,我们可以用移位寄存器实现,也可以像程序代码那样引入一个变量div_cnt,让其跟着扫描脉冲自动循环四位。另外,显示部分引入了译码器的原理实现数码管的16数值的显示。

4.本实验使用静态数码管进行显示。首先用一个数码管显示16个键值0~f,然后再用双数码管显示键值,从01~16显示键盘的键值。

5.数码管显示参数从高位到地位分别对应实验箱数码管的a~f,最后一位是小数点,并且数码管是共阴的,即高电平是数码管对应的LED才会发光。实验箱上的数码管LED对应关系如下:

八、实验感想

经过这次的合作,我们深深的体会到团队合作的重要性。在本次实验中,我们组遇到了很多困难。不过,我们互帮互助,互相鼓励,最终我们组还是能在比较快的时间内把实验结果做出来。

第一次实验中也就是节拍脉冲发生器电路实现,由于实验箱上最慢的时钟频率是100Hz,结果显示的太快,就需要对时钟进行分频,我们组很快在写出了分频的代码,然后进行编译和仿真。但是仿真的结果怎么也出不来。当时我们组有三个人就有点不耐烦了,准备放弃下次再弄。但是另外一个同学坚持综合,下载的步骤,结果就在不经意间出来了。事后我们才知道这个实验仿真是出不来的,也就是不用仿真这一步的。只要编译,综合对了就能下载并且结果正确。我们当时想辛亏组里有一个坚持不懈的人,否则,我们还得拖一个星期才能检查。

第二次做八位二进制计数器的实现时,我们吸取上次的教训不做仿真。但是实验要求需要一个单脉冲,异步清零端,置数端,八个数值显示。这一算共需要十一个数字开关,但实验箱上却只有十个数字开关。不过我们首先先用试验箱上的100Hz接口代替单脉冲,并对他进行50倍分频,结果显示的非常好。然后我们将异步清零放在一个键盘上实现,单脉冲放在数字开关上实现,结果抖动的非常厉害。在和别的组同学交流之后,我们组将单脉冲放在键盘上实现,抖动现象明显缓解。另外我们组还在此基础上增加了一个进位显示的功能。

在实验显示这块,我们组希望尽可能多用实验箱上给我们提供的显示仪器(即LED电平显示和数码管显示)。我们把LED电平显示安排在八位二进制计数器的实现的实验上,把数码管显示安排在键盘扫描及显示的实现的实验上。

第三次做键盘扫描及显示的实现的实验是,由于这次程序比较复杂,我们组采取二种办法。一个人根据自己所学所看的资料写代码(前二个实验都是我们自己写的代码),另一个人在网上收资料。结果我们自己写的代码有些不够严谨,结果循环显示,显然代码没有编好,然后我们组四个就参考网上收的代码,先将代码的含义弄清楚,然后我们在对代码稍作修改,就完成了此次的代码编写。这次实验涉及的知识较前面二个实验都多一些。比如,如何扫描键盘,如何将结果显示在数码管上,如何使用数码管(是共阴的还是共阳的),如何防抖等等。具体看上面的键盘扫描及显示的实现的注意事项。

此次实验我们基本达到题目的要求,通过这次实验我们对VHDL有了更清晰的认识。虽然实验过程中我们成员之间有争论,综合、下载、调试时感觉很累,但挺一挺就过去了,困难过后才会感觉到成功的甘甜。

第三篇:VHDL简答题总结

数据BIT与STD_LOGIC的区别?

Bit只是一个逻辑型变量,只能存在“0”和“1”,不存在不定状态和高阻态

STD_LOGIC存在U初始值,X不定,0,1,Z高阻 W弱信号不定,L弱信号1,H弱信号0,-不可能情况 2 信号和变量的异同?

延时:变量无延时 信号有延时

位置:变量在PROCESS 信号ARCHITECTUUE SIGNAL BEGIN

信号可以是全局量,只要在构造体中已定义,那么构造体内的所有地方都可以使用;变量是局部量,只能在进程、子程序中定义和使用。如果将结果带出外部,则必须将变量付给一个信号量才行。3 VHDL基本顺序和并行语句有哪些?

顺序描述语句:WAIT语句,断言语句,信号带入语句,变量赋值语句,IF语句,CASE语句,LOOP语句,NEXT语句,EXIT语句,进程调用语句,NULL语句

并行语句:进程语句,并发信号带入语句,条件信号带入语句,选择信号带入语句,并发调用语句,块语句 4 利用VHDL进行硬件设计的流程?

规格设计——行为级描述——行为级仿真——RTL级描述——RTL级仿真——逻辑综合优化——门及仿真,定时检查——输出门级网络表 5 基本硬件描述语言有哪些?

VHDL和Verilog HDL 及日本电子振兴协会开发的UDL/I语言 6 VHDL所包含库的种类有哪些?

IEEE库

STD库是VHDL的标准配置

ASIC逻辑门库

WORK库现行作业库 7 IEEE库中所包含基本类型转换函数有那些? STD_LOGIC_1164包集合

TO_STDLOGICVECTOR(A)由BIT_VECTOR变换为STD_LOGIC_VECTOR TO_BITVECTOR(A)由STD_LOGIC_VECTOR转换为BIT_VECTOR TO_STDLOGIC(A)由BIT转换为STD_LOGIC TO_BIT(A)由STD_LOGIC转换为BIT STD_LOGIC_ARITH包集合

CONV_STD_LOGIC_VECTOR(A,位长)由INTEGER、UNSIGNED、SIGNED转变为STD_LOGIC_VECTOR CON_INTEGER(A)由UNSIGNED、SIGNED转变为INTEGER STD_LOGIC_UNSIGNED包集合

CONV_INTEGER(A)由STD_LOGIC_VECTOR转变为INTEGER 8 简述基本的VHDL的程序结构有那些?

一个完整的VHDL程序包含实体(ENTITY),构造体(ARCHITECTURE),配置(CONFIGURATION),包集合(PACKAGE),库(LIBRARY)9 VHDL程序包含程序子结构有那些?

子程序是一个VHDL程序模块,这个模块利用顺序语句来定义和完成算法,因此只能使用顺序语句。VHDL子程序与其他软件语言程序中的子程序的应用目的是相似的,能更有效地完成重复性的工作。子程序有两种类型,即过程process和函数function 10 简述when else与if else的差别?

后者只能在进程内部中使用(因为是顺序结构),前者的else一定有,但if可以省略,when语句不可嵌套,而if则不然 什么是ASIC及ASIC的特点?

ASIC是指应特定用户要求和特定电子系统的需要而设计、制造的专用大规模集成电路。ASIC的特点是面向特定用户的需求,ASIC在批量生产时与通用集成电路相比具有体积更小、功耗更低、可靠性提高、性能提高、保密性增强、成本降低等优点

第四篇:VHDL课程设计报告 频率计

目录

1.前言...........................................................................................................................2 2.设计要求...................................................................................................................2 3.整体设计..................................................................................................................3 4.设计原理...................................................................................................................3 5.设计程序...................................................................................................................3

5.1顶层文件.............................................................................................................3 5.2 8位是进制计数器..............................................................................................4 5.3 10进制计数器...................................................................................................5 5.4 测频控制电路.....................................................................................................6 5.5 32位锁存器及其控制器.....................................................................................6

6.引脚锁定...................................................................................................................8 7.综合结果...................................................................................................................8

7.1 RTL电路.............................................................................................................8 7.2 测频控制电路.....................................................................................................9 7.3 8位十进制计数器..............................................................................................9 7.3 32位锁存器......................................................................................................9

8.实验结果.................................................................................................................10 7.实验总结...................................................................................................................10 参考文献......................................................................................................................12

自适应数字频率计数器设计

1.前言

传统的数字频率计一般是由分离元件搭接而成,用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差大、可靠性差。后来随着单片机的大规模的应用, 出现了不少用单片机控制的频率测量系统。相对于以前用分离元件搭接起来的频率测量系统, 单片机控制的频率测量系统在频率测量范围、频率测量精度和频率测量速度上都有了很大的提高。但由于单片机工作频率的限制、单片机内部计数器位数的限制等因素, 由单片机控制的频率测量系统无法在频率测量范围、频率测量精度和频率测量速度上取得重大突破。若再增加别的器件, 以弥补单片机的不足, 不仅会大大增加系统的复杂性, 而且不利于系统的集成化。以E D A 工具作为开发平台,运用V H D L 语言,将使整个系统大大简化,从而提高整体的性能和可靠性。本课题采用的是等精度数字频率计,在一片FPGA开发板里实现了数字频率计的绝大部分功能, 它的集成度远远超过了以往的数字频率计。又由于数字频率计最初的实现形式是用硬件描述语言写成的程序, 具有通用性和可重用性。所以在外在的条件(如基准频率的提高, 基准频率精度的提高)的允许下,只需对源程序作很小的改动, 就可以使数字频率计的精度提高几个数量级。同时对于频率精度要求不高的场合, 可以修改源程序, 使之可以用较小的器件实现, 从而降低系统的整体造价。

2.设计要求

设计一个频率计,频率测量范围为1-9999KHZ,量程分别为10、100、1M三档,要求如下: a.当读数大于999时,频率计处于超量程状态,下一次测量时,量程自动增大1档 b.当读数小于099时,频率计处于欠量程状态,下一次测量时,量程自动减小1档

c.当超过频率范围时,显示器自动溢出

3.整体设计

当被测频率进入时候,档位1、2能自动换挡实现功能,在档位1中,有一个LED灯亮(表示Hz);档位2中有2个LED灯亮(表示kHz);当计数频率超出9999kHz的时候,显示“E”而且LED灯全部熄灭,表示溢出功能。在程序代码中,必须要清晰表示出计数的运行状况。

档位1:当被测频率为0—9999Hz时候,直接显示f x的值(单位为Hz); 档位2:当被测频率为10k—9999kHz时候,显示10-9999(单位kHz);

4.设计原理

根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1 秒的输入信号脉冲计数允许的信号;1 秒计数结束后,计数值被锁入锁存器,计数器清0,为下一测频计数周期作好准备。测频控制信号可以由一个独立的发生器来产生。

5.设计程序

5.1顶层文件

LIBRARY IEEE;--频率计顶层文件 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FREQTEST IS PORT(CLK1HZ : IN STD_LOGIC;FSIN : IN STD_LOGIC;DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LED : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));END FREQTEST;ARCHITECTURE struc OF FREQTEST IS COMPONENT FTCTRL PORT(CLKK : IN STD_LOGIC;--1Hz CNT_EN : OUT STD_LOGIC;--计数器时钟使能 RST_CNT : OUT STD_LOGIC;--计数器清零 Load : OUT STD_LOGIC);--输出锁存信号 END COMPONENT;COMPONENT COUNTER PORT(FIN : IN STD_LOGIC;--时钟信号 CLR : IN STD_LOGIC;--清零信号 ENABL : IN STD_LOGIC;--计数使能信号

DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));--计数结果 END COMPONENT;COMPONENT REG32B PORT(LK : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LEDOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));END COMPONENT;SIGNAL TSTEN1 : STD_LOGIC;SIGNAL CLR_CNT1 : STD_LOGIC;SIGNAL Load1 : STD_LOGIC;SIGNAL DTO1 : STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL CARRY_OUT1 : STD_LOGIC_VECTOR(6 DOWNTO 0);BEGIN U1 : FTCTRL PORT MAP(CLKK =>CLK1HZ,CNT_EN=>TSTEN1, RST_CNT =>CLR_CNT1,Load =>Load1);U2 : REG32B PORT MAP(LK => Load1, DIN=>DTO1, DOUT => DOUT,LEDOUT=>LED);

U3 : COUNTER PORT MAP(FIN => FSIN, CLR => CLR_CNT1, ENABL => TSTEN1, DOUT=>DTO1);END struc;

5.2 8位是进制计数器

LIBRARY IEEE;--8位十进制计数器 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER IS PORT(FIN : IN STD_LOGIC;--时钟信号 CLR : IN STD_LOGIC;--清零信号 ENABL : IN STD_LOGIC;--计数使能信号

DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));--计数结果 END COUNTER;ARCHITECTURE behav OF COUNTER IS

COMPONENT COUNTER10 IS PORT(FIN : IN STD_LOGIC;--时钟信号 CLR : IN STD_LOGIC;--清零信号 ENABL : IN STD_LOGIC;--计数使能信号

DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数结果 COUT : OUT STD_LOGIC);END COMPONENT;

SIGNAL CLK1,CLK2,CLK3,CLK4,CLK5,CLK6,CLK7: STD_LOGIC;BEGIN u1 : COUNTER10 PORT MAP(FIN=>FIN,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(3 DOWNTO 0),COUT=>CLK1);u2 : COUNTER10 PORT MAP(FIN=>CLK1,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(7 DOWNTO 4),COUT=>CLK2);u3 : COUNTER10 PORT MAP(FIN=>CLK2,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(11 DOWNTO 8),COUT=>CLK3);u4 : COUNTER10 PORT MAP(FIN=>CLK3,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(15 DOWNTO 12),COUT=>CLK4);u5 : COUNTER10 PORT MAP(FIN=>CLK4,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(19 DOWNTO 16),COUT=>CLK5);u6 : COUNTER10 PORT MAP(FIN=>CLK5,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(23 DOWNTO 20),COUT=>CLK6);u7 : COUNTER10 PORT MAP(FIN=>CLK6,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(27 DOWNTO 24),COUT=>CLK7);u8 : COUNTER10 PORT MAP(FIN=>CLK7,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(31 DOWNTO 28));

END ARCHITECTURE behav;

5.3 10进制计数器

LIBRARY IEEE;--10位计数器 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER10 IS PORT(FIN : IN STD_LOGIC;--时钟信号 CLR : IN STD_LOGIC;--清零信号 ENABL : IN STD_LOGIC;--计数使能信号

DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数结果 COUT : OUT STD_LOGIC);END COUNTER10;ARCHITECTURE behav OF COUNTER10 IS SIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(FIN, CLR, ENABL)BEGIN IF CLR = '1' THEN CQI <=(OTHERS=>'0');--清零 ELSIF FIN'EVENT AND FIN = '1' THEN IF ENABL = '1' THEN IF CQI<9 THEN CQI <= CQI + 1;ELSE CQI <=(OTHERS=>'0');END IF;END IF;END IF;

IF CQI=“1001” THEN COUT<='1';ELSE COUT<='0';END IF;END PROCESS;DOUT <= CQI;END behav;

5.4 测频控制电路

LIBRARY IEEE;--测频控制电路 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY FTCTRL IS PORT(CLKK : IN STD_LOGIC;--1Hz CNT_EN : OUT STD_LOGIC;--计数器时钟使能 RST_CNT : OUT STD_LOGIC;--计数器清零 Load : OUT STD_LOGIC);--输出锁存信号 END FTCTRL;ARCHITECTURE behav OF FTCTRL IS SIGNAL Div2CLK : STD_LOGIC;BEGIN PROCESS(CLKK)BEGIN IF CLKK'EVENT AND CLKK = '1' THEN--1Hz时钟2分频 Div2CLK <= NOT Div2CLK;END IF;END PROCESS;PROCESS(CLKK, Div2CLK)BEGIN IF CLKK='0' AND Div2CLK='0' THEN RST_CNT<='1';--产生计数器清零信号 ELSE RST_CNT <= '0';END IF;END PROCESS;Load <= NOT Div2CLK;CNT_EN <= Div2CLK;END behav;

5.5 32位锁存器及其控制器

LIBRARY IEEE;--32位锁存器及控制器 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY REG32B IS PORT(LK : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LEDOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));END REG32B;ARCHITECTURE behav OF REG32B IS SIGNAL DD : STD_LOGIC_VECTOR(31 DOWNTO 0);BEGIN

PROCESS(LK, DIN)BEGIN IF LK'EVENT AND LK = '1' THEN DD<=DIN;END IF;if DD(31 DOWNTO 28)=“0000” then IF DD(27 DOWNTO 16)=“000000000000” THEN DOUT<=DD(15 DOWNTO 0);LEDOUT<=“01”;ELSIF DD(27 DOWNTO 16)/=“000000000000” THEN DOUT<=DD(27 DOWNTO 12);LEDOUT<=“11”;end if;else DOUT(15 DOWNTO 0)<=“***0”;LEDOUT<=“00”;END IF;END PROCESS;END behav;

6.引脚锁定

7.综合结果

7.1 RTL电路

7.2 测频控制电路

7.3 8位十进制计数器

7.3 32位锁存器

8.实验结果

当计数频率为4Hz(范围在0-9999Hz)的时候,此时LED灯有一个亮,计数为:0004;当计数频率为500KHz(范围在10K-9999KHz)的时候,此时设定两个LED灯都亮,计数为0500;当计数频率大于9999KHz的时候,设定此时两个LED灯都处于熄灭状态,而计数则输出一个‘E’值,表示范围超出计数范围。

7.实验总结

经系统测试表明,本图频率计的各项功能正常,能实现对频率的0~9999kHz频率范围的测量,并通过LED指示和数码管显示,操作简单,是理想频率计解决方案。

经过一个多星期的努力,本设计系统终于完成了。通过该课程设计,掌握了编译程序工作的基本过程及其各阶段的基本任务,熟悉了VHDL程序开发的总流程框图,了解了编译程序的生成过程及其相关的技术,对课本上的知识也有了更深的理解。老师常说,课本上的知识是机械的,要学会去运用,要举一反三。现在终于深刻的了解了这句话。经过这次的课程设计,发现书本上很深奥的知识变的更为简单,同样,对实验原理也了有更深的理解。知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。通过该课程设计,把死板的课本知识变得生动有趣,激发了学习的积极性。能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。

课程设计中的电路和程序比较复杂,因此调试的过程更是考验我们耐性和细心。除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计的这段时间,时刻都感到自己学的知识有多么的贫瘠。经过这次课程设计,让我对VHDL语言和FPGA有了更深的认识,操作能力有了一定的提高。明白了,要想是写出的代码能运行,需要耐心细心,毅力以及充沛的体力。只有经过多次编辑,多次编译,再多次运行,才能编写出更好的程序,有时候需要多次的更正才能达到所要的运行结果。

参考文献

[1] 潘松、黄继业,EDA技术应用教程 VHDL篇[J].北京:高等教育出版社.2010

[2] 徐成刘彦李仁发,一种全同步数字频率测量方法的研究[J].北京:高等教育出版社.2004 [3] 李云鹏王思明,基于FPGA 的等精度频率计设计[J].北京:高等教育出版社.2007

第五篇:VHDL 编程的一些心得体会

VHDL 编程的一些心得体会(转)

VHDL 是由美国国防部为描述电子电路所开发的一种语言,其全称为(Very High Speed Integrated Circuit)Hardware Description Language。与另外一门硬件描述语言 Verilog HDL 相比,VHDL 更善于描述高层的一些设计,包括系统级(算法、数据通路、控制)和行为级(寄存器传输级),而且 VHDL 具有设计重用、大型设计能力、可读性强、易于编译等优点逐渐受到硬件设计者的青睐。但是,VHDL 是一门语法相当严格的语言,易学性差,特别是对于刚开始接触 VHDL 的设计者而言,经常会因某些小细节处理不当导致综合无法通过。为此本文就其中一些比较典型的问题展开探讨,希望对初学者有所帮助,提高学习进度。

一.关于端口

VHDL 共定义了 5 种类型的端口,分别是 In, Out,Inout, Buffer及 Linkage,实际设计时只会用到前四种。In 和 Out 端口的使用相对简单。这里,我们主要讲述关于 buffer和inout 使用时的注意事项。

与 Out 端口比,Buffer 端口具有回读功能,也即内部反馈,但在设计时最好不要使用 buffer,因为 buffer类型的端口不能连接到其他类型的端口上,无法把包含该类型端口的设计作为子模块元件例化,不利于大型设计和程序的可读性。若设计时需要实现某个输出的回读功能,可以通过增加中间信号作为缓冲,由该信号完成回读功能。

双向端口 Inout 是四种端口类型中最为特殊的一种,最难以学习和掌握,为此专门提供一个简单程序进行阐述,部分程序如下:

...„

①DataB<=Din when CE=’1’ and Rd=’0’ else

②(others=>’Z’);

③ Dout<=DataB when CE=’1’ and Rd=’1’ else

④(others=>’1’);

„ „

程序中 DataB 为双向端口,编程时应注意的是,当 DataB 作为输出且空闲时,必须将其设为高阻态挂起,即有类似第②行的语句,否则实现后会造成端口死锁。而当 DataB 作为有效输入时,DataB 输出必须处于高阻态,对于该例子中即,当 CE=’1’ and Rd=’1’时,二.信号和变量

常数、信号和变量是 VHDL 中最主要的对象,分别代表一定的物理意义。常数对应于数字电路中的电源或地;信号对应某条硬件连线;变量通常指临时数据的局部存储。信号和变量功能相近,用法上却有很大不同。

表 1信号与变量主要区别

号变量

赋值延迟至少有△延时无,立即变化

相关信息有,可以形成波形无,只有当前值进程敏

感是否全局性具有全局性,可存在于多个进程中只能在某个进程或子程序中有效相互赋值关系信号不能给变量赋值变量可以给信号赋值

对于变量赋值操作无延迟,初学者认为这个特性对 VHDL 设计非常有利,但这只是理论上的。基于以下几点原因,我们建议,编程时还是应以信号为主,尽量减少变量的使用。

(1)变量赋值无延时是针对进程运行而言的,只是一个理想值,对于变量的操作往往被综合成为组合逻辑的形式,而硬件上的组合逻辑必然存在输入到输出延时。当进程内关于变量的操作越多,其组合逻辑就会变得越大越复杂。假设在一个进程内,有关于变量的 3 个级连操作,其输出延时分别为 5ns,6ns,7ns,则其最快的时钟只能达到 18ns。相反,采用信号编程,在时钟控制下,往往综合成触发器的形式,特别是对于 FPGA 芯片而言,具有丰富的触发器结构,易形成流水作业,其时钟频率只受控于延时最大的那一级,而不会与变量一样层层累积。假设某个设计为 3 级流水作业,其每一级延时分别为 10ns,11ns,12ns,则其最快时钟可达 12ns。因此,采用信号反而更能提高设计的速度。

(2)由于变量不具备信息的相关性,只有当前值,因此也无法在仿真时观察其波形和状态改变情况,无法对设计的运行情况有效验证,而测试验证工作量往往会占到整个设计 70%~80%的工作量,采用信号则不会存在这类问题。

(3)变量有效范围只能局限在单个进程或子程序中,要想将其值带出与其余进程、子模块之间相互作用,必须借助信号,这在一定程度上会造成代码不够简洁,可读性下降等缺点。

当然,变量也具有其特殊的优点,特别是用来描述一些复杂的算法,如图像处理,多维数组变换等。

三.位(矢量)与逻辑(矢量)

bit 或其矢量形式 bit_vector只有’0’和’1’两种状态,数字电路中也只有’0’和’1’两种逻辑,因此会给初学者一个误区,认为采用位(矢量)则足够设计之用,而不必像std_logic那样出现’X’,’U’,’W’各种状态,增加编程难度。但实际情况却并非如此,以一个最简单 D型触发器设计为例

„ „

① process(clk)

② begin

③ if clk’event and clk=’1’ then

④ Q<=D;

⑤ end if;

⑥ end process;

„ „

实际中 clk 对数据端 D的输入有一定的时间限制,即在 clk 上升沿附近(建立时间和保持时间之内),D必须保持稳定,否则 Q输出会出现亚稳态,如下图所示。

当 clk 和 D时序关系不满足时,由于 bit 只有’0’或’1’,系统只能随机的从’0’和’1’中给 Q 输出,这样的结果显然是不可信的;而采用 std_logic 类型,则时序仿真时会输出为一个’X’,提醒用户建立保持时间存在问题,应重新安排 D和 clk 之间时序关系。

此外,对于双向总线设计(前面已提及)、FPGA/CPLD上电配置等问题,如果没有’Z’,’X’等状态,根本无法进行设计和有效验证。

四.关于进程

进程(Process)是 VHDL 中最为重要的部分,大部分设计都会用到 Process 结构,因此掌握Process 的使用显得尤为重要。以下是初学和使用 Process 经常会出错的例子。

1.多余时钟的引入

在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序:

①process(Ctl_a)--Ctl_a即为该输入信号

② begin

③ if Ctl_a’event and Ctl_a=’1’ then

④„„;--执行相应操作

⑤ end if;

⑥ end process;

由于出现第③行这类语句,综合工具自动默认 Ctl_a 为时钟,某些 FPGA 更会强行将该输入约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a 增加一级状态

Ctl_areg 寄存,通过对 Ctl_a 和Ctl_areg 状态判断上跳与否,改正程序如下:① process(clk)

② begin

③ if clk’event and clk=’1’ then

④ Ctl_areg<=Ctl_a;--产生相邻状态

⑤ if Ctl_areg=’0’ and Ctl_a=’1’ then--上跳判断

⑥„„;--执行相应操作

⑦ end if;

⑧ end if;

⑨ end process;

程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现

象发生。其中,需注意的是 clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。

2.输出多驱动

误用 Process经常会引起输出多驱动源的发生,即在两个以上的进程内对同一信号赋值操作。

以下程序就出现了这类情况:

⑴ Proc_a: process(clk)

⑵ begin

⑶ if clk’event and clk=’1’ then

⑷ Dout<=Din_A;

⑸ end if

⑹ end process;;

⑻ Proc_b:process(sel_en)

⑼ begin

⑽ if sel_en=’1’ then

⑾ Dout<=Din_B;

⑿ end if;

⒀ end process;

进程 Proc_a 和 Proc_b 中都出现了对 Dout 的赋值语句,设计者原本的想法是,只要合理控制好 clk 和 sel_en 输入,使其不发生冲突,即 clk上升沿时 sel_en 不为’1’;sel_en 为’1’时,不出现 clk 的上升沿,这样 Proc_a,Proc_b 两个进程就不会发生冲突。但综合时,综合工具会将所有可能情况全部罗列进去,包括第⑶行和第⑽行同时成立的情况,此时对于 Dout就有 Din_A和 Din_B 两个输入驱动,Dout 不知接收哪一个,因此该程序无法综合,改正的方法是只要将两个进程合并成一个即可。

由于进程在 VHDL 中的重要性,对此专门做了一个总结如下:

(1)一个进程中不允许出现两个时钟沿触发,(Xilinx 公司 CoolRunner 系列 CPLD 支持单个时双钟的双触发沿除外)

(2)对同一信号赋值的语句应出现在单个进程内,不要在时钟沿之后加上 else 语句,如 if clk’event and clk=’1’ then-else„的结构,现有综合工具支持不了这种特殊的触发器结构

(3)当出现多层 IF语句嵌套时,最好采用 CASE 语句替代,一是减少多层嵌套带来的延时,二来可以增强程序的可读性

(4)顺序语句如 IF语句、CASE 语句、LOOP 语句、变量赋值语句等必须出现在进程、函数或子程序内部,而不能单独出现在进程之外

(5)进程内部是顺序执行的,进程之间是并行运行的;VHDL 中的所有并行语句都可以理解为特殊的进程,只是不以 Process结构出现,其输入信号和判断信号就是隐含的敏感表

五.关于 VHDL 学习中的几点说明

与软件语言相比,VHDL 最重要的特点就在于它的并行运行特性,当设计好的电路上电后,器件内部所有信号将同时并发工作,而不会以软件方式按照

程序顺序执行,即使在进程内部也是趋向并行工作的。例如以下程序:① process(clk)

② begin

③ if clk’event and clk=’1’ then

④ <=;

⑤ <=;

⑥ end if;;

⑦ end process;

综合的结果两个独立的 D 型触发器,虽然进程内部应按顺序执行,但是硬件实现后,只要采样到时钟上升沿,和 状态会同时翻转,而不会先执行的变化,然后才会去执行的转变。因此,VHDL 学习过程中,应加强硬件概念的理解,没有硬件概念或是硬件概念不强,在设计时,往往会将 VHDL 设计以软件编程的方式来处理,而得出一些不可思议的结果。

作为一门硬件描述语言,VHDL 几乎可以用来描述现有的大型系统数字电路、算法以及其它设计。但是,限于目前综合工具的水平,VHDL 中的许多语法还不能支持,例如:

dout<=din after 5 ns;

综合时就无法达到如此精度,因此这条语句主要用来编写测试激励,而很少出现在设计实体中。类似的情况还有很多,目前 VHDL 设计使用的也只是整个标准中的一部分,这也正是VHDL 的“可综合子集”性质,它一定程度上限制了 VHDL 的广泛应用,但是随着综合技术的发展,这种情况会逐渐得以改善,VHDL 也将在各个领域中发挥出愈来愈重要的作用

下载VHDL体会word格式文档
下载VHDL体会.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    VHDL八位数码管频率计课程设计

    一、课程设计要求 设计一个8位数码管显示的频率计(频率分辨率为1Hz)。 二、总体结构框图 系统时钟分频及控制待测频率计数数据锁存动态扫描数码管段选数码管位选数码管显示......

    《VHDL与可编程逻辑设计》教学大纲2011

    《VHDL与可编程逻辑设计》教学大纲 一、 总学时:36(理论学时:20 实验学时:16)学分:2.0 二、 教学目的: 现代电子设计技术的核心是EDA(Electronic Design Automation)技术,而EDA的技......

    VHDL语言EDA四人抢答器

    一.EDA技术简介 在计算机技术的推动下,20世纪末,电子技术获得了飞速的发展,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使......

    VHDL实现数字钟课设报告[推荐]

    东北大学信息学院 课程设计报告 课程设计题目:用VHDL语言实现数字钟的设计 班 级:电子1001班 学 号:20102594 姓 名:刘云飞 指导老师:李世平、李宁设计时间:2012年12月1 东北大......

    基于VHDL的多功能数字钟设计报告

    基于VHDL的多功能数字钟 设计报告 021215班 卫时章 02121451 一、设计要求 1、具有以二十四小时制计时、显示、整点报时、时间设置和闹钟的功能。 2、设计精度要求为1秒。......

    VHDL 编程的一些心得体会(共五则)

    VHDL 编程的一些心得体会(转) http://www.dzjs.net/html/EDAjishu/2007/0131/1504.html VHDL 是由美国国防部为描述电子电路所开发的一种语言,其全称为(Very High Speed In......

    VHDL实验四函数信号发生器设计.

    VHDL实验四:函数信号发生器设计 设计要求:设计一个函数信号发生器,能产生方波,三角波,正弦波,阶梯波。 设计概述:信号的输出实质上是指电压幅度随时间的变化。根据这个原理......

    基于VHDL语言的简易洗衣机控制器_图文.

    电子课程设计 ——简易洗衣机控制器设计 学院: 班级: 姓名: 学号: 指导老师: 2013年12月 目录 第一部分:设计任务与要求 (1 第二部分:总体框图 (1 第三部分:选择器件 (2 第......