SCAN_1DIG.VHD
上传用户:dgjihui88
上传日期:2013-07-23
资源大小:43k
文件大小:3k
源码类别:

VHDL/FPGA/Verilog

开发平台:

MultiPlatform

  1. library IEEE;
  2.    use IEEE.std_logic_1164.all;
  3.    use IEEE.std_logic_arith.all;
  4.    use IEEE.std_logic_unsigned.all;
  5.  
  6. library work;
  7.    use work.my_package.all;
  8. entity SCAN_1DIG is
  9.       Port (RESET : In STD_LOGIC;
  10.     CLK_10M : In STD_LOGIC; -- 10MHz Clock
  11.     TEST : In STD_LOGIC; 
  12.     SCAN_CODE : Out STD_LOGIC_VECTOR (7 downto 0);
  13.     SCAN_ROW : Out STD_LOGIC_VECTOR (7 downto 0));
  14. end SCAN_1DIG;
  15. architecture BEHAVIORAL of SCAN_1DIG is
  16. signal CLK_1M, CLK_1Hz : STD_LOGIC;
  17. signal div10 : STD_LOGIC_VECTOR(3 downto 0);
  18. signal div_1M : STD_LOGIC_VECTOR(19 downto 0);
  19. signal SCAN_LINE : STD_LOGIC_VECTOR(7 downto 0);
  20. signal SCAN_COUNT : STD_LOGIC_VECTOR(2 downto 0);
  21. signal iDISP_CODE : STD_LOGIC_VECTOR(7 downto 0);
  22. signal iFONT_CODE : STD_LOGIC_VECTOR(7 downto 0);
  23. signal iSCAN_ADDR : STD_LOGIC_VECTOR(10 downto 0);
  24. component CHAR_FONT 
  25. Port (SCAN_ADDR : In STD_LOGIC_VECTOR (10 downto 0);
  26.       FONT_CODE : Out STD_LOGIC_VECTOR (7 downto 0)
  27.       );
  28. end component;
  29. begin
  30. ----------- Clock generator module ------------------------
  31. Clock_generator: block begin
  32.   process(RESET,CLK_10M)
  33.   begin
  34.    if RESET = '1' then
  35.    div10 <= "0000";
  36.    CLK_1M <= '0'; -- 1MHz clock for scan controller
  37.    elsif CLK_10M'event and CLK_10M = '1' then
  38.    if div10 = 9 then
  39.    div10 <= "0000";
  40.    else
  41.    div10 <= div10 + 1;
  42.    end if;
  43.    if div10 = 4 then
  44.    CLK_1M <= not CLK_1M;
  45.    end if;
  46.    end if;
  47.   end process;
  48.   process(RESET,CLK_1M)
  49.   begin
  50.    if RESET = '1' then
  51.    div_1M <= X"00000";
  52.    CLK_1Hz <= '0'; -- ~1Hz clock
  53.    elsif CLK_1M'event and CLK_1M = '1' then
  54. if TEST = '0' then -- Normal use, 
  55.    if div_1M(19) = '1' then
  56.    div_1M <= "00000000000000000000";
  57.    CLK_1Hz <= not CLK_1Hz;
  58.    else
  59.    div_1M <= div_1M + 1;
  60.    end if;
  61. else -- Test Mode, CLK_1Hz = 1M/16 
  62.    if div_1M(3) = '1' then
  63.    div_1M <= "00000000000000000000";
  64.    CLK_1Hz <= not CLK_1Hz;
  65.    else
  66.    div_1M <= div_1M + 1;
  67.    end if;
  68.    end if;
  69.    end if;
  70.   end process;
  71. end block;
  72. ----------- 4 bit Hexdecimal counter module ------------------------
  73. Hex_counter: block begin
  74.   process(RESET,CLK_1Hz)
  75.   begin
  76.    if RESET = '1' then
  77.    iDISP_CODE <= "00000000";
  78.    elsif CLK_1Hz'event and CLK_1Hz = '1' then
  79.    iDISP_CODE <= iDISP_CODE + 1;
  80.    end if;
  81.   end process;
  82. end block;
  83. ----------- 1 digit scan  module ------------------------
  84. scan_module: block begin
  85.   process(RESET,CLK_1M)
  86.   begin
  87.    if RESET = '1' then
  88. SCAN_LINE <= "10000000";
  89. SCAN_COUNT <= "111";  -- Digit Count & Line Count
  90.    elsif CLK_1M'event and CLK_1M = '1' then
  91. SCAN_LINE <= SCAN_LINE(6 downto 0) & SCAN_LINE(7); -- rotate left 1 bit
  92. SCAN_COUNT <= SCAN_COUNT + 1;
  93.    end if;
  94.   end process;
  95.   iSCAN_ADDR <= iDISP_CODE & SCAN_COUNT(2 downto 0);
  96.   SCAN_CODE <= iFONT_CODE;
  97.   SCAN_ROW <= SCAN_LINE;
  98.   FONT_ROM: CHAR_FONT 
  99.    Port Map (   
  100. SCAN_ADDR => iSCAN_ADDR,
  101. FONT_CODE => iFONT_CODE );
  102. end block;
  103. end BEHAVIORAL;