第一章作业
1. (简答题)简述EDA技术的设计流程
- 我的答案:
2. (简答题) 说明EDA设计思想与传统的设计思想相比有什么优点?
-
我的答案:
自上而下开始设计、设计可逐层描述、逐层仿真、能保证满足系统指标。可以结合应用领域的具体要求,能及时调整设计方案,迸行性能优化,从而保证了设计的正确性,缩短了设计周期。且开发效率高,成本低。
3. (简答题) 比较利用单片机、ARM、DSP、FPGA设计电子系统各有什么优势?
-
我的答案:
1、可以在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可以大大降低设计成本,缩短设计周期。2、有各类库的支持3、简化了设计文档的管理。4、极大地提高了大规模系统电子设计的自动化程度。5、在实现目标方面有很大的可选性6、良好的可移植与可测试性
第二章作业
1. (简答题) 简单 PLD器件包括哪几种类型的器件?
可编程逻辑器件(PLD):PAL
1.简单PLD
1.1:PROM
1.2:PLA
1.3: PAL
1.4:GAL
2.复杂PLD:
2.1:CPLD
2,2:FPGA
2. (简答题) GAL和PAL有哪些相同之处?各有哪些特点?
GAL与PAL的相同之处:都属于低密度可编程逻辑器件;都属于一次性编程器件;都属于"与"门阵列.
PAL虽然与PLA结构相识,但运行速度有所提升,大大简化了设计算法,同时也使单个输出的乘积项有限.PAL一般采用熔丝工艺生产,一次可编程,修改很不方便.
GAL是在PAL基础上设计而成,与多种PAL器件保持兼容性,GAL能够直接替换多种PAL器件,方便应用厂商升级.且电擦除反复编程的特性让成本得到降低且输出特性灵活.
PFGA 和CPLD在结构上有何异同?编程配置方法有何不同?
FPGA和CPLD系统结构比较:
CPLD 是宏单元结构,是一种可编程逻辑器件,它可以在制造完成后由用户根据自己的需要定义其逻辑功能。 FPGA 是查找表结构,解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 CPLD 更适合完成各种算法和组合逻辑 ,FPGA 更适合于完成时序逻辑。
性能:逻辑电路在中小规模范围内,选用CPLD价格较便宜,能直接用于系统。各系统的CPLD器件的逻辑规模覆盖面属中小规模,器件有很宽的可选范围,上市速度快,市场风险小。对于大规模的逻辑电路设计,则多采用FPGA。因为从逻辑规模上讲,FPGA覆盖了大中规模范围。
第三章作业(1)
1. (简答题) 试分别用IF_THEN语句、WHEN_ELSE 和CASE语句的表达方式写出4选1多路选择器的VHDL程序,选通控制端有4个输入:S0、S1、S2、S3。当且仅当S0=0,时:Y=A;S1=0时:Y=B;S2=0时:Y=C; S3=0时:Y=D。
源代码:
IF_THEN
library IEEE; --使用标准库
use IEEE.std_logic_1164.all;
ENTITY mux41 IS --实体定义
PORT( --端口定义
A,B,C,D: IN STD_LOGIC;--数据输入 选择 端口信号输入 标准逻辑型
S0,S1,S2,S3: IN STD_LOGIC;--地址输入
Y: OUT STD_LOGIC --结果输出
);
END ENTITY mux41;
ARCHITECTURE arch_mux41 OF mux41 IS
SIGNAL Sel : STD_LOGIC_VECTOR(3 DOWNTO 0); --信号 标准逻辑向量 从高到低
BEGIN
Sel <= S3&S2&S1&S0;
PROCESS(A,B,C,D,Sel) --敏感信号量表
BEGIN
IF (Sel="1110") THEN
Y<=A;
ELSIF(Sel="1101") THEN
Y<=B;
ELSIF(Sel="1011") THEN
Y<=C;
ELSE (Sel="0111") THEN
Y<=D;
END IF;
END PROCESS;
END arch_mux41;
WHEN_ELSE --并行信号,信号发生一次就执行一次语句
library IEEE; --使用标准库
use IEEE.std_logic_1164.all;
ENTITY mux41 IS --实体定义
PORT( --端口定义
A,B,C,D: IN STD_LOGIC;--数据输入 选择 端口信号输入 标准逻辑型
S0,S1,S2,S3: IN STD_LOGIC;--地址输入
Y: OUT STD_LOGIC --结果输出
);
END ENTITY mux41;
ARCHITECTURE arch_mux41 OF mux41 IS
SIGNAL Sel : STD_LOGIC_VECTOR(3 DOWNTO 0); --信号 标准逻辑向量 从高到低
BEGIN
Sel <= S3&S2&S1&S0;
Y<=A WHEN Sel = "1110" ELSE
B WHEN Sel = "1101" ELSE
C WHEN Sel = "1011" ELSE
D WHEN Sel = "0111" ELSE
'Z';--高阻信号
END arch_mux41;
CASE
library IEEE; --使用标准库
use IEEE.std_logic_1164.all;
ENTITY mux41 IS --实体定义
PORT( --端口定义
A,B,C,D: IN STD_LOGIC;--数据输入 选择 端口信号输入 标准逻辑型
S0,S1,S2,S3: IN STD_LOGIC;--地址输入
Y: OUT STD_LOGIC --结果输出
);
END ENTITY mux41;
ARCHITECTURE arch_mux41 OF mux41 IS
SIGNAL Sel : STD_LOGIC_VECTOR(3 DOWNTO 0); --信号 标准逻辑向量 从高到低
BEGIN
Sel <= S3&S2&S1&S0;
PROCESS(A,B,C,D,Sel) --敏感信号量表
BEGIN
CASE(Sel) IS
WHEN "1110" => Y<=A ;
WHEN "1101" => Y<=B ;
WHEN "1011" => Y<=C ;
WHEN "0111" => Y<=D ;
WHEN OTHERS => NULL ;
END CASE;
END PROCESS;
END arch_mux41;
第三章作业(2)
1. (简答题) 用VHDL设计一个3-8译码器,要求分别用顺序赋值语句、case语句、if语句和移位操作符来实现。
--顺序赋值语句实现DECODER38
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DOCODER38 IS
PORT{
A0,A1,A2: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
S1,S2L,S3L:IN STD_LOGIC;
Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7 : OUT STDD_LOGIC;
};
END ENTITY DECODR38 ;
ARCHITECTURE ARCH_DOCODER38 OF DECODER38 IS
BEGIN
PROCESS(A)
BEGIN
IF ST="1" AND STAL="0" AND STBL= "0" THEN
Y0<= NOT(NOT(A2) AND NOT(A1) AND NOT(A0));
Y1<= NOT(NOT(A2) AND NOT(A1) AND A0);
Y2<= NOT(NOT(A2) AND A1 AND NOT(A0));
Y3<= NOT(NOT(A2) AND A1 AND A0);
Y4<= NOT(A2 AND NOT(A1) AND NOT(A0));
Y5<= NOT(A2 AND NOT(A1) AND A0);
Y6<= NOT(A2 AND A1 AND NOT(A0));
Y7<= NOT(A2 AND A1 AND A0);
ELSE Y<="1111111";
END IF;
END PROCESS;
END ARCHITECTURE ARCH_DOCODER38;
--CASE语句实现DECODER38
--库:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
-----------------------------------------------
--实体
ENTITY DOCODER38 IS
PORT{
A: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
ST,STAL,STBL:IN STD_LOGIC;
Y : OUT STDD_LOGIC_VECTOR(7 DOWNTO 0);
};
END ENTITY DECODR38 ;
---------------------------------------------
--结构体
ARCHITECTURE ARCH_DOCODER38 OF DECODER38 IS
BEGIN
PROCESS(A)
BEGIN
IF ST="1" AND STAL="0" AND STBL= "0" THEN
CASE (A) 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 (OTHERS)=> Y<="01111111";
END CASE;
ELSE Y<="1111111";
END IF;
END PROCESS;
END ARCHITECTURE ARCH_DOCODER38;
--IF语句实现DECODER38
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECODER38 IS
PORT(A:IN STD_LOGIC_VECTER(3 DOWNTO 0);--信号输入
Y:OUT STD_LOGIC_VECTER(7 DOWNTO 0);--结果输出
ST,STAL,STBL:IN --使能端
);
END ENTITY DECODER38;
ARCHITECTURE ARCH_DECODER38 OF DECODER38 IS
BEGIN
PROCESS(A)
BEGIN
IF ST="1" AND STAL="0" AND SRBL="0" THEN
IF A="000" THEN
Y<="11111110";
ELSIF A="001" THEN
Y<="11111101";
ELSIF A="010" THEN
Y<="11111011";
ELSIF A="011" THEN
Y<="11110111";
ELSIF A="100" THEN
Y<="11101111";
ELSIF A="101" THEN
Y<="11011111";
ELSIF A="110" THEN
Y<="10111111";
ELSE Y<="01111111";
END IF;
ELSE Y<= "11111111";
END IF;
END PROCESS;
END ARCHITECTURE ARCH_DECODER38 ;
--移位操作符实现DECODER38
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DECODER38 IS
PORT(A :IN STD_LOGIC_VECTOR(2 DOWNTO 0);--输入
Y: OUT STD_LOGIC_VECTOR(7 downto 0);
ST,STA,STB:IN STD_LOGIC);--输出
END DECODER38;
ARCHITECTURE ARCH_DECODER38 OF DECODER38 IS
BEGIN
PROCESS(A)
BEGIN
IF ST="1" AND STAL="0" AND SRBL="0" THEN
Y<=“00000000”;
Y(CONV_INTEGER(A))<='1'; --这两个的交集同一信号仅为Y(CONV_INTEGER(A)),大体上是不属于同一信号先后赋值的,所以不会出现没有初值未知的情况
ELSE Y<="1111111";
END IF;
END PROCESS;
END ARCHITECTURE ARCH_DECODER38;
2. (简答题) 设计一个求补码的VHDL程序,输入数据是一个有符号的8位二进制数。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COMPLEMENT IS
PORT(CLK : IN STD_LOGIC;--时钟信号,用于检测上升沿
A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
B:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END ENTITY COMPLEMENT ;
ARCHITECTURE ARCH_COM OF COMPLEMENT IS
BEGIN
PROCESS(CLK)
VARIABLE TEMP :STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK='1' THEN --检测上升沿
TEMP := A XOR "01111111";--异或取反
TEMP :=CONV_STD_LOGIC_VECTOR(CONV_INTEGER(TEMP)+1,8);--temp转化为整数加一后再转换回来
B <= TEMP;--输出结果
END IF;
END PROCESS;
END ARCHITECTURE ARCH_COM;
3. (简答题) 设计一个4 位乘法器,为此首先设计一个加法器,用例化语句调用这个加法器,用移位相加的方式完成乘法。并以此项设计为基础,使用GENERIC参数传递的功能设计一个16位乘法器
--构建16位乘法器 顶层
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MULT16B IS
PORT(D1,D2:IN STD_LOGIC_VECTOR(15 DOWNTO 0);--输入16位
Q:OUT STD_LOGIC_VECTO(31 DOWNTO 0));--输出32位
END ENTITY MULT16B;
ARCHITECTURE BHV OF MULT16B IS
COMPONENT MULT4B; --MULT4B模块调用
GENERIC (S: INTEGER);--照抄MULT4B端口定义
PORT(R:OUT STD_LOGIC_VECTOR(2*S DOWNTO 1);
A,B:IN STD_LOGIC_VECTOR(S DOWNTO 1));
END COMPONENT;
BEGIN
--例化名:元件名 generic map (类属表)
U1 :MULT4B GENERIC MAP (S=>16) --参数传递映射语句
PORT MAP (R=>Q,A=>D1,B=>D2);
END ARCHITECTURE BHV;
-------------------------------------------------------
--移位相加型乘法器4位实现,改变参数S的值增加位数
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;--arith 算术
ENTITY MULT4B IS
GENERIC (S: INTEGER := 4);--定义参数S为整型,且等于4 控制位数
PORT(R :OUT STD_LOGIC_VECTOR(2*S DOWNTO 1);--输出2*S位,最大值
A,B :IN STD_LOGIC_VECTOR(S DOWNTO 1));--输入S位
END ENTITY MULT4B;
ARCHITECTURE ONE OF MULT4B IS
COMPONENT F_ADDER --调用全加器声明语句
PORT (ain,bin,cin : IN STD_LOGIC;
cout,sum : OUT STD_LOGIC);
END COMPONENT ;
SIGNAL A0 : STD_LOGIC_VECTOR(2*S DOWNTO 1);--信号用于联系各个模块
BEGIN
A0 <= CONV_STD_LOGIC_VECTOR(0,S) & A; --把A前加多个0,转化为相应位数二进制
PROCESS (A,B)--敏感信号,加法开始
VARIABLE R1,R3,R2,R4:STD_LOGIC_VECTOR(2*S DOWNTO 1);--用作加法的变量,最大位数.R1运算,R3传递,R2算子,R4屏蔽进位位
BEGIN
R1 :=(OTHERS =>'0');--若S=4,等效于 R1="00000000" 默认初始化,做移位累加的量
R4 :=(OTHERS =>'0');
R2 :=(OTHERS =>'0');
R3 :=(OTHERS =>'0');
FOR I IN 1 TO S LOOP --一个一个输入,变量I,在1~S之间 循环,每次循环1+1
IF (B(I)='1') THEN
R2=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL (I-1);
ul : F_ADDER PORT MAP (ain=>R1,bin=>R2,cout=>R3,sum=>R3) ;--so结果 co进位
R1:=R3;
-- R1 := R1 + TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL (I-1));--移i-1位,和A做移位累加
END IF;
END LOOP;
R<=R1;
END PROCESS;
END ARCHITECTURE ONE;
--全加器
LIBRARY IEEE;--全加器顶层设计描述
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY F_ADDER IS
PORT (ain,bin,cin : IN STD_LOGIC;
cout,sum : OUT STD_LOGIC);
END ENTITY F_ADDER ;
ARCHITECTURE FD1 OF F_ADDER IS
COMPONENT H_ADDER --调用半加器声明语句
PORT (A, B : IN STD_LOGIC;
CO, SO: OUT STD_LOGIC);
END COMPONENT ;
COMPONENT or2a --调用或门元件声明语句
PORT ( a ,b : IN STD_LOGIC;
c : OUT STD_LOGIC);
END COMPONENT;
SIGNAL net1, net2, net3 : STD_LOGIC;--定义3个信号作为内部的连接线
BEGIN
ul : H_ADDER PORT MAP (A=>ain, B=>bi,CO=>net2,SO=>netl) ;
u2 :H_ADDER PORT MAP (net1,cin,net3,sum);
u3 : or2a PORT MAP(a=>net2, b=>net3, c=>cout);
END ARCHITECTURE FD1;
---构建或门
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY or2a IS
PORT (a, b :IN STD_LOGIC; c : OUT STD_LOGIC );
END ENTITY or2a;
ARCHITECTURE one OF or2a IS
BEGIN
c <= a OR b ;
END ARCHITECTURE one ;
-- 构建加法器,由于考虑到进位,先构建半加器
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY H_ADDER IS
PORT (A: IN STD_LOGIC;
B: IN STD_LOGIC;
SO:OUT STD_LOGIC;
CO:OUT STD_LOGIC);
END ENTITY H__ADDER;
ARCHITECTURE FH1 OF H_ADDER IS
BEGIN
SO <= A XOR B;
CO <=A AND B;
END ARCHITECTURE FH1;
第五章作业(1)
1. (简答题) 用VHDL语言设计一个具有同步置1,异步清零的D触发器
---方案1
--设计一个同步置1,异步清0的D触发器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY D IS
PORT(RST,D,CLK : IN STD_LOGIC;
Q,DOUT:OUT STD_LOGIC;
);
END ENTITY D;
ARCHITECTURE ARCH_D FOR D IS
SIGNAL TMP:STD_LOGIC;
BEGIN
PROCESS(RST,D,CLK)
BEGIN
IF CLK'EVENT AND CLK= ' 1 ' THEN
IF RST='0' THEN
TMP <= D;
ELSE TMP=0;
END IF;
Q <= TMP;
DOUT<= D XOR TMP;
END IF;
END PROCESS;
END ARCH_D;
---方案2
library ieee;--使用ieee库
use ieee.std_logic_1164.all;--使用库内的包
entity dff2 is
port(clk,rst,en,d : in std_logic;--时钟,复位,使能,输入
q:out std_logic );--输出
end entity diff2;
architecture arch_dff2 of dff2 is
signal q1 : std_logic ;--传递
begin
process(clk,q1,rst,en)
begin
if rst='0' then --异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
q1<='0';
elsif clk'event and clk ='1' then
if en='0' then --同步置1
q1<='1';
elsif en='1' then
q1<=d;
end if;
end if
end process;
q<=q1;
end architecture arch_dff2;
2. (简答题) 用VHDL设计一个功能类似74LS160的计数器
---方案1
--设计一个同步置1,异步清0的D触发器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY D IS
PORT(RST,D,CLK : IN STD_LOGIC;
Q,DOUT:OUT STD_LOGIC;
);
END ENTITY D;
ARCHITECTURE ARCH_D FOR D IS
SIGNAL TMP:STD_LOGIC;
BEGIN
PROCESS(RST,D,CLK)
BEGIN
IF CLK'EVENT AND CLK= ' 1 ' THEN
IF RST='0' THEN
TMP <= D;
ELSE TMP=0;
END IF;
Q <= TMP;
DOUT<= D XOR TMP;
END IF;
END PROCESS;
END ARCH_D;
---方案2
library ieee;--使用ieee库
use ieee.std_logic_1164.all;--使用库内的包
entity dff2 is
port(clk,rst,en,d : in std_logic;--时钟,复位,使能,输入
q:out std_logic );--输出
end entity diff2;
architecture arch_dff2 of dff2 is
signal q1 : std_logic ;--传递
begin
process(clk,q1,rst,en)
begin
if rst='0' then --异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
q1<='0';
elsif clk'event and clk ='1' then
if en='0' then --同步置1
q1<='1';
elsif en='1' then
q1<=d;
end if;
end if
end process;
q<=q1;
end architecture arch_dff2;
喜哥30题
1. (简答题) 试用IF_THEN语句写出4选1多路选择器的VHDL程序,选通控制端有4个输入:S0、S1、S2、S3。当且仅当S0=0,时:Y=A;S1=0时:Y=B;S2=0时:Y=C; S3=0时:Y=D。
源代码:
IF_THEN
library IEEE; --使用标准库
use IEEE.std_logic_1164.all;
ENTITY mux41 IS --实体定义
PORT( --端口定义
A,B,C,D: IN STD_LOGIC;--数据输入 选择 端口信号输入 标准逻辑型
S0,S1,S2,S3: IN STD_LOGIC;--地址输入
Y: OUT STD_LOGIC --结果输出
);
END ENTITY mux41;
ARCHITECTURE arch_mux41 OF mux41 IS
SIGNAL Sel : STD_LOGIC_VECTOR(3 DOWNTO 0); --信号 标准逻辑向量 从高到低
BEGIN
Sel <= S3&S2&S1&S0;
PROCESS(A,B,C,D,Sel) --敏感信号量表
BEGIN
IF (Sel="1110") THEN
Y<=A;
ELSIF(Sel="1101") THEN
Y<=B;
ELSIF(Sel="1011") THEN
Y<=C;
ELSE (Sel="0111") THEN
Y<=D;
END IF;
END PROCESS;
END arch_mux41;
2.说明EDA设计思想与传统的电路设计思想相比有什么优点?
自上而下开始设计、设计可逐层描述、逐层仿真、能保证满足系统指标。可以结合应用领域的具体要求,能及时调整设计方案,迸行性能优化,从而保证了设计的正确性,缩短了设计周期。且开发效率高,成本低。
3. (简答题) 试用WITH- -SELECT语句写出4选1多路选择器的VHDL程序,选通控制端有4个输入:S0、S1、S2、S3。当且仅当S0=0,时:Y=A;S1=0时:Y=B;S2=0时:Y=C; S3=0时:Y=D。
library IEEE; --使用标准库
use IEEE.std_logic_1164.all;
ENTITY mux41 IS --实体定义
PORT( --端口定义
A,B,C,D: IN STD_LOGIC;--数据输入 选择 端口信号输入 标准逻辑型
S0,S1,S2,S3: IN STD_LOGIC;--地址输入
Y: OUT STD_LOGIC --结果输出
);
END ENTITY mux41;
ARCHITECTURE arch_mux41 OF mux41 IS
SIGNAL Sel : STD_LOGIC_VECTOR(3 DOWNTO 0); --信号 标准逻辑向量 从高到低
BEGIN
Sel <= S3&S2&S1&S0;
PROCESS(A,B,C,D,Sel) --敏感信号量表
BEGIN
with Sel select
Y <= A when "1110",
B when "1101",
C when "1011",
D when "0011",
"ZZZZ" when others;
END PROCESS;
END arch_mux41;
4. (简答题) 写出具有上升沿触发的D触发器的VHDL语言代码
--<5-1>
Library ieee;
use ieee.std_logic_1164.all;
entity dff1 is
port (clk,d : in std_logic;
q: out std_logic);
end entity dff1;
architecture bhv of dff1 is
signal q1 :std_logic ;
begin
process(clk,q1)
begin
if clk'event'and clk = '1' then --上升沿触发
q1<=d;
end if;
end process;
q<=q1;
end bhv;
5. (简答题) 试用WHEN_ELSE 语句写出4选1多路选择器的VHDL程序,选通控制端有4个输入:S0、S1、S2、S3。当且仅当S0=0,时:Y=A;S1=0时:Y=B;S2=0时:Y=C; S3=0时:Y=D。
WHEN_ELSE --并行信号,信号发生一次就执行一次语句
library IEEE; --使用标准库
use IEEE.std_logic_1164.all;
ENTITY mux41 IS --实体定义
PORT( --端口定义
A,B,C,D: IN STD_LOGIC;--数据输入 选择 端口信号输入 标准逻辑型
S0,S1,S2,S3: IN STD_LOGIC;--地址输入
Y: OUT STD_LOGIC --结果输出
);
END ENTITY mux41;
ARCHITECTURE arch_mux41 OF mux41 IS
SIGNAL Sel : STD_LOGIC_VECTOR(3 DOWNTO 0); --信号 标准逻辑向量 从高到低
BEGIN
Sel <= S3&S2&S1&S0;
Y<=A WHEN Sel = "1110" ELSE
B WHEN Sel = "1101" ELSE
C WHEN Sel = "1011" ELSE
D WHEN Sel = "0111" ELSE
'Z';--高阻信号
END arch_mux41;
6. (简答题) 试用CASE语句写出4选1多路选择器的VHDL程序,选通控制端有4个输入:S0、S1、S2、S3。当且仅当S0=0,时:Y=A;S1=0时:Y=B;S2=0时:Y=C; S3=0时:Y=D。
---CASE
library IEEE; --使用标准库
use IEEE.std_logic_1164.all;
ENTITY mux41 IS --实体定义
PORT( --端口定义
A,B,C,D: IN STD_LOGIC;--数据输入 选择 端口信号输入 标准逻辑型
S0,S1,S2,S3: IN STD_LOGIC;--地址输入
Y: OUT STD_LOGIC --结果输出
);
END ENTITY mux41;
ARCHITECTURE arch_mux41 OF mux41 IS
SIGNAL Sel : STD_LOGIC_VECTOR(3 DOWNTO 0); --信号 标准逻辑向量 从高到低
BEGIN
Sel <= S3&S2&S1&S0;
PROCESS(A,B,C,D,Sel) --敏感信号量表
BEGIN
CASE(Sel) IS
WHEN "1110" => Y<=A ;
WHEN "1101" => Y<=B ;
WHEN "1011" => Y<=C ;
WHEN "0111" => Y<=D ;
WHEN OTHERS => NULL ;
END CASE;
END PROCESS;
END arch_mux41;
7. (简答题) 写出具有异步复位和时钟使能的上升沿触发的D触发器的VHDL语言代码
---方案1
--设计一个异步置1,异步清0的D触发器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY D1 IS
PORT(RST,D,CLK : IN STD_LOGIC;
Q,DOUT:OUT STD_LOGIC
);
END ENTITY D1;
ARCHITECTURE ARCH_D FOR D1 IS
SIGNAL TMP:STD_LOGIC;
BEGIN
PROCESS(RST,D,CLK)
BEGIN
IF RST='0' THEN ---优先清零
TMP <= D;
ELSE TMP=0;
END IF;
---上升检测赋值
IF CLK'EVENT AND CLK= ' 1 ' THEN
TMP <= D;
Q <= TMP;
DOUT<= D XOR TMP;
END IF;
END PROCESS;
END ARCH_D;
8. (简答题) 写出具有同步复位控制的上升沿触发的D触发器的VHDL语言代码
---方案1
--设计一个同步置1,异步清0的D触发器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY D1 IS
PORT(RST,D,CLK : IN STD_LOGIC;--复位,输入,时钟
Q,DOUT:OUT STD_LOGIC
);
END ENTITY D1;
ARCHITECTURE ARCH_D FOR D1 IS
SIGNAL TMP:STD_LOGIC;
BEGIN
PROCESS(RST,D,CLK)
BEGIN
---上升沿触发,时钟信号到来
IF CLK'EVENT AND CLK= ' 1 ' THEN
IF RST='0' THEN ---进行同步复位
TMP <= D;
ELSE TMP=0;
END IF;
Q <= TMP;
DOUT<= D XOR TMP;
END IF;
END PROCESS;
END ARCH_D;
9. (简答题) 写出基本锁存器的VHDL语言代码
---<5-6>
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY lich2 IS
PORT(D,CLK : IN STD_LOGIC;--输入,时钟
Q:OUT STD_LOGIC
);
END ENTITY lich2 ;
ARCHITECTURE bhv FOR lich2 IS
SIGNAL TMP:STD_LOGIC;
BEGIN
PROCESS(D,CLK)
BEGIN
---上升沿触发,时钟信号到来
IF CLK'1' THEN
Q <=D;
END IF;
END PROCESS;
END bhv;
10. (简答题) 写出含清零控制的锁存器的VHDL语言代码
--<5-8>
library ieee;
use ieee.std_logic_1164.all;
entity ltch3 is
port (clk,d,rst : in std_logic;
q:out std_logic);
end ltch3;
architecture bhv of ltch3 is
begin
process (clk,d,rst)
begin
if rst='1' then q<='0';
elsif clk ='1' then
q<=d;
end if;
end process;
end bhv;
11. (简答题) 写出4位二进制加法计数器的VHDL语言代码
--<5-13>
library ieee;
use ieee.std_logic_1164.all;
entity cnt4 is
port (clk: in bit;
q:buffer integer range 15 downto 0);
end cnt4;
architecture bhv of cnt4 is
begin
process (clk)
begin
if clk'enent and clk='1' then q<=q+1;
end if;
end process;
end bhv;
12. (简答题) 写出带有同步预置控制的8位 右移 移位寄存器的VHDL代码
--<5-17>
library ieee;
use ieee.std_logic_1164.all;
entity shft is
port (clk,load: in std_logic;
qb:out std_logic;
din : in std_logic_vector(7 downto 0);
dout : out std_logic_vector(7 downto 0));
end shft;
architecture behav of shft is
signal reg8 :std_logic_vector(7 downto 0)
begin
process (clk,load)
begin
if clk'enent and clk='1' then
if load ='1' then
reg8 <= din;
else reg8(6 downto 0) <= reg(7 downto 1);
end if;
end if;
end process;
qb <=reg8(0);
dout<=reg8;
end behav;
13. (简答题) 说明VHDL的数据对象包括哪几类,写出每一类数据对象的定义格式
1>常量 (constant)
constant 常量名 : 数据类型 := 表达式;
例如: constant Vcc :REAL :=2.5;
2>变量 (variable)
variable 变量名 : 数据类型 := 初始值;
例如:
variable a:integer ;
3>信号(signal)
signal 信号名:数据类型:=初始值;
例如:
signal s1,s2:bit;
14. (简答题) 试比较信号和变量数据对象的基本用法、适用范围和行为特性。
1>变量 (variable)
variable 变量名 : 数据类型 := 初始值;
例如:
variable a:integer ;
范围:属于局部变量,只能在进程和子程序中使用;仅限于定义了变量的进程或子程序的顺序语句中.不能列入敏感表.
行为特性:理想化数据传输,立即发生,不存在任何时延行为;在进程中作为临时的数据存储单元
2>信号(signal)
signal 信号名:数据类型:=初始值;
例如:
signal s1,s2:bit;
范围:实体,结构体,程序包.在进程和子程序的顺序语句中不允许定义信号,且在进程中只能将信号列入敏感表.
行为特性:可以作为实体中并行语句模块间的信息交流通道,可以保持历史值,可以设置初始值;具有全局性特征;在进程中,可以允许同一信号有多个驱动源(赋值源),结果只有最后的赋值语句被启动,并进行有效赋值.
P214 <表8-1>
15. (简答题) 写出8位三态控制门电路的VHDL描述语言代码
书 P219页 <例8-8>
16. (简答题) 写出进程语句的语法结构格式
P223 8.3.1 格式
17. (简答题) 说明进程中的顺序描述语句部分可以包含那些语句。
P224 左上角 (2)(3)
18. (简答题) 写出IF语句的四种结构类型
P226页 框内
19. (简答题) 说明VHDL语言的库包含哪几类?其中的STD_LOGIC_1164程序包是在哪个库内? TEXTIO程序包是在哪个库内?哪些库需要显式表达
P332页 一类是设计库 一类是资源库
P332页 左下角 IEEE库
P334页 2.STD库(TEXTO)
20. (简答题) 说明VHDL语言的库包含哪几类?其中的STANDARD程序包是在哪个库内?STD_LOGIC_UNSIGNED程序包是在哪个库内?那些库需要显式表达?
P332页 一类是设计库 一类是资源库
P334页 2.STD库(STANDARD)
P332页 左下角 IEEE库 (unsigned)
21. (简答题) 说明定义程序包的语法结构
P336 框内
22. (简答题) 说明函数定义的语法格式
P341 框内
23. (简答题) 说明 过程定义的语法格式
P346 12.4.4框内
24. (简答题)说明以下标识符非法的原因
_Decoder_1
74LS164
Sig_#N
Not-Ack
RyY_RST_
data_BUS
return
P340第三个框内
25. (简答题) 常用的数据类型有哪些?(至少答出8种)
P349页 12.5下面的 标量型~~文件类型
加上 P62页 中间的9中数据
26. (简答题)说明以下WAIT语句表示的意义
- wait
- 2 . wait on 信号表
- wait until 条件表达式
- wait for 时间表达式
P356 第一个框
27. (简答题) 例化语句包含两个部分,一个是元件定义,另一个是元件调用,写出两部分的语法格式
P75 3个框
28. (简答题) 说明移位操作符SLL,逻辑操作符AND对操作数数据类型的要求
P86 表3-2
29. (简答题)在STD_LOGIC_1164程序包中,若要将BIT型数据转换为STD_LOGIC型,应调用什么函数?在STD_LOGIC_ARITH程序包中,若要将STD_LOGIC_VECTOR型数据转换为INTEGER型,应调用什么函数?
P88 表3-4
to_stdlogic(A)
conv_integer(A)
30. (简答题) 在STD_LOGIC_1164程序包中,若要将BIT_VECTOR型数据转换为STD_LOGIC_VECTOR型,应调用什么函数?在STD_LOGIC_ARITH程序包中,若要将INTEGER型数据转换为STD_LOGIC_VECTOR型,应调用什么函数?
P88 表3-4
第一行
第二块第一个
注意导包!!!!
实验1
Quartus Prime 18.1软件的使用与七段译码器
一、实验目的
熟悉使用Quartus Prime 18.1软件
二、实验内容
安装Quartus Prime 18.1软件并成功注册、使用Quartus Prime 18.1软件建立工程并完成七段译码器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECL7S IS
PORT(A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B : OUT STD_LOGIC;
LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END;
ARCHITECTURE ONE OF DECL7S IS
BEGIN
PROCESS(A)
BEGIN
CASE A IS
WHEN "0000" => LED7S <= "1000000";
WHEN "0001" => LED7S <= "1111001";
WHEN "0010" => LED7S <= "0100100";
WHEN "0011" => LED7S <= "0110000";
WHEN "0100" => LED7S <= "0011001";
WHEN "0101" => LED7S <= "0010010";
WHEN "0110" => LED7S <= "0000010";
WHEN "0111" => LED7S <= "1111000";
WHEN "1000" => LED7S <= "0000000";
WHEN "1001" => LED7S <= "0010000";
WHEN "1010" => LED7S <= "0001000";
WHEN "1011" => LED7S <= "0000011";
WHEN "1100" => LED7S <= "1000110";
WHEN "1101" => LED7S <= "0100001";
WHEN "1110" => LED7S <= "0000110";
WHEN "1111" => LED7S <= "0001110";
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
B <= '0';
END;
实验2
实验二 3--8译码器
一、实验目的
熟悉使用Quartus Prime 18.1软件,掌握使用Quartus Prime 18.1软件建立工程流程
二、实验内容
完成Quartus Prime 18.1软件注册、使用Quartus Prime 18.1软件建立工程并完成3--8译码器
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
USE IEEE.STD_LOGIC_UNSIGNED.ALL ;
ENTITY DECODER38 IS
PORT (input : IN STD_LOGIC_VECTOR(2 DOWNTO 0) ;
output : OUT BIT_VECTOR(7 DOWNTO 0) ) ;
END DECODER38 ;
ARCHITECTURE behave OF DECODER38 IS
BEGIN
output <="11111110" ROL CONV_INTEGER(input) ;
END behave ;
实验3
实验四 Quartus Prime 18.1原理图输入法设计2位全加器
一、实验目的
熟悉使用Quartus Prime 18.1软件的原理图输入设计流程全过程
二、实验内容
学习原理图输入法的设计、多层次电路设计、引脚设置、硬件测试
三、实验仪器、设备
计算机、Quartus Prime 18.1软件
四、实验步骤
1、首先,使用原理图输入设计方法(具体方法查看书本),建立1位半加器原理图,将原理图设置成可调用的元件;然后将2个半加器组成一个1位全加器,再将全加器设置成可调用的元件去搭建2位全加器。
2、一个2位全加器由2个1位全加器构成,加法器间的进位可以串行方式实现,即将低位加法器的进位输出cout与相临的高位加法器的最低进位输入信号cin相接。
3、进行波形仿真
4、按要求进行引脚配置
5、下载测试