【正确答案】先设计一个求最大值、最小值和差值的模块,再设计一个顶层电路将这三个模块连接,并且当比较完毕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;
【答案解析】