写在前面
此篇为课后习题篇,有大量的与前面 2、3 篇重复的内容,如有疑问或错误,请及时提出
第一章作业
1.1 简述EDA技术的设计流程
自顶向下的设计方法指首先从系统级入手,从顶层进行功能划分与结构设计,经过系统级、算法级、rtl级、门级、开关级,最后形成物理版图
1.2 说明EDA设计思想与传统的设计思想相比有什么优点?
自上而下开始设计,设计过程可以逐级描述,逐级仿真,可以保证满足系统的指标。可以结合应用领域的具体要求,及时调整设计方案,并进行性能优化,开发效率高,成本低。还能保证设计的正确性并缩短了设计周期。
1.3 比较利用单片机、ARM、DSP、FPGA设计电子系统各有什么优势?
1、可以在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可以大大降低设计成本,缩短设计周期。
2、有各类库的支持。
3、简化了设计文档的管理。
4、极大地提高了大规模系统电子设计的自动化程度。
5、在实现目标方面有很大的可选性。
6、良好的可移植与可测试性。
第二章作业
2.1 简单 PLD器件包括哪几种类型的器件?
PROM、CPLD、PLA
2.2 GAL和PAL有哪些相同之处?各有哪些特点?
GAL是在PAL基础上发展起来的一种可编程逻辑器件它采用E 2 CMOS工艺制作具有电擦除反复编程的特性且输出结构灵活。在基本阵列结构上仍是与阵列可编程或阵列固定的PAL结构。与PAL相比GAL的输出结构配置了可以任意组态的输出逻辑宏单元OLMC适当地对OLMC进行编程GAL就可以在功能上代替PAL的四种输出类型及其派生类型为在同一片GAL中实现组合逻辑电路和时序逻辑电路的分块设计提供了方便。 GAL是在PAL基础上发展起来的一种可编程逻辑器件,它采用E2CMOS工艺制作,具有电擦除反复编程的特性,且输出结构灵活。在基本阵列结构上仍是与阵列可编程,或阵列固定的PAL结构。与PAL相比,GAL的输出结构配置了可以任意组态的输出逻辑宏单元OLMC,适当地对OLMC进行编程,GAL就可以在功能上代替PAL的四种输出类型及其派生类型,为在同一片GAL中,实现组合逻辑电路和时序逻辑电路的分块设计提供了方便。
2.3 PFGA 和CPLD在结构上有何异同?编程配置方法有何不同?
CPLD 是宏单元结构,是一种可编程逻辑器件,它可以在制造完成后由用户根据自己的需要定义其逻辑功能。
FPGA 是查找表结构,解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
CPLD 更适合完成各种算法和组合逻辑 ,FPGA 更适合于完成时序逻辑。
第三章作业(1)
3.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。
LIBRARY TEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
PORT(A,B,C,D:IN Bit;
S:IN Bit_Vector(3 DOWNTO 0);
Y:OUT Bit);
END mux4;
ARCHITECTURE behav1 OF mux4 IS
BEGIN
mux4_p1:PROCESS(A,B,C,D,S)
BEGIN
IF S = "1110" THEN Y <= A;
ELSIF S = "1101" THEN Y <= B;
ELSIF S = "1011" THEN Y <= C;
ELSE S = "0111" THEN Y <= D;
ELSE Y <= '1';
END IF;
END PROCESS mux4_p1;
END behav1;
ARCHITECTURE behav2 OF mux4 IS
BEGIN
Y <= A WHEN S = "1110" ELSE
B WHEN S = "1101" ELSE
C WHEN S = "1011" ELSE
D WHEN S = "0111" ELSE
'1';
END behav2;
ARCHITECTURE behav3 OF mux4 IS
BEGIN
mux4_p2:PROCESS(A,B,C,D,S)
BEGIN
CASE S IS
WHEN "1110" => Y <= A;
WHEN "1101" => Y <= B;
WHEN "1011" => Y <= C;
WHEN "0111" => Y <= D;
WHEN OTHERS => Y <= "1";
END CASE;
END PROCESS mux4_p2;
END behav3;
第三章作业(2)
3.2 用VHDL设计一个3-8译码器,要求分别用顺序赋值语句、case语句、if语句和移位操作符来实现。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY decoder3to8 IS
PORT(A:IN STD_LOGIC_VECTOR(2 DOWNtO 0);
ST,STA,STB:IN STD_LOGIC;
Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY decoder3to8;
ARCHITECTURE 3to8 OF decoder3to8
BEGIN
PROCESS(A)
BEGIN
IF ST="1" AND STA="0" AND STB="0" THEN
BEGIN
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 <= "11111111";
END IF;
END PROCESS;
END 3to8;
3.3 设计一个求补码的VHDL程序,输入数据是一个有符号的8位二进制数。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY buma IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END buma;
ARCHITECTURE arc OF buma IS
SIGNAL tmp:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(a)
BEGIN
IF a(7)='0' THEN
y<=a;
ELSE
tmp(7)<='1';
FOR i IN 0 TO 6 LOOP
tmp(i)<=NOT a(i);
y<=tmp+1;
END LOOP;
END IF;
END PROCESS;
END arc;
3.4 设计一个4 位乘法器,为此首先设计一个加法器,用例化语句调用这个加法器,用移位相加的方式完成乘法。并以此项设计为基础,使用GENERIC参数传递的功能设计一个16位乘法器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY MULT4B IS
GENERIC( S: INTEGER:=4); --定义参数S为整数类型,且等于4
PORT( R: OUT STD_LOGIC_VECTOR(2*S-1 DOWNTO 0);
A,B: IN STD_LOGIC_VECTOR(S-1 DOWNTO 0));
END ENTITY MULT4B;
ARCHITECTURE ONE OF MULT4B IS COMPONENT addern IS
PORT(a,b: IN STD_LOGIC_VECTOR; result: out STD_LOGIC_VECTOR);
END COMPONENT;
SIGNAL A0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0);
SIGNAL RR3,RR2,RR1,RR0,ZZ1,ZZ0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0);
BEGIN
A0<=CONV_STD_LOGIC_VECTOR(0,S) & A;
PROCESS(A,B)
BEGIN
IF(B(0)='1')THEN RR0<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 0);
ELSE RR0<=(OTHERS=>'0');
END IF;
IF(B(1)='1')THEN RR1<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 1);
ELSE RR1<=(OTHERS=>'0');
END IF;
IF(B(2)='1')THEN RR2<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 2);
ELSE RR2<=(OTHERS=>'0');
END IF;
IF(B(3)='1')THEN RR3<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 3);
ELSE RR3<=(OTHERS=>'0');
END IF;
END PROCESS;
u0: addern PORT MAP(a=>RR0,b=>RR1,result=>ZZ0);
u1: addern PORT MAP(a=>ZZ0,b=>RR2,result=>ZZ1);
u2: addern PORT MAP(a=>ZZ1,b=>RR3,result=>R);
END ARCHITECTURE ONE;
第五章作业
5.1 用VHDL语言设计一个具有同步置1,异步清零的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;
5.2 用VHDL设计一个功能类似74LS160的计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNTLS160 IS
PORT(CLK,CLRN,EN,LDN : IN STD_LOGIC;--clk时钟,CLRN复位,EN使能端,LDN预置数控制输 入
INDATA : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
OUTDATA : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC);
END CNTLS160;
ARCHITECTURE ARCHI_74LS160 OF CNTLS160 IS
BEGIN
PROCESS(CLK,CLRN,EN,LDN)
VARIABLE Q : STD_LOGIC_VECTOR(3 DOWNTO 0);--变量传递数值
BEGIN
IF CLRN='0' THEN Q:=(OTHERS =>'0'); --计数器优先判断异步复位
ELSIF CLK EVENT AND CLK='1' THEN
IF EN='1' THEN --检测是否允许计数或加载(同步使 能)
IF LDN='0' THEN --允许加载预置数输入
Q:=INDATA;
ELSIF Q<9 THENQ:=Q+1; --允许计数,检测是否小于9
ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零
END IF;
END IF;
END IF;
IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT<='0';
END IF;
OUTDATA<=Q; --将计数值向端口输出
END PROCESS;
END ARCHI_74LS160;