EDA复习资料大全
1.一般把EDA技术的发展分为MOS时代、c MOS时代和ASIC三个阶段。
2.EDA设计流程包括设计输入、设计实现、实际设计检验和下载编程四个步骤。
3.EDA设计输入主要包括图形输入、HDL文本输入和状态机输入。
4.时序仿真是在设计输入完成之后,选择具体器件并完成布局、布线之后进行的时序关系仿真,因此又称为功能仿真。5.VHDL的数据对象包括变量、常量和信号,它们是用来存放各种类型数据的容器。
6.图形文件设计结束后一定要通过仿真,检查设计文件是否正确。
7.以EDA方式设计实现的电路设计文件,最终可以编程下到FPGA和CPLD芯片中,完成硬件设计和验证。
8.MAX+PLUS的文本文件类型是(后缀名).VHD。
9.在PC上利用VHDL进行项目设计,不允许在根目录下进行,必须在根目录为设计建立一个工程目录。
10.VHDL源程序的文件名应与实体名相同,否则无法通过编译
二、名词解释,写出下列缩写的中文(或者英文)含义:
1. FPGA Field-Programmable Gate Array 现场可编程门阵列
2VHDL Very-High-Speed Integrated Circuit Hardware Description Language)甚高速集成电路硬件描述语言
3 HDL Hardware Description Language硬件描述语言
5 CPLD Complex Programmable Logic Device复杂可编程逻辑器件
6PLD Programmable Logic Device 可编程逻辑器件7GAL generic array logic通用阵列逻辑
https://www.360docs.net/doc/883646602.html,B Logic Array Block逻辑阵列块9. CLB Configurable Logic Block 可配置逻辑模块10 EAB Embedded Array Block 嵌入式阵列块11SOPC System-on-a-Programmable-Chip 可编程片上系统
12. LUT Look-Up Table 查找表13. JTAG Joint Test Action Group 联合测试行为组织14.IP Intellectual Property 知识产15ASIC Application Specific Integrated Circuits 专用集成电路
16 ISP In System Programmable 在系统可编程17 ICR In Circuit Re-config 在电路可重构18 RTL Register Transfer Level 寄存器传输19EDA Electronic Design Automation 电子设计自动化
1、 FPGA结构一般分为三部分:可编程逻辑块(CLB)、可编程I/O模块和可编程内部连线。
2、 CPLD的内部连线为连续式布线互连结构,任意一对输入、输出端之间的延时是固定;FPGA的内部连线为分段式布线互连结构,各功能单元间的延时不定(不可预测)。
3、大规模可编程器件主要有CPLD和FPGA两类,其中CPLD通过可编程乘积项逻辑实现其逻辑功能。基于SRAM的FPGA器件,每次上电后必须进行一次配置。FPGA内部阵列的配置一般采用在电路可重构技术,编程数据保存在静态存储器(SRAM) ,掉电易失。
4、目前世界上有十几家生产CPLD/FPGA的公司,最大的两家是:Altera,Xilinx。
5、硬件描述语言(HDL)是EDA技术的重要组成部分,是电子系统硬件行为描述、结构描述、数据流描述的语言,它的种类很多,如VHDL、Verilog HDL、AHDL
6、 WHEN_ELSE条件信号赋值语句和 IF_ELSE顺序语句的异同:
* WHEN_ELSE条件信号赋值语句中无标点,只有最后有分号;必须成对出现;是并行语句,必须放在结构体中。
* IF_ELSE顺序语句中有分号;是顺序语句,必须放在进程中
7、可编程逻辑器件设计输入有原理图输入、硬件描述语言输入和波形输入三种方式。原理图输入方式是一种最直接的设计描述方式,波形设计输入适用于时序逻辑和有重复性的逻辑函数。
硬件描述语言的突出优点是:
* 语言与工艺的无关性;语言的公开可利用性,便于实现大规模系统的设计;
* 具有很强逻辑描述和仿真功能,而且输入效率高,在不同设计输入库之间的转换非常方便,用不着对底层的电路和PLD结构的熟悉。
8、用VHDL/Veilog HDL语言开发可编程逻辑电路的完整流程:文本编辑→功能仿真→逻辑综合→布局布线→时序仿真。
*所谓综合,就是根据设计功能和实现该设计的约束条件(如面积、速度、功耗和成本等),将设计输入转换成满足要求的电路设计方案,该方案必须同时满足与其的功能和约束条件。综合的过程也是设计目标的优化过程,其目的是将多个模块化设计文件合并为一个网表文件,供布局布线使用,网表中包含了目标器件中的逻辑单元和互连的信息。
*布局布线就是根据设计者指定的约束条件(如面积、延时、时钟等)、目标器件的结构资源和工艺特性,以最优的方式对逻辑元件布局,并准确地实现元件间的互连,完成实现方案(网表)到使实际目标器件(FPGA或CPLD)的变换。
9、基于EDA软件的FPGA / CPLD设计流程为:原理图/HDL文本输入→功能仿真→综合→适配→时序仿真→编程下载→硬件测试。
* 综合是EDA设计的关键步骤,综合就是将电路的高级语言转换成低级的,可与FPGA/CPLD相映射的功能网表文件。为实现系统的速度、面积、性能的要求,需要对综合加以约束,称为综合约束。
10、构成一个完整的VHDL语言程序的五个基本结构:
实体(ENTITY)、结构体(ARCHITECURE)、配置(CONFIGURATION) 、库(LIBRARY) 、程序包
(PACKAGE) 。
*实体的由实体说明和结构体两部分组成。实体说明部分用于描述所设计系统的外部端口信号和参数的属性和设置,而结构体部分则定义了设计单元的具体功能、行为、数据流程或内部结构。
*结构体的三种描述方式,即行为级描述、数据流级描述和结构级描述。
*结构体通常由结构体名称、定义语句和并行处理语句构成。
*程序包用于存放各设计模块能共享的数据类型、常数、子程序等。
*库用于存放已编译的实体、结构体、程序包和配置,可以通过其目录进行查询和调用。在VHDL语言中,可以存在多个不同的库,但是库与库之间是独立的,不能互相嵌套。它可由用户生成或由ASIC芯片制造商提供,以便于在设计中为大家所共享。
*库用于存放已编译的实体、结构体、程序包和配置,可以通过其目录进行查询和调用。在VHDL语言中,可以存在多个不同的库,但是库与库之间是独立的,不能互相嵌套。它可由用户生成或由ASIC芯片制造商提供,以便于在设计中为大家所共享。
常用库:
(1)IEEE库:IEEE库主要包括std_logic_1164、numeric_bit、numeric_std等程序包,还有一些程序包
非IEEE标准,但并入IEEE库,如std_logic_arich、std_logic_unsigned、std_logic_signed。使用IEEE 程序包,必须声明。
(2) std库:包含 standard textio程序包。Std库符合IEEE标准,应用中不必声明。
(3) work库:用户的VHDL设计先行工作库。
(4) vital 库:包含时序程序包vital_timing和vital_primitives。设计开发过程通常不用,每个设计
实体都必须有各自完整的库说明语句和use语句。Use语句的使用将使说明的程序包对本设计实体部分全部开放,即是可视的。
11、VHDL的数据对象包括常量(constant)、变量(varuable) 和信号(signal) ,它们是用来存放各种
类型数据的容器。
12、在VHDL的端口声明语句中,端口方向包括 in 、out 、buffer 、inout、linkage 。“BUFFER”为
缓冲端口,与OUT类似,只是缓冲端口允许实体内部使用该端口信号,它可以用于输出,也可以用于端口信号的反馈。当一个结构体用“BUFFER”说明输出端口时,与其连接的另一个结构体的端口也要用BUFFER 说明。以“LINKAGE”定义的端口不指定方向,无论哪个方向的信号都可以连接。
13、VHDL的PROCESS(进程)语句是由顺序语句组成的,但其本身却是并行语句。
14、VHDL的子程序有过程(PROCEDURE) 和函数(FUNCTION) 两种类型,具有可重载性特点。
15、图形文件的扩展名是 .bdf ;矢量波形文件的扩展名是 .vwf ;使用VHDL语言,文本设计文件的扩
展名是 .vhd ;自建元件图形符号文件的扩展名.bsf;资源分配说明文件扩展名.qsf,用文本打开它可以修改引脚编号;逻辑综合会生成.edf文件;双击.qpf文件可启动QuartusII并打开已有工程。
16、图形编辑中模块间的连线有三种形式:节点线、总线和管道线
17、Quartus编译器编译FPGA工程最终生产两种不同用途的文件,它们分别是.sof和.pof。sof是SRAM Object File,下载到FPGA中,断电丢失。pof是Programmer Object File,下载到配置芯片中,上电重新配置FPGA。
18、FPGA过程中的仿真有三种:行为仿真、逻辑仿真、时序仿真。
19、IP核在EDA技术和开发中占有很重要地位,提供VHDL硬件描述语言功能块,但不涉及实现该功能模块的具体电路的IP核为软件IP。
一.问答题
1信号赋值语句在什么情况下作为并行语句?在什么情况下作顺序语句?信号赋值和变量赋值符号分别是什么?两种赋值符号有什么区别?
●信号赋值语句在进程外作并行语句,并发执行,与语句所处的位置无关。信号赋值语句在进程
内或子程序内做顺序语句,按顺序执行,与语句所处的位置有关。
●信号赋值符号为“<=”变量赋值用“:=”。信号赋值符号用于信号赋值动作,不立即生效。
变量,赋值符号用于变量赋值动作,立即生效。
2进程的敏感信号表指的是什么?简述敏感信号表在进程中的作用?
●进程的“敏感信号表”也称敏感表,是进程的激活条件,可由一个或多个信号组成,各
信号间以“,”号分隔。当敏感信号表中的任一个信号有事件发生,即发生任意变化,此时,
进程被激活,进程中的语句将从上到下逐句执行一遍,当最后一条语句执行完毕之后,进程即
进入等待挂起状态,直到下一次敏感表中的信号有事件发生,进程再次被激活,如此循环往复。
3什么是库、程序包、子程序、过程调用和函数调用?
●库和程序包用来描述和保存元件、类型说明和子程序等,以便在其它设计中通过其目录可查询、
调用。子程序由过程和函数组成。在子程序调用过程中,过程能返回多个变量,函数只能返回
一个变量。若子程序调用的是一个过程,就称为过程调用,若子程序调用的是一个函数,则称
为函数调用。过程调用、函数调用都是子程序调用。
二、VHDL程序填空
1. 下面程序是1位十进制计数器的VHDL描述,试补充完整。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT ( CLK : IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
END CNT10;
ARCHITECTURE bhv OF CNT10IS
SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN -- 边沿检测
IF Q1 > 10 THEN
Q1 <= (OTHERS => '0'); -- 置零
ELSE
Q1 <= Q1 + 1 ; -- 加1
END IF;
END IF;
END PROCESS ;
Q <= Q1;
END bhv;
2. 下面是一个多路选择器的VHDL描述,试补充完整。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY bmux IS
PORT ( sel : IN STD_LOGIC;
A, B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
Y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)) ;
END bmux;
ARCHITECTURE bhv OF bmux IS
BEGIN
y <= A when sel = '1'ELSE
B;
END bhv;
三、VHDL程序改错
仔细阅读下列程序,回答问题
LIBRARY IEEE; -- 1
USE IEEE.STD_LOGIC_1164.ALL; -- 2
ENTITY LED7SEG IS -- 3
PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); -- 4
CLK : IN STD_LOGIC; -- 5 LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); -- 6 END LED7SEG; -- 7
ARCHITECTURE one OF LED7SEG IS -- 8
SIGNAL TMP : STD_LOGIC; -- 9
BEGIN -- 10
SYNC : PROCESS(CLK, A) -- 11
BEGIN -- 12 IF CLK'EVENT AND CLK = '1' THEN -- 13
TMP <= A; -- 14
END IF; -- 15 END PROCESS; -- 16
OUTLED : PROCESS(TMP) -- 17
BEGIN -- 18 CASE TMP IS -- 19
WHEN "0000" => LED7S <= "0111111"; -- 20
WHEN "0001" => LED7S <= "0000110"; -- 21
WHEN "0010" => LED7S <= "1011011"; -- 22
WHEN "0011" => LED7S <= "1001111"; -- 23
WHEN "0100" => LED7S <= "1100110"; -- 24
WHEN "0101" => LED7S <= "1101101"; -- 25
WHEN "0110" => LED7S <= "1111101"; -- 26
WHEN "0111" => LED7S <= "0000111"; -- 27
WHEN "1000" => LED7S <= "1111111"; -- 28
WHEN "1001" => LED7S <= "1101111"; -- 29
END CASE; -- 30 END PROCESS; -- 31
END one; -- 32
1.在程序中存在两处错误,试指出,并说明理由:
第14行TMP附值错误
第29与30行之间,缺少WHEN OTHERS语句
2.修改相应行的程序:
错误1 行号:9程序改为:
TMP : STD_LOGIC_VECTOR(3 DOWNTO 0);
错误2 行号:29 程序改为:
该语句后添加WHEN OTHERS => LED7S <= "0000000";
二.改错题
1.已知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”语句。
2.已知data_in1, data_in2为STD_LOGIC_VECTOR(15 DOWNTO 0) 类型的输入端口,data_out为STD_LOGIC_VECTOR(15 DOWNTO 0)类型的输出端口,add_sub为STD_LOGIC类型的输入端口,请判断下面给出的程序片段:
●LIBRARY IEEE;
●USE IEEE.STD_LOGIC_1164.ALL;
●ENTITY add IS
●PORT(data_in1, data_in2:IN INTEGER;
●data_out:OUT INTEGER);
●END add;
●ARCHTECTURE add_arch OF add IS
●CONSTANT a:INTEGER<=2;
●BEGIN
●data_out<=( data_in1+ data_in2) * a;
●END addsub_arch;
答案:常量声明时赋初值的“<=”符号应改用“:=”符号。
3.已知Q为STD_LOGIC类型的输出端口,请判断下面的程序片段:
●ARCHITECTURE test_arch OF test IS
●BEGIN
●SIGNAL B:STD_LOGIC;
●Q<= B;
END test_arch
答案:信号SIGNAL的声明语句应该放在BEGIN语句之前。
4.已知A和Q均为BIT类型的信号,请判断下面的程序片段:
●ARCHITECTURE archtest OF test IS
●BEGIN
●CASE A IS
●WHEN …0?=>Q<=…1?;
●WHEN …1?=>Q<=…0?;
●END CASE;
●END archtest;
答案:CASE语句应该存在于进程PROCESS内。
四、阅读下列VHDL程序,画出原理图(RTL级)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY HAD IS
PORT ( a : IN STD_LOGIC;
b : IN STD_LOGIC;
c : OUT STD_LOGIC;
d : OUT STD_LOGIC
);
END ENTITY HAD;
ARCHITECTURE fh1 OF HAD IS
BEGIN
c <= NOT(a NAND b);
d <= (a OR b)AND(a NAND b);
END ARCHITECTURE fh1;
五、请按题中要求写出相应VHDL程序
1.带计数使能的异步复位计数器
输入端口:clk 时钟信号
rst 异步复位信号
en 计数使能
load 同步装载
data (装载)数据输入,位宽为10 输出端口:q 计数输出,位宽为10
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT1024 IS
PORT ( CLK, RST, EN, LOAD : IN STD_LOGIC;
DATA : IN STD_LOGIC_VECTOR (9 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0) ); END CNT1024;
ARCHITECTURE ONE OF CNT1024 IS
BEGIN
PROCESS (CLK, RST, EN, LOAD, DATA) VARIABLE Q1 : STD_LOGIC_VECTOR (9 DOWNTO 0); BEGIN IF RST = '1' THEN Q1 := (OTHERS => '0'); ELSIF CLK = '1' AND CLK'EVENT THEN IF LOAD = '1' THEN Q1 := DATA; ELSE IF EN = '1' THEN Q1 := Q1 + 1; END IF; END IF; END IF; Q <= Q1; END PROCESS; END ONE;
2. 看下面原理图,写出相应VHDL 描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY TRI_STATE IS PORT ( E, A : IN STD_LOGIC; Y : INOUT STD_LOGIC; B : OUT STD_LOGIC); END TRI_STATE;
ARCHITECTURE BEHAV OF TRI_STATE IS BEGIN PROCESS (E, A, Y) BEGIN IF E = '0' THEN B <= Y; Y <= 'Z'; ELSE B <= 'Z'; Y <= A; END IF; END PROCESS; END BEHAV; 六、综合题
下图是一个A/D 采集系统的部分,要求设计其中的FPGA 采集控制模块,该模块由三个部分构成:控制器(Control )、地址计数器(addrcnt )、内嵌双口RAM (adram )。控制器(control )是一个状态机,完成AD574的控制,和adram 的写入操作。Adram 是一个LPM_RAM_DP 单元,在wren 为?1?时允许写入数据。试分别回答问题
e a
b y
下面列出了AD574的控制方式和控制时序图
AD574逻辑控制真值表(X表示任意)
AD574工作时序:
1.要求AD574工作在12位转换模式,K12_8、
A0在control中如何设置
K12_8为‘1’,A0为‘0’
2.试画出control的状态机的状态图
类似书上图8-4
3.对地址计数器模块进行VHDL描述
输入端口:clkinc 计数脉冲
cntclr 计数器清零
输出端口:rdaddr RAM读出地址,位宽10位
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity addr_cnt is
port ( clkinc, cntclr : in std_logic;
wraddr : out std_logic_vector (9 downto 0) );
end addr_cnt;
architecture one of addr_cnt is
signal tmp : std_logic_vector (9 downto 0);
begin
process (clkinc, cntclr)
begin
if clkinc'event and clkinc = '1' then
if cntclr = '1' then
tmp <= (others => '0');
else
tmp <= tmp + 1;
end if;
end if;
end process;
wraddr <= tmp;
end one;
4.根据状态图,试对control进行VHDL描述
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity control is
port ( addata : in std_logic_vector (11 downto 0);
status, clk : in std_logic;
cs, ce, a0, rc, k12_8, clkinc : out std_logic;
rddata : out std_logic_vector (11 downto 0) );
end control;
architecture behav of control is
type con_st is (s0, s1, s2, s3, s4);
signal cst, nst : con_st;
signal lock : std_logic;
signal reg12 : std_logic_vector (11 downto 0);
begin
a0 <= '0';
k12_8 <= '1';
ce <= '1';
cs <= '0';
REGP : process (clk)
begin
if clk'event and clk = '1' then
cst <= nst;
end if;
end process;
COMP : process (cst, status, addata)
begin
case (cst) is
when s0 => rc <= '1'; lock <= '0'; nst <= s1;
when s1 => rc <= '0'; lock <= '0'; nst <= s2;
when s2 => if status = '1' then nst <= s3; end if;
rc <= '1'; lock <= '0';
when s3 => rc <= '1'; lock <= '1'; nst <= s4;
when s4 => rc <= '1'; lock <= '0'; nst <= s0;
when others => nst <= s0;
end case;
end process;
LOCKP : process (lock)
begin
if lock = '1' and lock'event then
reg12 <= addata;
end if;
end process;
rddata <= reg12;
clkinc <= lock; --(或者为NOT LOCK,延后半个时钟)
end behav;
5.已知adram的端口描述如下
ENTITY adram IS
PORT
(
data : IN STD_LOGIC_VECTOR (11 DOWNTO 0); -- 写入数据
wraddress: IN STD_LOGIC_VECTOR (9 DOWNTO 0); -- 写入地址
rdaddress: IN STD_LOGIC_VECTOR (9 DOWNTO 0); -- 读地址
wren : IN STD_LOGIC := '1'; -- 写使能
q : OUT STD_LOGIC_VECTOR (11 DOWNTO 0) -- 读出数据
);
END adram;
试用例化语句,对整个FPGA采集控制模块进行VHDL描述
library ieee;
use ieee.std_logic_1164.all;
entity daco is
port ( clk, cntclr, status : in std_logic;
addata : in std_logic_vector (11 downto 0);
rdaddr : in std_logic_vector (9 downto 0);
cs, ce, a0, rc, k12_8 : out std_logic;
rddata : out std_logic_vector (11 downto 0) );
end daco;
architecture one of daco is
component control is
port ( addata : in std_logic_vector (11 downto 0);
status, clk : in std_logic;
cs, ce, a0, rc, k12_8, clkinc : out std_logic;
rddata : out std_logic_vector (11 downto 0) );
end component;
component addr_cnt is
port ( clkinc, cntclr : in std_logic;
wraddr : out std_logic_vector (9 downto 0) );
end component;
component adram IS
PORT
(
data : IN STD_LOGIC_VECTOR (11 DOWNTO 0); -- 写入数据
wraddress: IN STD_LOGIC_VECTOR (9 DOWNTO 0); -- 写入地址
rdaddress: IN STD_LOGIC_VECTOR (9 DOWNTO 0); -- 读地址
wren : IN STD_LOGIC := '1'; -- 写使能
q : OUT STD_LOGIC_VECTOR (11 DOWNTO 0) -- 读出数据
);
END component;
signal rds : std_logic_vector (11 downto 0);
signal clkinc : std_logic;
signal wraddr : std_logic_vector (9 downto 0);
begin
u1 : control port map (addata => addata, status => status,
clk => clk, cs => cs, ce => ce, a0 => a0, rc => rc,
k12_8 => k12_8, clkinc => clkinc, rddata => rds);
u2 : addr_cnt port map (clkinc => clkinc, cntclr => cntclr, wraddr => wraddr);
u3 : adram port map (data => rds, wraddress => wraddr,
rdaddress => rdaddr, wren => '1', q => rddata);
end one;
一:4MHz到1Hz的分频器
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY count IS
PORT( clk: in STD_LOGIC;
q: out STD_LOGIC;
END count;
ARCHITECTURE a OF count IS
signal tmp: STD_LOGIC_vector(21 downto 0);
Begin
process(clk) begin
if clk'event and clk='1' then tmp<=tmp+1;end if;
end process;
q<=tmp(21);
END a;
11.在EDA工具中,能完成在目标系统器件上布局布线软件称为(C )
A.仿真器
B.综合器
C.适配器
D.下载器
12.在执行MAX+PLUSⅡ的(d )命令,可以精确分析设计电路输入与输出波形间的延时量。
A .Create default symbol B. Simulator
C. Compiler
D.Timing Analyzer
13.VHDL常用的库是(A )
A. IEEE
B.STD
C. WORK
D. PACKAGE
14.下面既是并行语句又是串行语句的是( C )
A.变量赋值
B.信号赋值
C.PROCESS语句
D.WHEN…ELSE语句
15.在VHDL中,用语句(D )表示clock的下降沿。
A. clock’EVENT
B. clock’EVENT AND clock=’1’
C. clock=’0’
D. clock’EVENT AND clock=’0’
VHDL和FPGA: 超高速硬件描述语言现场可编程门阵列
杭州电子科技大学2004年EDA技术与VHD学生考试卷答案
考试课程EDA技术与VHDL 考试日期2005年月日成绩参考答卷
课程号教师号任课教师姓名
考生姓名学号(8位)年级专业
一、单项选择题:(20分)
1.IP核在EDA技术和开发中具有十分重要的地位;提供用VHDL等硬件描述语言描述的功能块,但不涉及实现该功能块的具体电路的IP核为__________。A
A .软IP B.固IP C.硬IP D.都不是
2.综合是EDA设计流程的关键步骤,在下面对综合的描述中,_________是错误的。D
A. 综合就是把抽象设计层次中的一种表示转化成另一种表示的过程;
B. 综合就是将电路的高级语言转化成低级的,可与FPGA / CPLD的基本结构相映射的网表文件;
C. 为实现系统的速度、面积、性能的要求,需要对综合加以约束,称为综合约束;
D. 综合可理解为,将软件描述与给定的硬件结构用电路网表文件表示的映射过程,并且这种映射关系是唯一的(即综合结果是唯一的)。
3.大规模可编程器件主要有FPGA、CPLD两类,下列对FPGA结构与工作原理的描述中,正确的是__C__。
A. FPGA是基于乘积项结构的可编程逻辑器件;
B. FPGA是全称为复杂可编程逻辑器件;
C. 基于SRAM的FPGA器件,在每次上电后必须进行一次配置;
D. 在Altera公司生产的器件中,MAX7000系列属FPGA结构。
4.进程中的变量赋值语句,其变量更新是_________。A
A. 立即完成;
B. 按顺序完成;
C. 在进程的最后完成;
D. 都不对。
5.VHDL语言是一种结构化设计语言;一个设计实体(电路模块)包括实体与结构体两部分,结构体描述___________。D
A. 器件外部特性;
B. 器件的综合约束;
C. 器件外部特性与内部功能;
D. 器件的内部功能。
6.不完整的IF语句,其综合结果可实现________。A
A. 时序逻辑电路
B. 组合逻辑电路
C. 双向电路
D. 三态控制电路
7.子系统设计优化,主要考虑提高资源利用率减少功耗(即面积优化),以及提高运行速度(即速度优化);指出下列哪些方法是面积优化_________。B
①流水线设计②资源共享③逻辑优化④串行化⑤寄存器配平⑥关键路径法
A. ①③⑤
B. ②③④
C. ②⑤⑥
D. ①④⑥
8.下列标识符中,__________是不合法的标识符。B
A. State0
B. 9moon
C. Not_Ack_0
D. signall
9.关于VHDL中的数字,请找出以下数字中最大的一个:__________。A
A. 2#1111_1110#
B. 8#276#
C. 10#170#
D. 16#E#E1
10.下列EDA软件中,哪一个不具有逻辑综合功能:________。B
A. Max+Plus II
B. ModelSim
C. Quartus II
D. Synplify
第1页共5页
二、EDA名词解释,写出下列缩写的中文(或者英文)含义:(10分)
1. VHDL 超高速集成电路硬件描述语言
2. FPGA 现场可编程门阵列
3. RTL 寄存器传输级
4. SOPC 可编程片上系统
5. EAB 嵌入式阵列块
三、VHDL程序填空:(10分)
下面程序是参数可定制带计数使能异步复位计数器的VHDL描述,试补充完整。
-- N-bit Up Counter with Load, Count Enable, and
-- Asynchronous Reset
library ieee;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;
entity counter_n is
generic (width : integer := 8);
port(data : in std_logic_vector (width-1 downto 0);
load, en, clk, rst : in std_logic;
q : out std_logic_vector (width - 1 downto 0));
end counter_n;
architecture behave of counter is
signal count : std_logic_vector (width-1 downto 0);
begin
process(clk, rst)
begin
if rst = '1' then
count <= (others => …0?);―― 清零
elsif clk?event and clk = …1? then―― 边沿检测
if load = '1' then
count <= data;
elsif en = '1' then
count <= count + 1;
end if;
end if;
end process;
q <= count;
end behave;
四、VHDL程序改错:(10分)
仔细阅读下列程序,回答问题
1 LIBRARY IEEE;
2 USE IEEE.STD_LOGIC_1164.ALL;
3
4 ENTITY CNT10 IS
5 PORT ( CLK : IN STD_LOGIC ;
6 Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
7 END CNT10;
8 ARCHITECTURE bhv OF CNT10 IS
9 SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
10 BEGIN
11 PROCESS (CLK) BEGIN
12 IF RISING_EDGE(CLK) begin
13 IF Q1 < 9 THEN
14 Q1 <= Q1 + 1 ;
15 ELSE
16 Q1 <= (OTHERS => '0');
17 END IF;
18 END IF;
19 END PROCESS ;
20 Q <= Q1;
21 END bhv;
1. 在MAX+PlusII中编译时,提示的第一条错误为:
Error: Line 12: File e:\mywork\test\cnt10.vhd: VHDL syntax error: If statement must have THEN, but found BEGIN instead
指出并修改相应行的程序(如果是缺少语句请指出大致的行数):
错误1 行号:12 程序改为:IF RISING_EDGE(CLK) THEN
错误2 行号:3 程序改为:USE IEEE.STD_LOGIC_UNSIGNED.ALL;
12 行if语句配套关键字是then而非begin
3 行程序中使用了+号重载函数,应包含使用对应程序包ieee.std_logic_unsigned.all
2. 若编译时出现如下错误,请分析原因。
当前编译的程序文件没有放在指定文件夹内,所以系统找不到WORK工作库。
第2页共5页
五、VHDL程序设计:(15分)
设计一数据选择器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(1 downto 0); -- 选择信号输入
Ain, Bin : in std_logic_vector(1 downto 0); -- 数据输入
Cout : out std_logic_vector(1 downto 0) );
End mymux;
Architecture one of mymux is
Begin
Process (sel, ain, bin)
Begin
If sel = “00” then cout <= ain or bin;
Elsif sel = “01” then cout <= ain xor bin;
Elsif sel = “10” then cout <= ain and bin;
Else cout <= ain nor bin;
End if;
End process;
End one;
Architecture two of mymux is
Begin
Process (sel, ain, bin)
Begin
Case sel is
when “00” => cout <= ain or bin;
when “01” => cout <= ain xor bin;
when “10” => cout <= ain and bin;
when others => cout <= ain nor bin;
End case;
End process;
End two;
Architecture three of mymux is
Begin
Cout <= ain or bin when sel = “00” else
Ain xor bin when sel = “01” else
Ain and bin when sel = “10” else ain nor bin;
End three;
六、根据原理图写出相应的VHDL程序:(15分)
Library ieee;
Use ieee.std_logic_1164.all;
Entity mycir is
Port ( din, clk : in std_logic;
Qout : out std_logic);
End mycir;
Architecture behave of mycir is
Signal a, b, c;
Begin
Qout <= c nand (a xor b);
Process (clk)
Begin
If clk?event and clk = …1? then
A <= din;
B <= A;
C <= B;
End if;
End process;
End behave;
第3页共5页
七、综合题:(20分)
(一)已知状态机状态图如图a所示;完成下列各题:
图a 状态图
图b 状态机结构图
1. 试判断该状态机类型,并说明理由。
该状态机为moore型状态机,输出数据outa和输入ina没有直接逻辑关系,outa是时钟clk的同步时序逻辑。
2. 根据状态图,写出对应于结构图b,分别由主控组合进程和主控时序进程组成的VHDL有限状态机描述。
Library ieee;
Use ieee.std_logic_1164.all;
Entity mooreb is
Port (clk, reset : in std_logic;
Ina : in std_logic_vector (1 downto 0);
Outa : out std_logic_vector (3 downto 0) );
End mooreb;
Architecture one of mooreb is
Type ms_state is (st0, st1, st2, st3);
Signal c_st, n_st : ms_state;
Begin
Process (clk, reset)
Begin
If reset = …1? then c_st <= st0;
Elsif clk?event and clk = …1? then c_st <= n_st;
End if;
End process;
Process (c_st)
Begin
Case c_st is
When st0 => if ina = “00” then n_st <= st0;
Else n_st <= st1;
End if;
Outa <= “0101”;
When st1 => if ina = “00” then n_st <= st1;
Else n_st <= st2;
End if;
Outa <= “1000”;
When st2 => if ina = “11” then n_st <= st0;
Else n_st <= st3;
End if;
Outa <= “1100”;
When st3 => if ina = “11” then n_st <= st3;
Else n_st <= st0;
End if;
Outa <= “1101”;
When others => n_st <= st0;
End case;
End process;
End one;
3. 若已知输入信号如下图所示,分析状态机的工作时序,画出该状态机的状态转换值(c_state)和输出控制信号(out_a);
4. 若状态机仿真过程中出现毛刺现象,应如何消除;试指出两种方法,并简单说明其原理。
方法1,添加辅助进程对输出数据进行锁存
方法2,将双进程状态机改写为单进程状态机,其输出也是锁存过了,故能消除毛刺
方法3,使用状态位直接输出型状态机编码方式,其输出直接由当前状态输出,也没有毛刺
第4页共5页
(二)已知一个简单的波形发生器的数字部分系统框图如下图所示
图中lcnt、lrom都是在MAX+PlusII中使用MegaWizard调用的LPM模块,其VHDL描述中Entity部分分别如下:
ENTITY lcnt IS
PORT
(
clock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0)
);
END lcnt;
ENTITY lrom IS
PORT
(
address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);
q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0)
);
END lrom;
试用VHDL描述该系统的顶层设计(使用例化语句)。
Library ieee;
Use ieee.std_logic_1164.all;
Entity mysg is
Port (clk : in std_logic;
To_da : out std_logic_vector (9 downto 0) );
End mysq;
Architecture one of mysq is
Signal addr : std_logic_vector (9 downto 0);
Component lcnt
Port (clock : in std_logic;
Q : out std_logic_vector (9 downto 0) );
End component;
Component lrom
Port (address : in std_logic_vector (9 downto 0);
Q : out std_logic_vector (9 downto 0) );
End component;
Begin
U1 : lcnt port map (clock => clk, q => addr);
U2 : lrom port map (address => addr, q => to_da);
End one;
第5页共5页
七、综合题:(20分)
根据如下所示状态图及其状态机结构图,回答问题
1.试判断该状态机类型,并说明理由。
改状态机可以为mealy型状态机,当输入ina变化时可影响输出outa立即变化
2.请问如何消除状态机输出信号毛刺?试列出至少两种方法,并说明理由。
方法1,添加辅助进程对输出数据进行锁存
方法2,将双进程状态机改写为单进程状态机,其输出也是锁存过了,故能消除毛刺
方法3,使用状态位直接输出型状态机编码方式,其输出直接由当前状态输出,也没有毛刺
3.试由b、c两图中任选一图写出其完整的VHDL程序。LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY EX7 IS
PORT (CLK, RESET: IN STD_LOGIC;
INA: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
OUTA: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END EX7;
-- MOORE型状态机
ARCHITECTURE ONE OF EX7 IS
TYPE STATE IS (S0, S1, S2, S3);
SIGNAL C_ST : STATE;
BEGIN
PROCESS (CLK, RESET, INA)BEGIN
IF RESET = '1' THEN C_ST <= S0; OUTA <= (OTHERS => '0');
ELSIF RISING_EDGE(CLK) THEN
CASE C_ST IS
WHEN S0 =>IF INA = "101" THEN OUTA <= "0010";
ELSIF INA = "111" THEN OUTA <= "1100";END IF;
C_ST <= S1;
WHEN S1 =>IF INA = "000" THEN C_ST <= S1;
ELSIF INA = "110" THEN C_ST <= S2;END IF;
OUTA <= "1001";
WHEN S2 =>IF INA = "100" THEN C_ST <= S2;
ELSIF INA = "011" THEN C_ST <= S1;ELSE C_ST <= S3;END IF;
OUTA <= "1111";
WHEN S3 =>IF INA = "101" THEN OUTA <= "1101";
ELSIF INA = "011" THEN OUTA <= "1110";END IF;
C_ST <= S3;
WHEN OTHERS => C_ST <= S0;OUTA <= (OTHERS => '0');
END CASE;
END IF;
END PROCESS;
END ONE;
-- MEALY型状态机
ARCHITECTURE TWO OF EX7 IS
TYPE STATE IS (S0, S1, S2, S3);
SIGNAL C_ST, N_ST : STATE;
BEGIN
REG : PROCESS (CLK, RESET)BEGIN
IF RESET = '1' THEN C_ST <= S0;
ELSIF CLK'EVENT AND CLK = '1' THEN C_ST <= N_ST;END IF;
END PROCESS;
COM : PROCESS (C_ST, INA)BEGIN
CASE C_ST IS
WHEN S0 =>N_ST <= S1;IF INA = "101" THEN OUTA <= "0010";
ELSIF INA = "111" THEN OUTA <= "1100";ELSE OUTA <= "0000";END IF;
WHEN S1 =>OUTA <= "1001";IF INA = "000" THEN N_ST <= S1;
ELSIF INA = "110" THEN N_ST <= S2;ELSE N_ST <= S1;END IF;
WHEN S2 =>OUTA <= "1111";IF INA = "100" THEN N_ST <= S2;
ELSIF INA = "011" THEN N_ST <= S1;ELSE N_ST <= S3;END IF;
WHEN S3 =>IF INA = "101" THEN OUTA <= "1101";
ELSIF INA = "011" THEN OUTA <= "1110";ELSE OUTA <= "0000";END IF;
N_ST <= S3;
WHEN OTHERS => N_ST <= S0;OUTA <= (OTHERS => '0');
END CASE;
END PROCESS;
END TWO;
第4页共5页
4. 已知一个简单的波形发生器的数字部分系统框图如下图所示:
图中DOWNCNT、MYROM都是在MAX+PlusII中使用MegaWizard调用的LPM模块,其VHDL描述中Entity部分分别如下:
ENTITY DOWNCNT IS
PORT
(
clock: IN STD_LOGIC ;
q: OUT STD_LOGIC_VECTOR (5 DOWNTO 0)
);
END DOWNCNT;
ENTITY myrom IS
PORT
(
address: IN STD_LOGIC_VECTOR (5 DOWNTO 0);
q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END myrom;
试用VHDL描述该系统的顶层设计(使用例化语句)。
Library ieee;
Use ieee.std_logic_1164.all;
Entity mysg is
Port (clk : in std_logic;
To_da : out std_logic_vector (7 downto 0) );
End mysq;
Architecture one of mysq is
Signal addr : std_logic_vector (5 downto 0);
Component lcnt
Port (clock : in std_logic;
Q : out std_logic_vector (5 downto 0) );
End component;
Component lrom
Port (address : in std_logic_vector (5 downto 0);
Q : out std_logic_vector (7 downto 0) );
End component;
Begin
U1 : lcnt port map (clock => clk, q => addr);
U2 : lrom port map (address => addr, q => to_da);
End one;