VHDL
这是一篇关于案例VHDL 的案例,这是一些理论期末的题目,旨在考试前复习作为考试资料的目的的案例,充分在考试前复习是对每个考生来说是非常重要的,里面的考点有关理论,案例运用,和vhdl只是的掌握。
什么是VHDL(百度百科)?简述VHDL的发展史。
答: VHDL是美国国防部为电子项目设计承包商提供的,签定合同使用的,电子系统硬件描述语言。1983年成立VHDL语言开发组,1987年推广实施,1993年扩充改版。案例VHDL是IEEE标准语言,广泛用于数字集成电路逻辑设计。
简述案例VHDL设计实体的结构。
答:实体由实体名、类型表、端口表、实体说明部分和实体语句部分组成。根据IEEE标准,实体组织的一般格式为:
ENTITY 实体名 IS
[GENERIC(类型表);] –可选项
[PORT(端口表);] –必需项
实体说明部分; –可选项
[BEGIN
实体语句部分;]
END [ENTITY] [实体名];
设计一个4位计数器。
答: 用行为描述方法设计一个4位计数器如下,其它描述方法,读者可自行设计。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
ENTITY countA IS
PORT (clk,clr,en:IN STD_LOGIC;
Qa,qb,qc,qd:OUT STD_LOGIC);
END countA;
ARCHITECTURE example OF countA IS
SIGNAL count_4:STD_LOGIC_vector (3 DOWNTO 0);
BEGIN
Qa <= count_4(0); Qb <= count_4(1); Qc <= count_4(2); Qd <= count_4(3); PROCESS (clk,clr) BEGIN IF (clr = '1' ) THEN Count_4 <= "0000"; ELSIF (clk'EVENT AND clk = '1' ) THEN IF (en = '1' ) THEN IF (count_4 = "1111") THEN count_4 <= "0000"; ELSE count_4 <= count_4+ '1'; END IF; END IF; END IF; END PROCESS; END example;
4.什么叫对象?对象有哪几个类型?
答:在案例VHDL语言中,凡是可以赋于一个值的客体叫对象(object)。
VHDL对象包含有专门数据类型,主要有4个基本类型:常量(CONSTANT)、
信号(SIGNAL)、变量(VARIABLE)和文件(FILES)。
5.案例VHDL语言定义的标准类型有哪些?
答 VHDL语言标准所定义的标准数据类型
(1) 整数类型(INTEGER TYPE)
(2) 实数类型或浮点类型(REAL TYPE & FLOATING TYPE)
(3) 位类型(BIT TYPE)
(4) 位矢量类型(BIT_VECTOR TYPE)
(5) 布尔类型(BOOLEAN TYPE)
(6) 字符类型(CHARACTER TYPE)
(7) 时间类型或物理类型(TIME TYPE & PHYSICAL TYPE)
(8) 错误类型(NOTE,WARNIING,ERROR,FAILURE TYPE)
(9) 自然数、整数类型(NATURAL TYPE)
(10) 字符串类型(TRING TYPE)
6.简述案例VHDL语言操作符的优先级。
答: 在表2.1中,取反和取绝对值优先级较高,
与、或逻辑运算的优先级低于算术运算的优先级。
7.哪3种方法可用来进行类型转换?
答:进行不同类型的数据变换,
有3种方法:类型标记法、函数转换法和常数转换法。
8.什么叫进程?简述进程的工作方式。
答:进程(process)是由外部信号触发执行的一段程序。进程语句是并行处理语句,即各个进程是同时处理的,在结构体中多个Process语句是同时并发运行的。在进程内部是顺序执行的。Process语句在案例VHDL程序中,是描述硬件并行工作行为的最常用、最基本的语句。
进程Process语句中一般带有几个信号量例表,称为该进程的敏感量表。这些信号无论哪一个发生变化都将启动Process进程。一旦启动,进程Process中的程序将从上到下顺序执行一遍,由新变化的量引导进程产生变化结果输出。当进程的最后一个语句执行完成后,就返回到进程开始处,等待敏感量的新变化,引发进程的再一次执行。周而复始,循环往复,以至无穷。这就是进程的执行过程。
9什么叫模块?区分模块与进程。
答:模块(Block)语句是结构体中积木化设计语言,适用于复杂项目设计。
Block块是一个独立的子结构,可以包含PORT语句、GENERIC语句,允许设计者通过这两个语句将Block块内的信号变化传递给Block块的外部信号。同样,也可以将Block块的外部信号变化传递给Block块的内部信号。
对VHDL语言中的Block模块进行仿真时,Block模块中所描述的各个语句是可以并发执行的,和模块中的语句书写顺序无关。进程语句是一段程序,这段程序是顺序执行的。
10.用结构描述法和GENERATE语句设计一个8位移位寄存器。
答:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY shift_register IS
PORT(a,clk: IN STD_LOGIC;
b: OUT STD_LOGIC);
END ENTITY shift_regester;
ARCHITECTURE eight_BIT_shift_register OF shift_register IS
COMPONENT dff -- dff元件调用
PORT(a,Clk: IN STD_LOGIC;
b: OUT STD_LOGIC);
END COMPONENT;
SIGNAL X: STD_LOGIC_VECTOR(0 TO 4);
BEGIN
X(0) <= a; dff1:dff PORT MAP (X(0),clk,Z(1)); dff2:dff PORT MAP (X(1),clk,Z(2)); dff3:dff PORT MAP (X(2),clk,Z(3)); dff4:dff PORT MAP (X(3),CLK,Z(4)); dff5:dff PORT MAP (X(4),CLK,Z(5)); dff6:dff PORT MAP (X(5),CLK,Z(6)); dff7:dff PORT MAP (X(6),CLK,Z(7)); dff4:dff PORT MAP (X(7),CLK,Z(8)); B<=X(8); END ARCHITECTURE eight_bit_shift_register;
10设计一个加法器,
答:半加器及全加器VHDL程序设计(1)。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY full_adder IS
PORT (a,b,cin:IN STD_LOGIC;
Sum,co:OUT STD_LOGIC);
END full_adder;
ARCHITECTURE full1 OF full_adder IS
COMPONENT half_adder
PORT (a,b:IN STD_LOGIC;
S,co:OUT STD_LOGIC);
END COMPONENT;
SIGNAL u0_co,u0_s,u1_co:STD_LOGIC;
BEGIN
U0:half_adder PORT MAP (a,b,u0_s,u0_co);
U1:half_adder PORT MAP (u0_s,cin,sum,u1_co);
Co <= u0_co OR u1_co; END full1;
半加器及全加器VHDL程序设计(2)。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY half_adder IS
PORT (a,b:IN STD_LOGIC;
S,co:OUT STD_LOGIC);
END half_adder;
ARCHITECTURE half1 OF half_adder IS
SIGNAL c,d:STD_LOGIC;
BEGIN
C <= a OR b; D <= a NAND b; Co <= NOT d; S <= c AND d; END half1;
11简述层次化设计的过程。
答:层次化设计是指对于一个大型设计任务,将目标层层分解,在各个层次
上分别设计的方法。有些设计,在一些模块的基础上,通过搭建积木的方法
进行设计。有人称,在整个设计任务上进行行为描述的设计方法,称为高层
次设计,而从事某一模块、某一元件行为设计称为底层设计方法。
12什么是库,程序包,子程序,过程调用,函数调用?
答:库(libraries)和程序包(package)用来描述和保存元件、类型说明、函数、模块等,以便在其他设计中可随时引用它们。
库(libraries)是用来存储和放置可编译的设计单元的地方,通过其目录可查询、调用。设计库中的设计单元(实体说明、结构体、配置说明、程序包说明和程序包体)可以用作其他VHDL描述的资源。
函数和过程统称为子程序。
子程序由过程和函数组成。在子程序调用过程中,过程能返回多个变量,函数能返回一个变量。若子程序调用是一个过程,就称为过程调用;若子程序调用是一个函数,则称为函数调用。过程调用和函数调用都是子程序调用。
函数的参数都是输入参数。
过程的参数有输入、输出和双向参数。
函数有顺序函数、并行函数。
过程有顺序过程、并行过程。
CLK信号怎样用VHDL语言描述?
答:时钟信号的上升沿的描述:
if clk‘event and clk = ‘1’ then …;
时钟信号的下降沿的描述:
if clk ‘event and clk = ‘1’ then …;
异步复位怎样用VHDL语言描述?
答:当复位信号低电平有效时,VHDL的描述为:
if reset = ‘0’ then …;
当复位信号高电平有效时, VHDL的描述为:
if reset =‘1’ then …;
15 设计一个八位编码器。
答: 八位编码器的VHDL参考程序设计如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY priotyencoder IS
PORT (d : IN Std_Logic_Vector (7 Downto 0);
E1: IN Std_Logic;
GS,E0: OUT BIT STD_LOGIC;
Q : OUT Std_Logic_Vector(2 Downto 0);
END priotyencoder;
ARCHITECTURE encoder OF prioty encoder IS
BEGIN
P1: PROCESS ( d )
BEGIN
IF ( d(0) = 0 AND E1 = 0 ) THEN
Y <= 111; GS <= 0 ; E0 <= 1 ; ELSIF (d(1) = 0 AND E1 = 0 ) THEN Q <= 110; GS <= 0 ; E0 <= 1 ; ELSIF (d(2) = 0 AND E1 = 0 ) THEN Q <= 101 ; GS <= 0 ; E0 <= 1 ; ELSIF (d(3) = 0 AND E1= 0 ) THEN Q <= 100 ; GS <= 0 ; E0 <= 1 ; ELSIF (d(4) = 0 AND E1= 0 ) THEN Q <= 011 ; GS <= 0 ; E0 <= 1 ; ELSIF (d(5) = 0 AND E1= 0 ) THEN Q <= 010 ; GS <= 0 ; E0 <= 1 ; ELSIF (d(6) = 0 AND E1 = 0 ) THEN Q <= 001 ; GS<= 0 ; E0<= 1 ; ELSIF (d(7) = 0 AND E1 = 0 ) THEN Q <= 000 ; GS <= 0 ; E0 <= 1 ; ELSIF (E1 = 1 ) THEN Q <= 111 ; GS <= 1 ; E0 <= 1 ; ELSIF (d = 1111 1111 AND E1 = 0 ) THEN Q <= 111 ; GS <= 1 ; E0 <= 0 ; END IF; END PROCESS P1; END encoder;
设计一个三八译码器。
答: 三八译码器的VHDL参考程序设计如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY decoder3_8 IS
PORT (a,b,c,g1,g2a,g2b:IN STD_LOGIC;
Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END decoder3_8;
ARCHITECTURE rtl OF decoder3_8 IS
SIGNAL indata:STD_LOGIC_VECTOR (2 DOWNTO 0);
BEGIN
Indata <= c & b & a; PROCESS (indata,g1,g2a,g2b) BEGIN IF (g1 = 1 AND g2a = 0 AND g2b = 0 ) THEN CASE indata IS WHEN 000 => y <= 11111110 ; WHEN 001 => y <= 11111101 ; WHEN 010 => y <= 11111011 ; WHEN 011 => y <= 11110111 ; WHEN 100 => y <= 11101111 ; WHEN 101 => y <= 11011111 ; WHEN 110 => y <= 10111111 ; WHEN 111 => y <= 01111111 ; WHEN OTHERS=> y <= XXXXXXXX ; END CASE; ELSE Y <= 11111111 ; END IF; END PROCESS; END rtl;
16、改正以下程序中的错误,简要说明原因,并指出可综合成什么电路。
1.
library ieee;
use ieee.std_logic_1164.all;
entity d_flip_flop is
port(d, clk: in std_logic;
q: out std_logic);
end d_flip_flop;
architecture rtl of d_flip_flop is
begin
if clk’event and clk=’1’ then
q<=d; end if; end rtl;
library ieee;
use ieee.std_logic_1164.all;
entity d_latch is
port(d, ena: in std_logic;
q: out std_logic);
end d_latch;
architecture rtl of d_latch is
begin
if ena = ’1’ then
q<=d; end if; end rtl;
3.library ieee;
use ieee.std_logic_1164.all;
entity test is
port(d, clk: in std_logic;
q: out std_logic);
end test;
architecture rtl of test is
begin
process(clk)
begin
wait until clk’event and clk=’1’
q<=d; end process; end rtl;
4.library ieee;
use ieee.std_logic_1164.all;
entity test is
port(d1, d2: in std_logic;
sel: in std_logic;
q: out std_logic);
end test;
architecture rtl of test is
begin
process(d1, d2, sel)
begin
case sel is
when ‘0’ => q <= d1; when ‘1’ => q <= d2; end case; end process; end rtl;
5.library ieee;
use ieee.std_logic_1164.all;
entity test is
port(d1, d2: in std_logic;
sel: in std_logic;
q: out std_logic);
end test;
architecture rtl of test is
begin
process(d1, d2, sel)
begin
q<=d1 when sel = ’0’ else d2; end process; end rtl;
6.library ieee;
use ieee.std_logic_1164.all;
entity test is
port(clk: in std_logic;
count: buffer std_logic_vector(3 downto 0));
end test;
architecture rtl of test is
begin
process(clk)
begin
if clk’event and clk=’1’ then
count<=count+1; end if; end process; end rtl;
17、用VHDL设计电路:
1.设计一个2输入与门
2.设计一个四选一选择器。
3.设计一个3-8译码器。
4.设计一个8位的串入串出移位寄存器。
5.设计一个具有置数功能、使能端、清除端的13进制计数器
18. 判断改错题
1. 已知A和Q均为BIT类型的信号,请判断下面的程序片断:
ARCHITECTURE test OF test IS
BEGIN
CASE A IS
WHEN ‘0’ => Q <= ‘1’ ;
WHEN ‘1’ => Q <= ‘0’ ;
END CASE ;
END test ;
【参考答案】:
CASE语句应该存在于进程PROCESS内。
2. 已知Q为STD_LOGIC类型的输出端口,请判断下面的程序片断:
ARCHITECTURE test OF test IS
BEGIN
SIGNAL B :STD_LOGIC ;
Q <= B ;
END test ;
【参考答案】:
信号SIGNAL的申明语句应该放在BEGIN语句之前。
4. 已知A和B均为STD_LOGIC类型的信号,请判断下面的语句:
A <= ‘0’ ;
B <= ‘x’ ;
【参考答案】:
不定态符号应该由小写的‘x’改为大写的‘X’。
5. 已知A为INTEGER类型的信号,B为STD_LOGIC类型的信号,请判断下面的程序片断:
ARCHITECTURE test OF test IS
BEGIN
B <= A ;
END test ;
【参考答案】:
A和B的数据类型不一致,不能相互赋值。
6. 已知sel是STD_LOGIC_VECTOR(1 DOWNTO 0)类型信号,而a、b、c、d、q均为STD_LOGIC类型信号,请判断下面给出的CASE语句:
CASE sel IS
WHEN “00” => q <= a ;
WHEN “01” => q <= b ;
WHEN “10” => q <= c ;
WHEN “11” => q <= d ;
END CASE ;
【参考答案】:
CASE语句缺“WHEN OTHERS”语句。
19. 简述Top-Down设计方法及其基本步骤。
【参考答案】: 所谓Top-Down的设计过程是指从系统硬件的高层次抽象描述向最底层物理描述的一系列转换过程。具体讲这一过程由功能级、行为级描述开始;寄存器传输(RTL)级描述为第一个中间结果;再将RTL级描述由逻辑综合得到网表(Net-list)或电路图;由网表即可自动生成现场可编程门阵列(FPGA)/复杂可编程逻辑器件(CPLD)或专用集成电路(ASIC),从而得到电路与系统的物理实现。
20. 请从申明格式、赋值符号、赋值生效时间、作用范围等方面对信号和变量进行比较分析。
【参考答案】: ① 申明时关键字不一样,变量为:VARIABLE;信号为:SIGNAL。但申明时赋初值均用“:=”符号。
②赋值符号不同:信号赋值用“﹤=”;变量赋值用“:=”。
③赋值生效时间:信号赋值△延时后生效;变量赋值立即生效。
④声明引用范围:信号在构造体内(进程外)申明,整个构造体内有效;变量主要在进程内申明,只在进程内有效。
20. VHDL程序主要有三种描述方式:行为描述方式、RTL描述方式、结构描述方式。
21. VHDL程序中数值的载体称为对象。VHDL中有四种对象,分别是:常量(CONSTANT)、变量(VARIABLE)、信号(SIGNAL)、文件(FILE)。
22、在VHDL中,(D )的数据传输是立即发生的,不存在任何延时的行为。
A、信号; B、常量; C、数据; D、变量
23、在VHDL中,(A )的数据传输是不是立即发生的,目标信号的赋值需要一定的延时时间。
A、信号; B、常量; C、数据; D、变量
24、在VHDL中,为目标变量赋值的符号是(C )。
A、=: ; B、= ; C、:= ; D、<=
23、在VHDL中,为目标信号赋值的符号是(D )。
A、=: ; B、= ; C、:= ; D、<=
25、在VHDL中,定义信号名时,可以用( C)符号为信号赋初值。
A、=: ; B、= ; C、:= ; D、<=
26设计一数据选择器MUX,其系统模块图和功能表如下图所示。试采用下面三种方式中的两种来描述该数据选择器MUX的结构体。
(a) 用if语句。 (b) 用case 语句。 (c) 用when else 语句。
Library ieee;
Use ieee.std_logic_1164.all;
Entity mymux is
Port (sel : in std_logic_vector; — 选择信号输入
Ain, Bin : in std_logic_vector; — 数据输入
Cout : out std_logic_vector;) — 数据输出
End mymux;
案例vhdl
2018-02-23