6. 对于信号和变量的说法,哪一个是不正确的: A.信号用于作为进程中局部数据存储单元 B.变量的赋值是立即完成的 A C.信号在整个结构体内的任何地方都能适用D.变量和信号的赋值符号不一样 7. 下列状态机的状态编码, A. 状态位直接输出型编码方式有“输出速度快、难以有效控制非法状态出现”这个特点。A B.一位热码编码 一、选择题:(20 分) 1. 大规模可编程器件主要有 FPGA、CPLD 两类,下列对 CPLD 结构与工作原理的描述中,正确的是: A. CPLD 是基于查找表结构的可编程逻辑器件 B. CPLD 即是现场可编程逻辑器件的英文简称 C. 早期的 CPLD 是从 FPGA 的结构扩展而来 D. 在 Xilinx 公司生产的器件中,XC9500 系列属 CPLD 结构 2. 基于 VHDL 设计的仿真包括有①门级时序仿真、②行为仿真、③功能仿真和④前端功能仿真这四种,按照自顶向下的设计流程,其先后顺序应该是: A.①②③④ B.②①④③ C.④③②① D D.②④③① D C.顺序编码 D.格雷编码 8. VHDL 语言共支持四种常用库,其中哪种库是用户的 VHDL 设计现行工作库: A.IEEE 库 B.VITAL 库 C.STD 库 D.WORK 工作库 9. 下列 4 个 VHDL 标识符中正确的是: A.10#128# B. C. D B 3. IP 核在 EDA 技术和开发中具有十分重要的地位,IP 分软 IP、固 IP、硬 IP;下列所描述的 IP 核中,对于固 IP 的正确描述为: D 6#E#E1 4HC124 A. 提供用 VHDL 等硬件描述语言描述的功能块,但不涉及实现该功能块的具体电路D. X_16 B.提供设计的最总产品——模型库 C.以可执行文件的形式提交用户,完成了综合的功能块 D.都不是 4. 下面对利用原理图输入设计方法进行数字电路系统设计,哪一种说法是正确的: A.原理图输入设计方法直观便捷,很适合完成较大规模的电路系统设计 B.原理图输入设计方法一般是一种自底向上的设计方法 C.原理图输入设计方法无法对电路进行功能描述D.原理图输入设计方法不适合进行层次化设计 5. 在 VHDL 语言中,下列对进程(PROCESS)语句的语句结构及语法规则的描述中,不正确的是: A.PROCESS 为一无限循环语句 B.敏感信号发生更新时启动进程,执行完成后,等待下一次进程启动C.当前进程中声明的变量不可用于其他进程 D.进程由说明语句部分、并行语句部分和敏感信号参数表三部分组成 D B 10.下列语句中,不属于并行语句的是: A.进程语句B.CASE 语句C.元件例化语句 D.WHEN…ELSE…语句 B 二、EDA 名词解释(10 分) 写出下列缩写的中文(或者英文)含义: 1. ASIC 2. FPGA 3. IP 4. JTAG 5. HDL 专用集成电路 现场可编程门阵列 知识产权核(软件包) 联合测试行动小组 硬件描述语言
三、VHDL 程序填空:(10 分)
以下程序是一个 BCD 码表示 0~99 计数器的 VHDL 描述,试补充完整。
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
四、VHDL 程序改错:(10 分)
仔细阅读下列程序,回答问题
entity cnt100b is
port(
clk, rst, en : in std_logic;
cq : out std_logic_vector(7 downto 0); cout: out std_logic);
end entity cnt100b;
-- 计数输出 -- 进位输出
architecture bhv of cnt100b is begin
process (clk, rst, en)
variable cqi : std_logic_vector(7 downto 0); begin
if rst = '1' then
cqi := (others => ‘0’); -- 计数器清零复位 else
if clk’event and clk = ‘1’ then
if en = '1' then
if cqi(3 downto 0) < \
cqi := cqi + 1; else
if cqi(7 downto 4) < \
cqi := cqi + 16; else
cqi := (others => '0'); end if;
-- 上升沿判断
-- 比较低4位 -- 计数加1
-- 比较高4位
cqi (3 downto 0) := “0000”; end if; end if;
end if; end if;
-- 低4位清零
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MOORE1 IS
PORT ( DATAIN : IN STD_LOGIC_VECTOR(1 DOWNTO 0); CLK, RST: IN STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END MOORE1;
ARCHITECTURE BEHAV OF MOORE1 IS
SIGNAL ST_TYPE IS (ST0, ST1, ST2, ST3, ST4);
SIGNAL C_ST : ST_TYPE;
BEGIN
PROCESS (CLK, RST)
BEGIN
IF RST = '1' THEN C_ST <= ST0; Q <= \ ELSIF CLK'EVENT AND CLK = '1' THEN
CASE C_ST IS
WHEN ST0 => IF DATAIN = \
ELSE C_ST <= ST0;
END IF; Q <= \
WHEN ST1 => IF DATAIN = \
ELSE C_ST <= ST1;
END IF; Q <= \
WHEN ST2 => IF DATAIN = \
ELSE C_ST <= ST0;
END IF; Q <= \
WHEN ST3 => IF DATAIN = \
ELSE C_ST <= ST2;
END IF; Q <= \
WHEN ST4 => IF DATAIN = \
ELSE C_ST <= ST3;
END IF; Q <= \
END CASE; END IF; END PROCESS; END BEHAV;
-- 1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 -- 9 -- 10 -- 11 -- 12 -- 13 -- 14 -- 15 -- 16 -- 17 -- 18 -- 19 -- 20 -- 21 -- 22 -- 23 -- 24 -- 25 -- 26 -- 27 -- 28 -- 29 -- 30 -- 31 -- 32 -- 33 -- 34 -- 35
1. 在程序中存在两处错误,试指出,并说明理由:
在 Quartus II 中编译时,其中一个提示的错误为:
-- 判断进位输出
Error (Line 9): VHDL syntax error at MOORE1.vhd(9) near text \
if cqi = “10011001” then
cout <= '1'; else
cout <= '0'; end if; cq <= cqi; end process; end architecture bhv;
第 9 行,状态机数据类型声明错误,关键字应为 TYPE 第 32 行,case 语句缺少 when others 处理异常状态情况
2. 修改相应行的程序(如果是缺少语句请指出大致的行数):
错误 1 行号: 9 程序改为:SIGNAL 改为 TYPE
错误 2
行号: 32
程序改为:之前添加一句 when others => c_st <= st0;
五、阅读下列 VHDL 程序,画出相应RTL图:(10 分)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY TRIS IS
PORT ( CONTROL : IN STD_LOGIC;
INN : IN STD_LOGIC; Q : INOUT STD_LOGIC; Y : OUT STD_LOGIC );
END TRIS;
ARCHITECTURE ONE OF TRIS IS BEGIN
PROCESS (CONTROL, INN, Q) BEGIN
IF (CONTROL = '0') THEN
Y <= Q; Q <= 'Z'; ELSE
Q <= INN; Y <= 'Z'; END IF; END PROCESS; END ONE;
2. 看下面原理图,写出相应 VHDL 描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY MYCIR IS
PORT (A, CLK : IN STD_LOGIC; C,
B : OUT STD_LOGIC );
END MYCIR;
ARCHITECTURE BEHAV OF MYCIR IS
SIGNAL TA : STD_LOGIC; BEGIN
PROCESS (A, CLK) BEGIN
IF CLK’EVENT AND CLK = ‘1’ THEN
TA <= A; B <= TA;
C <= A AND TA; END IF; END PROCESS; END BEHAV;
六、写 VHDL 程序:(20 分)
1. 试描述一个带进位输入、输出的 8 位全加器
端口:A、B 为加数,CIN 为进位输入,S 为加和,COUT 为进位输出
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADDER8 IS
PORT (A, B : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
CIN : IN STD_LOGIC; COUT : OUT STD_LOGIC;
S : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END ADDER8;
ARCHITECTURE ONE OF ADDER8 IS
SIGNAL TS : STD_LOGIC_VECTOR (8 DOWNTO 0); BEGIN
TS <= (‘0’ & A) + (‘0’ & B) + CIN; S <= TS(7 DOWNTO 0); COUT <= TS(8); END ONE;
七、综合题(20 分) 下图是一个 A/D 采集系统的部分,要求设计其中的 FPGA 采集控制模块,该模块由三个部分构成:控制器(Control)、地址计数器(addrcnt)、内嵌双口 RAM(adram)。控制器(control)是一个状态机,完成 AD574的控制,和 adram 的写入操作。adram 是一个 LPM_RAM_DP 单元,在 wren 为’1’时允许写入数据。试分别回答问题 2. 试画出 control 的状态机的状态图 信号预处理 放 大采样/保持 AD574 ADData 8 STATUS CS CE A0 8 rddata 1 wren adram (lpm_ram_dp) 8 rddata rdaddr 6 Control 6 ClkInc wraddr Cntclr AnalogIn RC K12_8 CLK 地址 计数器 FPGA采集控制 下面列出了 AD574 的控制方式和控制时序图: AD574 逻辑控制真值表(X 表示任意) CE 0 X 1 1 1 1 1 CS X 1 0 0 0 0 0 RC X X 0 0 1 1 1 K12_8 X X X X 1 0 0 A0 X X 0 1 X 0 1 工 作 状 态 禁止 禁止 启动 12 位转换 启动 8 位转换 12 位并行输出有效 高 8 位并行输出有效 低 4 位加上尾随 4 个 0 有效 3. 地址计数器每当 ClkInc 时钟上升沿到达,输出地址加 1,请对该模块进行 VHDL 描述。 Library ieee; Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Entity cnt64 is Port ( ClkInc, Cntclr : in std_logic; -- 时钟信号和清零信号输入 Wraddr : out std_logic_vector (5 downto 0) ); End cnt64; Architecture one of cnt64 is Begin Process (clkinc, cntclr) Variable counter : std_logic_vector (5 downto 0); Begin If cntclr = ‘1’ then counter := (others => ‘0’); Elsif clkinc = ‘1’ and clkinc’event then counter := counter + 1; End if; Wraddr <= counter; End process; End one; AD574 工作时序 问题: 1. 要求 AD574 工作在 8 位转换模式,K12_8、A0 在 control 中如何设置? K12_8 低电平A0 高电平
4. 根据状态图,试对 control 进行 VHDL 描述 Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all; Entity control is
Port ( CLK, STATUS : in std_logic; -- 时钟信号和AD转换状态信号输入
ADDATA : in std_logic_vector (7 downto 0); -- 转换数据输入 CS, CE, A0, RC, K12_8 : out std_logic; -- AD574控制信号ClkInc : out std_logic; -- 地址计数器时钟信号 rddata : out std_logic_vector (7 downto 0) ); -- 转换数据输出
End control;
5. 已知 adram 的端口描述如下
ENTITY adram IS
PORT
( data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- 写入数据
wraddress: IN STD_LOGIC_VECTOR (5 DOWNTO 0); -- 写入地址rdaddress: IN STD_LOGIC_VECTOR (5 DOWNTO 0); -- 读地址wren : IN STD_LOGIC := '1'; -- 写使能 q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) -- 读出数据 );
END adram;
试用例化语句,对整个 FPGA 采集控制模块进行 VHDL 描述 Library ieee;
Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all;
Architecture behave of control is
Type sm_state is (s0, s1, s2, s3, s4); Signal c_st, n_st : sm_state; Signal lock : std_logic;
Signal regdata : std_logic_vector(7 downto 0); Begin
K12_8 <= ‘0’; A0 <= ‘1’; Process (clk)
If clk’event and clk = ‘1’ then c_st <= n_st; end if; End process;
Process (c_st, status) Begin
Case c_st is
When s0 => n_st <= s1; rc <= ‘1’; ce <= ‘0’; cs <= ‘1’; lock <= ‘0’; When s1 => n_st <= s2; rc <= ‘0’; ce <= ‘1’; cs <= ‘0; lock <= ‘0’; When s2 => if status = ‘0’ then n_st <= s3; else n_st <= s2;
Rc <= ‘1’; ce <= ‘1’ cs <= ‘0’; lock <= ‘0’;
When s3 => n_st <= s4; rc <= ‘1’; ce <= ‘1’; cs <= ‘0’; lock <= ‘1’; When s4 => n_st <= s0; rc <= ‘1’; ce <= ‘1’; cs <= ‘0’; lock <= ‘0’; When others => n_st <= s0; End case; End process; Process (lock) Begin
If lock’event and lock = ‘1’ then
Regdata <= addata; Clkinc <= ‘1’; Else
Clkinc <= ‘0’; End if; End process;
Rddata <= regdata; End behave;
Entity ADC574 is
Port ( CLK, STATUS : in std_logic; -- 时钟信号和AD转换状态信号输入
ADDATA : in std_logic_vector (7 downto 0); -- 转换数据输入Cntclr : in std_logic; -- 计数器清零信号 Rdaddr : in std_logic_vector (5 downto 0); -- adram读数地址CS, CE, A0, RC, K12_8 : out std_logic; -- AD574控制信号rddata : out std_logic_vector (7 downto 0) ); -- adram读数据输出
End ADC574;
Architecture one of adc574 is
component cnt64
Port ( ClkInc, Cntclr : in std_logic; -- 时钟信号和清零信号输入
Wraddr : out std_logic_vector (5 downto 0) );
End component; component control
Port ( CLK, STATUS : in std_logic; -- 时钟信号和AD转换状态信号输入
ADDATA : in std_logic_vector (7 downto 0); -- 转换数据输入CS, CE, A0, RC, K12_8 : out std_logic; -- AD574控制信号ClkInc : out std_logic; -- 地址计数器时钟信号 rddata : out std_logic_vector (7 downto 0) ); -- 转换数据输出
End component; component adram
PORT ( data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- 写入数据
wraddress: IN STD_LOGIC_VECTOR (5 DOWNTO 0); -- 写入地址rdaddress: IN STD_LOGIC_VECTOR (5 DOWNTO 0); -- 读地址wren : IN STD_LOGIC := '1'; -- 写使能 q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) -- 读出数据 );
END component;
Signal r_data : std_logic_vector (7 downto 0); Signal clkinc : std_logic;
Signal wraddr : std_logic_vector (5 downto 0); Begin
U1 : cnt64 port map (clkinc => clkinc, cntclr => cntclr, wraddr => wraddr);
U2 : control portmap (clk => clk, status => status, addata => addata, cs => cs, ce => ce, a0 => a0, rc => rc, k12_8 => k12_8, clkinc => clkinc, rddata => r_data);
U3 : adram port map (data => r_data, wraddress => wraddr, rdaddress => rdaddr, wren => ‘1’, q => rddata); End one;