vhdl介绍:
VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
vhdl特点:
1.功能强大、设计灵活
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
2.支持广泛、易于修改
由于VHDL已经成为IEEE标准所规范的硬件描述语言,大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。
3.强大的系统硬件描述能力
VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。
4.独立于器件的设计、与工艺无关
设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。
5.很强的移植能力
VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。
6.易于共享和复用
VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。
vhdl优势:
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个开发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
8位移位寄存器vhdl代码:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PORT (
data_in : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --输入的数据
n : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --移位的数量
dir : IN STD_LOGIC; --移动的方向 0:左 1:右
kind : IN STD_LOGIC_VECTOR(1 DOWNTO 0); --移动类型 00:算术移 01:逻辑移 10:循环移
clock : IN BIT; --手动时钟PULSE
data_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --移位的结果
);
END shifter;
ARCHITECTURE behav of shifter IS
BEGIN
PROCESS (data_in, n, dir, kind)
VARIABLE x,y : STD_LOGIC_VECTOR(7 DOWNTO 0);
VARIABLE ctrl0,ctrl1,ctrl2 : STD_LOGIC_VECTOR (3 DOWNTO 0);
BEGIN
IF (clock‘EVENT AND clock = ’1‘)THEN
--产生控制向量ctrl
ctrl0 := n(0) & dir & kind(1) & kind(0);
ctrl1 := n(1) & dir & kind(1) & kind(0);
ctrl2 := n(2) & dir & kind(1) & kind(0);
CASE ctrl0 IS
WHEN “0000” | “0001” | “0010” | “0100” | “0101” | “0110” =》 x := data_in; --n=0时不移动
WHEN “1000” =》 x := data_in(6 DOWNTO 0) & data_in(0); --算术左移1位
WHEN “1001” =》 x := data_in(6 DOWNTO 0) & ’0‘; --逻辑左移1位
WHEN “1010” =》 x := data_in(6 DOWNTO 0) & data_in(7); --循环左移1位
WHEN “1100” =》 x := data_in(7) & data_in(7 DOWNTO 1); --算术右移1位
WHEN “1101” =》 x := ’0‘ & data_in(7 DOWNTO 1); --逻辑右移1位
WHEN “1110” =》 x := data_in(0) & data_in(7 DOWNTO 1); --循环右移1位
WHEN others =》 null;
END CASE;
CASE ctrl1 IS
WHEN “0000” | “0001” | “0010” | “0100” | “0101” | “0110” =》 y := x; --n=0时不移动
WHEN “1000” =》 y := x(5 DOWNTO 0) & x(0) & x(0); --算术左移2位
WHEN “1001” =》 y := x(5 DOWNTO 0) & “00”; --逻辑左移2位
WHEN “1010” =》 y := x(5 DOWNTO 0) & x(7 DOWNTO 6); --循环左移2位
WHEN “1100” =》 y := x(7) & x(7) & x(7 DOWNTO 2); --算术右移2位
WHEN “1101” =》 y := “00” & x(7 DOWNTO 2); --逻辑右移2位
WHEN “1110” =》 y := x(1 DOWNTO 0) & x(7 DOWNTO 2); --循环右移2位
WHEN others =》 null;
END CASE;
CASE ctrl2 IS
WHEN “0000” | “0001” | “0010” | “0100” | “0101” | “0110” =》 data_out 《= y; --n=0时不移动
WHEN “1000” =》 data_out 《= y(3 DOWNTO 0) & y(0) & y(0) & y(0) & y(0); --算术左移
评论
查看更多