第一章作业

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语句表示的意义

  1. wait
  2. 2 . wait on 信号表
  3. wait until 条件表达式
  4. 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、下载测试

封装