基于VHDL语言的数码管动态扫描系统的设计

  • 格式:doc
  • 大小:40.50 KB
  • 文档页数:8

文件1:(顶层设计)SMG_SCAN LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY SMG_SCAN IS PORT ( DAT : IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; EN , CLK , WR , A_D : IN STD_LOGIC ; SEG : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; Y : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ) ; END ENTITY SMG_SCAN ; ARCHITECTURE ONE OF SMG_SCAN IS SIGNAL RD , TEMP1 : STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; SIGNAL ADDR , TEMP2 : STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ; COMPONENT M1 IS PORT ( DAT : IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; A_D , WR , EN : IN STD_LOGIC ; RD : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; ADDR : IN STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ) ; END COMPONENT ; COMPONENT M2 IS PORT ( CLK , EN : IN STD_LOGIC ; RD : IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; SEG : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; Y : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; ADDR : OUT STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ) ; END COMPONENT ; BEGIN TEMP1 <= RD ; TEMP2 <= ADDR ; U1 : M1 PORT MAP ( DAT => DAT , A_D => A_D , WR => WR , EN => EN , RD => RD , ADDR => TEMP2 ) ; U2 : M2 PORT MAP ( CLK => CLK , SEG => SEG , Y => Y , EN => EN , RD => TEMP1 , ADDR => ADDR ) ; END ARCHITECTURE ONE ;

文件2 :(中层设计)M2 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY M2 IS PORT ( RD : IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; CLK , EN : IN STD_LOGIC ; Y : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; SEG : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; ADDR : OUT STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ) ; END ENTITY M2 ; ARCHITECTURE ONE OF M2 IS SIGNAL TEMP , ADDR0 : STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ; COMPONENT M2_1 IS PORT ( CLK , EN : IN STD_LOGIC ; ADDR0 : OUT STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ) ; END COMPONENT ; COMPONENT M2_2 IS PORT ( EN : IN STD_LOGIC ; ADDR0 : IN STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ; Y : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ) ; END COMPONENT ; COMPONENT M2_3 IS PORT ( RD : IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; EN : IN STD_LOGIC ; SEG : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ) ; END COMPONENT ; BEGIN TEMP <= ADDR0 ; U1 : M2_1 PORT MAP ( CLK => CLK , EN => EN , ADDR0 => ADDR0 ) ; U2 : M2_2 PORT MAP ( EN => EN , Y => Y , ADDR0 => TEMP ) ; U3 : M2_3 PORT MAP ( RD => RD , EN => EN , SEG => SEG ) ; ADDR <= TEMP ; END ARCHITECTURE ONE ;

文件3 :(底层设计1)M1 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY M1 IS PORT ( DAT : IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; A_D , WR , EN : IN STD_LOGIC ; ADDR : IN STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ; RD : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ) ; END ENTITY M1 ; ARCHITECTURE ONE OF M1 IS TYPE STATE IS ( NOUT , RD_ADDR , RD_DAT ) ; TYPE REG IS ARRAY ( 7 DOWNTO 0 ) OF STD_LOGIC_VECTOR ( 3 DOWNTO 0 ) ; SIGNAL MYREG : REG ; SIGNAL CURRENT_STATE , NEXT_STATE : STATE ; SIGNAL X , CNT0 : INTEGER RANGE 0 TO 7 ; BEGIN

NEXT_STATE_LOGIC : PROCESS ( CURRENT_STATE , WR , A_D , EN , CNT0 ) BEGIN IF EN = '0' THEN NEXT_STATE <= RD_ADDR ; MYREG ( 0 ) <= "0000" ; MYREG ( 1 ) <= "0000" ; MYREG ( 2 ) <= "0000" ; MYREG ( 3 ) <= "0000" ; MYREG ( 4 ) <= "0000" ; MYREG ( 5 ) <= "0000" ; MYREG ( 6 ) <= "0000" ; MYREG ( 7 ) <= "0000" ; ELSE CASE CURRENT_STATE IS WHEN NOUT => NEXT_STATE <= RD_ADDR ; WHEN RD_ADDR => IF CNT0 = 1 AND A_D = '1' THEN X <= CONV_INTEGER ( DAT ( 2 DOWNTO 0 ) ) ; NEXT_STATE <= RD_DAT ; END IF ; WHEN RD_DAT => IF CNT0 = 0 AND A_D = '0' THEN CASE X IS WHEN 0 => MYREG ( 0 ) <= DAT ; WHEN 1 => MYREG ( 1 ) <= DAT ; WHEN 2 => MYREG ( 2 ) <= DAT ; WHEN 3 => MYREG ( 3 ) <= DAT ; WHEN 4 => MYREG ( 4 ) <= DAT ; WHEN 5 => MYREG ( 5 ) <= DAT ; WHEN 6 => MYREG ( 6 ) <= DAT ; WHEN 7 => MYREG ( 7 ) <= DAT ; END CASE ; NEXT_STATE <= RD_ADDR ; END IF ; WHEN OTHERS => NEXT_STATE <= NOUT ; END CASE ; END IF ; END PROCESS NEXT_STATE_LOGIC ;

STATE_STORE : PROCESS ( CNT0 ) BEGIN CURRENT_STATE <= NEXT_STATE ; END PROCESS STATE_STORE ;

OUTPUT_LOGIC : PROCESS ( CURRENT_STATE , ADDR ) BEGIN CASE CURRENT_STATE IS WHEN NOUT => RD <= "ZZZZ" ; WHEN RD_ADDR => CASE ADDR IS WHEN "000" => RD <= MYREG ( 0 ) ; WHEN "001" => RD <= MYREG ( 1 ) ; WHEN "010" => RD <= MYREG ( 2 ) ; WHEN "011" => RD <= MYREG ( 3 ) ; WHEN "100" => RD <= MYREG ( 4 ) ; WHEN "101" => RD <= MYREG ( 5 ) ; WHEN "110" => RD <= MYREG ( 6 ) ; WHEN "111" => RD <= MYREG ( 7 ) ; WHEN OTHERS => RD <= "ZZZZ" ; END CASE ; WHEN RD_DAT => CASE ADDR IS WHEN "000" => RD <= MYREG ( 0 ) ; WHEN "001" => RD <= MYREG ( 1 ) ; WHEN "010" => RD <= MYREG ( 2 ) ; WHEN "011" => RD <= MYREG ( 3 ) ; WHEN "100" => RD <= MYREG ( 4 ) ; WHEN "101" => RD <= MYREG ( 5 ) ; WHEN "110" => RD <= MYREG ( 6 ) ; WHEN "111" => RD <= MYREG ( 7 ) ; WHEN OTHERS => RD <= "ZZZZ" ; END CASE ;