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

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 SCAN8_LINE is
  9.       Port (   
  10. RESET : In STD_LOGIC;
  11. CLK_1M : In STD_LOGIC; -- 1MHz Clock
  12. TEST : In STD_LOGIC;  --  '1' for test mode
  13. ID7 : In UNSIGNED (9 downto 0); -- 8-bit CODE + 2-bit MODE
  14. ID6 : In UNSIGNED (9 downto 0); -- MODE: 00 for タ盽家Α
  15. ID5 : In UNSIGNED (9 downto 0); --       01 for はフ家Α
  16. ID4 : In UNSIGNED (9 downto 0); --       10 for 皗脅家Α
  17. ID3 : In UNSIGNED (9 downto 0); --       11 for OFF 家Α
  18. ID2 : In UNSIGNED (9 downto 0);
  19. ID1 : In UNSIGNED (9 downto 0);
  20. ID0 : In UNSIGNED (9 downto 0);
  21. SCAN_COL : Out STD_LOGIC_VECTOR (7 downto 0);
  22. SCAN_ROW : Out STD_LOGIC_VECTOR (7 downto 0);
  23. SCAN_DIG : Out STD_LOGIC_VECTOR (2 downto 0);
  24. --SCAN_DIG : Out STD_LOGIC_VECTOR (7 downto 0);
  25. DISP_ID : Out   UNSIGNED (7 downto 0)
  26. );
  27. end SCAN8_LINE;
  28. architecture BEHAVIORAL of SCAN8_LINE is
  29. signal div_05M : STD_LOGIC_VECTOR(19 downto 0);
  30. signal TEST_CLK_en : STD_LOGIC;
  31. signal SCAN_COUNT : STD_LOGIC_VECTOR(5 downto 0);
  32. signal iSCAN_LINE : STD_LOGIC_VECTOR(7 downto 0);
  33. signal iSCAN_DIGIT : STD_LOGIC_VECTOR(2 downto 0);
  34. signal iSCAN_ROW : UNSIGNED(2 downto 0);
  35. signal iFONT_CODE : STD_LOGIC_VECTOR(7 downto 0);
  36. signal iSCAN_ADDR : UNSIGNED(10 downto 0);
  37. signal iDISP_CODE : RAM_TYPE(7 downto 0); 
  38. signal iDISP_ID : UNSIGNED(7 downto 0);
  39. signal iMODE : UNSIGNED(1 downto 0);
  40. signal iBlink_CLK : STD_LOGIC;
  41. component CHAR_FONT 
  42. Port (   
  43. SCAN_ADDR : In UNSIGNED (10 downto 0);
  44. FONT_CODE : Out STD_LOGIC_VECTOR (7 downto 0)
  45. );
  46. end component;
  47. begin
  48. ----------- 8 digit scan module ------------------------
  49.   process(RESET,CLK_1M)
  50.   begin
  51.    if RESET = '1' then
  52. iSCAN_LINE <= "10000000";
  53. SCAN_COUNT <= "111111";  -- Digit Count & Line Count
  54.    elsif CLK_1M'event and CLK_1M = '1' then
  55. if SCAN_COUNT(2 downto 0) = "111" then -- rotate left 1 bit
  56. iSCAN_LINE <= iSCAN_LINE(6 downto 0) & iSCAN_LINE(7);
  57. end if;
  58. SCAN_COUNT <= SCAN_COUNT + 1;
  59.    end if;
  60.   end process;
  61.   process(RESET,CLK_1M)
  62.   begin
  63.    if RESET = '1' then
  64.    div_05M <= X"00000";
  65.    iBlink_CLK <= '0'; -- ~2Hz clock
  66.    elsif CLK_1M'event and CLK_1M = '1' then
  67. if TEST = '0' then -- Normal use, 
  68.    if div_05M(18) = '1' then
  69.    div_05M <= X"00000";
  70.    iBlink_CLK <= not iBlink_CLK;
  71.    else
  72.    div_05M <= div_05M + 1;
  73.    end if;
  74. else -- Test Mode, CLK_2Hz = 1M/16 
  75. iBlink_CLK <= TEST_CLK_en;
  76.    end if;
  77.    end if;
  78.   end process;
  79.   TEST_CLK_en <= '1' when SCAN_COUNT = "111111" else
  80.      '0';
  81.   iSCAN_DIGIT <= not SCAN_COUNT(2 downto 0);
  82.   iSCAN_ROW <= CONV_UNSIGNED(CONV_INTEGER(SCAN_COUNT(5 downto 3)),3);
  83.   SCAN_DIG    <= iSCAN_DIGIT;
  84.   --SCAN_DIG <= "01111111" when iSCAN_DIGIT = "111" else
  85.   -- "10111111" when iSCAN_DIGIT = "110" else
  86.   -- "11011111" when iSCAN_DIGIT = "101" else
  87.   -- "11101111" when iSCAN_DIGIT = "100" else
  88.   -- "11110111" when iSCAN_DIGIT = "011" else
  89.   -- "11111011" when iSCAN_DIGIT = "010" else
  90.   -- "11111101" when iSCAN_DIGIT = "001" else
  91.   -- "11111110";
  92.   iDISP_ID <=   ID7(9 downto 2) when iSCAN_DIGIT = "111" else
  93. ID6(9 downto 2) when iSCAN_DIGIT = "110" else
  94. ID5(9 downto 2) when iSCAN_DIGIT = "101" else
  95. ID4(9 downto 2) when iSCAN_DIGIT = "100" else
  96. ID3(9 downto 2) when iSCAN_DIGIT = "011" else
  97. ID2(9 downto 2) when iSCAN_DIGIT = "010" else
  98. ID1(9 downto 2) when iSCAN_DIGIT = "001" else
  99. ID0(9 downto 2);
  100.  
  101.    iMODE <= ID7(1 downto 0) when iSCAN_DIGIT = "111" else
  102.     ID6(1 downto 0) when iSCAN_DIGIT = "110" else
  103.     ID5(1 downto 0) when iSCAN_DIGIT = "101" else
  104.     ID4(1 downto 0) when iSCAN_DIGIT = "100" else
  105.     ID3(1 downto 0) when iSCAN_DIGIT = "011" else
  106.     ID2(1 downto 0) when iSCAN_DIGIT = "010" else
  107.     ID1(1 downto 0) when iSCAN_DIGIT = "001" else
  108.     ID0(1 downto 0);
  109.  iSCAN_ADDR <= iDISP_ID & iSCAN_ROW;
  110.   DISP_ID <= iDISP_ID;
  111.   --SCAN_COL <= iFONT_CODE;
  112.   SCAN_COL <= iFONT_CODE when iMODE = 0 else
  113.    NOT iFONT_CODE when iMODE = 1 else
  114.    --iFONT_CODE AND iBlink_CLK;
  115. iFONT_CODE when iMODE = 2 and iBlink_CLK = '1' else
  116. "00000000"; -- when iMODE = 3 or iBlink_CLK = 0
  117.   SCAN_ROW <= iSCAN_LINE;
  118.   FONT_ROM: CHAR_FONT 
  119.    Port Map (   
  120. SCAN_ADDR => iSCAN_ADDR,
  121. FONT_CODE => iFONT_CODE );
  122. end BEHAVIORAL;