vhdl双色点阵扫描显示控制器
- 用 8×8 点阵显示字符或图形,每次显示一个字符,每按下一次按键切
换一个字符,显示至少 6 个字符或图形,必须包含本人姓名的第一个字
母(W); - 用按键进行字符切换,要求为按键设计防抖动电路;
修改代码使其满足要求
点阵模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity dianzhen is
port(clk:in std_logic;
reset:in std_logic;
col_r:out std_logic_vector(7 downto 0);
col_g:out std_logic_vector(7 downto 0);
row:out std_logic_vector(7 downto 0));
end dianzhen;
architecture a of dianzhen is
signal sel7:std_logic_vector(2 downto 0);
signal sel8:std_logic_vector(2 downto 0);
signal clk_add:std_logic;
signal tmp:integer range 0 to 499;
begin
p1:process(clk)
begin
if clk'event and clk='1' then
if tmp=499 then
tmp<=0;clk_add<=not clk_add;
else tmp<=tmp+1;
end if;
end if;
end process p1;
p2:process(clk)
begin
if clk'event and clk='1' then
sel8<=sel8+1;
end if;
end process p2;
p3:process(clk_add,reset)
begin
if reset='1' then
sel7<="000";
elsif clk_add'event and clk_add='1' then
if sel7=O"6" then
sel7<=O"0";
else sel7<=sel7+1;
end if;
end if;
end process p3;
p4:process(sel7,sel8)
begin
case sel7 is
when O"0"=>case sel8 is
when O"7"=>col_r<="00000001";col_g<="11100001";row<="01111111";
when O"6"=>col_r<="00000011";col_g<="01100011";row<="10111111";
when O"5"=>col_r<="00000111";col_g<="00100111";row<="11011111";
when O"4"=>col_r<="00001000";col_g<="00011000";row<="11101111";
when O"3"=>col_r<="00010000";col_g<="00011000";row<="11110111";
when O"2"=>col_r<="11100000";col_g<="11100100";row<="11111011";
when O"1"=>col_r<="11000000";col_g<="11000110";row<="11111101";
when O"0"=>col_r<="10000000";col_g<="10000111";row<="11111110";
when OTHERS=>col_r<="00000000";col_g<="01111100";row<="11111110";
end case;
when O"1"=>case sel8 is
when O"7"=>col_r<="00010000";col_g<="00010000";row<="01111111";
when O"6"=>col_r<="00011000";col_g<="00011000";row<="10111111";
when O"5"=>col_r<="00010000";col_g<="00010000";row<="11011111";
when O"4"=>col_r<="00010000";col_g<="01011111";row<="11101111";
when O"3"=>col_r<="00001000";col_g<="11111010";row<="11110111";
when O"2"=>col_r<="00001000";col_g<="00001000";row<="11111011";
when O"1"=>col_r<="00011000";col_g<="00011000";row<="11111101";
when O"0"=>col_r<="00001000";col_g<="00001000";row<="11111110";
when OTHERS=>col_r<="00000000";col_g<="01111100";row<="11111110";
end case;
when O"2"=>case sel8 is
when O"7"=>col_r<="11100000";col_g<="11100001";row<="01111111";
when O"6"=>col_r<="01100000";col_g<="01100011";row<="10111111";
when O"5"=>col_r<="00100000";col_g<="00100111";row<="11011111";
when O"4"=>col_r<="00010000";col_g<="00011000";row<="11101111";
when O"3"=>col_r<="00001000";col_g<="00011000";row<="11110111";
when O"2"=>col_r<="00000100";col_g<="11100100";row<="11111011";
when O"1"=>col_r<="00000110";col_g<="11000110";row<="11111101";
when O"0"=>col_r<="00000111";col_g<="10000111";row<="11111110";
when OTHERS=>col_r<="00000000";col_g<="01111100";row<="11111110";
end case;
when O"3"=>case sel8 is
when O"7"=>col_r<="00000000";col_g<="00010000";row<="01111111";
when O"6"=>col_r<="00000000";col_g<="00011000";row<="10111111";
when O"5"=>col_r<="00000000";col_g<="00010000";row<="11011111";
when O"4"=>col_r<="01001111";col_g<="01011111";row<="11101111";
when O"3"=>col_r<="11110010";col_g<="11111010";row<="11110111";
when O"2"=>col_r<="00000000";col_g<="00001000";row<="11111011";
when O"1"=>col_r<="00000000";col_g<="00011000";row<="11111101";
when O"0"=>col_r<="00000000";col_g<="00001000";row<="11111110";
when OTHERS=>col_r<="00000000";col_g<="01111100";row<="11111110";
end case;
when O"4"=>case sel8 is
when O"7"=>col_r<="11000110";col_g<="00000000";row<="01111111";
when O"6"=>col_r<="01100110";col_g<="00000000";row<="10111111";
when O"5"=>col_r<="00110110";col_g<="00000000";row<="11011111";
when O"4"=>col_r<="00011110";col_g<="00000000";row<="11101111";
when O"3"=>col_r<="00110110";col_g<="00000000";row<="11110111";
when O"2"=>col_r<="01100110";col_g<="00000000";row<="11111011";
when O"1"=>col_r<="11000110";col_g<="00000000";row<="11111101";
when O"0"=>col_r<="11000110";col_g<="00000000";row<="11111110";
when OTHERS=>col_r<="00000000";col_g<="00000000";row<="11111110";
end case;
when O"5"=>case sel8 is
when O"7"=>col_r<="00000000";col_g<="00111110";row<="01111111";
when O"6"=>col_r<="00000000";col_g<="01000110";row<="10111111";
when O"5"=>col_r<="00000000";col_g<="01000110";row<="11011111";
when O"4"=>col_r<="00000000";col_g<="00111110";row<="11101111";
when O"3"=>col_r<="00000000";col_g<="00110110";row<="11110111";
when O"2"=>col_r<="00000000";col_g<="01100110";row<="11111011";
when O"1"=>col_r<="00000000";col_g<="11000110";row<="11111101";
when O"0"=>col_r<="00000000";col_g<="11000110";row<="11111110";
when OTHERS=>col_r<="00000000";col_g<="00000000";row<="11111110";
end case;
when O"6"=>case sel8 is
when O"7"=>col_r<="01111110";col_g<="00000000";row<="01111111";
when O"6"=>col_r<="01111110";col_g<="00000000";row<="10111111";
when O"5"=>col_r<="00011000";col_g<="00000000";row<="11011111";
when O"4"=>col_r<="00011000";col_g<="00000000";row<="11101111";
when O"3"=>col_r<="00011000";col_g<="00000000";row<="11110111";
when O"2"=>col_r<="00011000";col_g<="00000000";row<="11111011";
when O"1"=>col_r<="00011111";col_g<="00000000";row<="11111101";
when O"0"=>col_r<="00001110";col_g<="00000000";row<="11111110";
when OTHERS=>col_r<="00001110";col_g<="00000000";row<="11111110";
end case;
when others=>null;
end case;
end process p4;
end a;
防抖动模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
--anti-shake
ENTITY anti_shake_key is
port(
clk2: IN STD_LOGIC;
reset: IN STD_LOGIC;
resetn: OUT STD_LOGIC
);
END anti_shake_key;
ARCHITECTURE key_arch of anti_shake_key is
signal resetmp1,resetmp2:
STD_LOGIC;
begin
process(clk2)
begin
if(clk2'event and clk2 = '0') then
resetmp2 <= resetmp1;
resetmp1 <= reset;
end if;
end process;
resetn <= clk2 AND resetmp1 AND (NOT resetmp2);
END key_arch;
总体
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity zongti is
port(clk_in:in std_logic;
reset_in:in std_logic;
col_r_out:out std_logic_vector(7 downto 0);
col_g_out:out std_logic_vector(7 downto 0);
row_out:out std_logic_vector(7 downto 0));
end zongti;
architecture one of zongti is
component dianzhen
port(clk:in std_logic;
reset:in std_logic;
col_r:out std_logic_vector(7 downto 0);
col_g:out std_logic_vector(7 downto 0);
row:out std_logic_vector(7 downto 0));
end component;
component anti_shake_key
port(
clk2: IN STD_LOGIC;
reset: IN STD_LOGIC;
resetn: OUT STD_LOGIC
);
end component;
signal restmp:std_logic;
begin
u1:anti_shake_key port map(clk2=>clk_in,reset=>reset_in,resetn=>restmp);
u2:dianzhen port map(clk=>clk_in,reset=>restmp,col_r=>col_r_out,col_g=>col_g_out,row=>row_out);
end one;