问答题 用VHDL语言设计一个时序逻辑电路其功能是对一组(256个)并行输入的8位数据进行判别,找出该组数据的最大值、最小值,并计算最大值与最小值之间的差值。
【正确答案】先设计一个求最大值、最小值和差值的模块,再设计一个顶层电路将这三个模块连接,并且当比较完毕256个数后,可以分别输出最大值、最小值和差值。下面分别设计这些模块。
   (1)求最大值模块的VHDL程序如下:
   LIBRARY ieee;
   USE ieee.Std_logic_1164.ALL;
   ENTITY max810 IS
   PORT(ncr,cp:IN Std_logic;d:IN Std_logic_vector(7 downto 0);q:BUFFER Std_logic_vector(7 downto 0));
    END max810;
    ARCHITECTURE max810_ar OF max810 IS
       BEGIN
       PROCESS(ncr, cp, d)
          BEGIN
             IF ncr='0' THEN
                  q<= "00000000" ;
             ELSIF cp'EVENT AND cp='1' THEN
               IF d>q THEN ——如果新数值大于以前存储的最大数
                ELSE
                  NULL;
                END IF;
             END IF;
          END PROCESS;
    END max810_ar ;
    LIBRARY ieee;
    USE ieee. Std_logic_1164. ALL;
    ENTITY rain810 IS
    PORT(npr, cp: IN Std_logic ; d: IN Std_logic_vector(7 downto 0) ; q: BUFFER Std_logic_vector (7downto 0)) ;
    END rain810;
    ARCHITECTURE min810_ar OF rain810 IS
    BEGIN
       PROCESS(npr, cp, d)
       BEGIN
          IF npr='0' THEN
                  q<= "11111111";
          ELSIF cp'EVENT AND cp='1' THEN
             IF d<q THEN ——如果新数值小于以前存储的最小数
   q<=d; ——修改最小数
             ELSE
                NULL;
             END IF;
          END IF;
       END PROCESS;
    END min810_ar;
   通过仿真后,生成min810元件,以便顶层电路调用。
   (3)求差值模块的VHDL程序如下:
   LIBRARY ieee;
   USE ieee.Std_logic_1164.ALL;
   USE ieee.Std_logic_arith.ALL
   USE ieee.Std_logic_unsigned.ALL;
   ENTITY sub810 IS
   PORT(a,b:IN Std_logic_vector(7 downto 0);q:BUFFER Std_logic_vector(7 downto 0));
   END sub810:
   ARCHITECTURE sub810_ar OF sub810 IS
   S1GNAL m,n,p:Integer range 255 downto 0;
   BEGIN
   m<=CONV_INTEGER(a);n<=CONV_INTEGER(b);
   p<=m-n;
   q<=CONV_STD_LOGIC_VECTOR(p, 8);
   END sub810_ar;
   通过仿真后,生成sub810元件,以便顶层电路调用。
   (4)顶层电路中的控制电路可计256个数,并且在计第256个数时,存储分别由求最大值模块、求最小值模块和求差值模块求出的最大值、最小值和差值,该控制电路用行为描述设计。另外,用配置语句将求最大值模块、求最小值模块和求差值模块配置到顶层电路。因此,顶层电路是采用混合描述方式设计的,其VHDL程序如下:
   LIBRARY ieee;
   USE icee.Std_logic_1164.ALL;
   USE ieee.Std_logic_arith.ALL;
   USE ieee.Std_logic_unsigned.ALL;
   USE work.components.ALL;
   ENTITY xiti810 IS
   PORT(cp, ncr,s1,s0:IN Std_logic;d:IN Std_logic_vector(7 downto 0);q:OUT Std_logic_vector(7 downto 0));
   END xiti810;
   ARCHITECTURE xiti810_ar OF xiti810 IS
   COMPONENT max810
   PORT(ncr,cp:IN Std_logic;d:IN Std_logic_vector(7 downto 0);q:BUFFER Std_logic-vector(7 downto 0));
   END COMPONENT;
   COMPONENT min810
   PORT(npr,cp:IN Std_logic;d:IN Std_logic_vector(7 downto 0);q:BUFFER Std_logic_vector(7 downto 0));
   END COMPONENT;
   COMPONENT sub810
   PORT(a, b:IN Std_logic_vector(7 downto 0);q:BUFFER Std_logic_vector(7 downto 0));
   END COMPONENT;
   SIGNAL a,b,C,iq.qa,qb,qc:Std_logic_vector(7 downto 0);
   SIGNAL sel:Std_logic_vector(1 downto 0);
   SIGNAL oc:Std_logic;
   BEGIN
   c_p:PROCESS(cp,ncr)——存储256数中的最大值、最小值和差值的进程
   BEGIN
   IF ner='0' THEN
   iq<="00000000";
   ELSIF cp'EVENT AND cp='1' THEN
   IF iq<"11111111" THEN
   iq<=iq+"00000001";
   ELSIF iq="11111111" THEN
   iq<="00000000";qa<=a;qb<=b;qc<=c;
   ——计满256个数,存储最大值、最小值和差值
   ELSE
   iq<="00000000";
   END IF;
   END IF;
   END PROCESS;
   sel<=s1&s0;——选择输出类型的控制端子
   main_p:PROCESS(sel)——输出存储结果的进程
   BEGIN
   CASE sel IS
   WHEN "00"=>q<=qa;——输出最大值
   WHEN "01"=>q<=qb;——输出最小值
   WHEN "10"=>q<=qc;——输出差值
   WHEN OTHERS=>q<="00000000";
   END CASE;
   END PROCESS;
   u0:max810 PORT MAP(net,cp,d,a);——配置元件max810
   u1:min810 PORT MAP(ncr, cp,d,b);——配置元件min810
   u2:sub810 PORT MAP(a,b,c);——配置元件sub810
   END xiti810_ar;
【答案解析】