中科因仑“3+1”工程特种兵精英论坛

标题: VHDL 的5110液晶显示程序,全部源码。 [打印本页]

作者: 天道出勤    时间: 2016-5-18 22:44
标题: VHDL 的5110液晶显示程序,全部源码。
FPGA描绘一个硬件电路构成的SPI总线。
貌似我这中写法50MHZ的主频下最快可以接近25Mbps的传输速率.
控制里加了个程序计数器和一个状态返回寄存器,模拟MCU,使控制起来方便一些。
从51的程序里搞了个ASCII码的字库进去,测试通过。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity lcd5110 is
port(mclk,reset:in std_logic;
      vccut std_logic;
      gndut std_logic;
      ledut std_logic;
      lcd_rstut std_logic;
      cs,sclk,mosi,cdut std_logic;
      miso:in std_logic
     
);

end entity;


architecture behav of lcd5110 is
signal cnt:integer range 0 to 255;
signal clk:std_logic;
type state is (clk_l,clk_h,clk_rising_edge,clk_falling_edge);
signal p:state:=clk_l;
type state2 is (idle,shift_data,shift_data1,clear_screen,set_xy,disp_char);
signal p2:state2:=idle;
signal p_back:state2;
signal data_reg:std_logic_vector(7 downto 0);
signal cnt2:integer range 0 to 8;
signal cnt3:integer range 0 to 65535;
signal cnt4:integer range 0 to 512;
signal char_reg:integer range 0 to 91;
signal y_reg:std_logic_vector(2 downto 0);
signal x_reg:std_logic_vector(6 downto 0);
type reg is array(0 to 5) of std_logic_vector(7 downto 0);
type reg2 is array (0 to 91) of reg;
constant ASCII:reg2:=(           
    (x"00", x"00", x"00", x"00", x"00", x"00"),   -- 0  sp
    (x"00", x"00", x"00", x"2f", x"00", x"00"),   -- 1  !  
    (x"00", x"00", x"07", x"00", x"07", x"00"),   -- 2  "
    (x"00", x"14", x"7f", x"14", x"7f", x"14"),   -- 3  #
    (x"00", x"24", x"2a", x"7f", x"2a", x"12"),   -- 4  $
    (x"00", x"62", x"64", x"08", x"13", x"23"),   -- 5  %
    (x"00", x"36", x"49", x"55", x"22", x"50"),   -- 6  &
    (x"00", x"00", x"05", x"03", x"00", x"00"),   -- 7  '
    (x"00", x"00", x"1c", x"22", x"41", x"00"),   -- 8  (
    (x"00", x"00", x"41", x"22", x"1c", x"00"),   -- 9  )
    (x"00", x"14", x"08", x"3E", x"08", x"14"),   -- 10 *
    (x"00", x"08", x"08", x"3E", x"08", x"08"),   -- 11 +
    (x"00", x"00", x"00", x"A0", x"60", x"00"),   -- 12 ",
    (x"00", x"08", x"08", x"08", x"08", x"08"),   -- 13 -
    (x"00", x"00", x"60", x"60", x"00", x"00"),   -- 14 .
    (x"00", x"20", x"10", x"08", x"04", x"02"),   -- 15 /
    (x"00", x"3E", x"51", x"49", x"45", x"3E"),   -- 16 0
    (x"00", x"00", x"42", x"7F", x"40", x"00"),   -- 17 1
    (x"00", x"42", x"61", x"51", x"49", x"46"),   -- 18 2
    (x"00", x"21", x"41", x"45", x"4B", x"31"),   -- 19 3
    (x"00", x"18", x"14", x"12", x"7F", x"10"),   -- 20 4
    (x"00", x"27", x"45", x"45", x"45", x"39"),   -- 21 5
    (x"00", x"3C", x"4A", x"49", x"49", x"30"),   -- 22 6
    (x"00", x"01", x"71", x"09", x"05", x"03"),   -- 23 7
    (x"00", x"36", x"49", x"49", x"49", x"36"),   -- 24 8
    (x"00", x"06", x"49", x"49", x"29", x"1E"),   -- 25 9
    (x"00", x"00", x"36", x"36", x"00", x"00"),   -- 26 :
    (x"00", x"00", x"56", x"36", x"00", x"00"),   -- 27 ;
    (x"00", x"08", x"14", x"22", x"41", x"00"),   -- 28 <
    (x"00", x"14", x"14", x"14", x"14", x"14"),   -- 29 =
    (x"00", x"00", x"41", x"22", x"14", x"08"),   -- 30 >
    (x"00", x"02", x"01", x"51", x"09", x"06"),   -- 31 ?
    (x"00", x"32", x"49", x"59", x"51", x"3E"),   -- 32 @
    (x"00", x"7C", x"12", x"11", x"12", x"7C"),   -- 33 A
    (x"00", x"7F", x"49", x"49", x"49", x"36"),   -- 34 B
    (x"00", x"3E", x"41", x"41", x"41", x"22"),   -- 35 C
    (x"00", x"7F", x"41", x"41", x"22", x"1C"),   -- 36 D
    (x"00", x"7F", x"49", x"49", x"49", x"41"),   -- 37 E
    (x"00", x"7F", x"09", x"09", x"09", x"01"),   -- 38 F
    (x"00", x"3E", x"41", x"49", x"49", x"7A"),   -- 39 G
    (x"00", x"7F", x"08", x"08", x"08", x"7F"),   -- 40 H
    (x"00", x"00", x"41", x"7F", x"41", x"00"),   -- 41 I
    (x"00", x"20", x"40", x"41", x"3F", x"01"),   -- 42 J
    (x"00", x"7F", x"08", x"14", x"22", x"41"),   -- 43 K
    (x"00", x"7F", x"40", x"40", x"40", x"40"),   -- 44 L
    (x"00", x"7F", x"02", x"0C", x"02", x"7F"),   -- 45 M
    (x"00", x"7F", x"04", x"08", x"10", x"7F"),   -- 46 N
    (x"00", x"3E", x"41", x"41", x"41", x"3E"),   -- 47 O
    (x"00", x"7F", x"09", x"09", x"09", x"06"),   -- 48 P
    (x"00", x"3E", x"41", x"51", x"21", x"5E"),   -- 49 Q
    (x"00", x"7F", x"09", x"19", x"29", x"46"),   -- 50 R
    (x"00", x"46", x"49", x"49", x"49", x"31"),   -- 51 S
    (x"00", x"01", x"01", x"7F", x"01", x"01"),   -- 52 T
    (x"00", x"3F", x"40", x"40", x"40", x"3F"),   -- 53 U
    (x"00", x"1F", x"20", x"40", x"20", x"1F"),   -- 54 V
    (x"00", x"3F", x"40", x"38", x"40", x"3F"),   -- 55 W
    (x"00", x"63", x"14", x"08", x"14", x"63"),   -- 56 X
    (x"00", x"07", x"08", x"70", x"08", x"07"),   -- 57 Y
    (x"00", x"61", x"51", x"49", x"45", x"43"),   -- 58 Z
    (x"00", x"00", x"7F", x"41", x"41", x"00"),   -- 59 [
    (x"00", x"55", x"2A", x"55", x"2A", x"55"),   -- 60 55
    (x"00", x"00", x"41", x"41", x"7F", x"00"),   -- 61 ]
    (x"00", x"04", x"02", x"01", x"02", x"04"),   -- 62 ^
    (x"00", x"40", x"40", x"40", x"40", x"40"),   -- 63 _
    (x"00", x"00", x"01", x"02", x"04", x"00"),   -- 64 '
    (x"00", x"20", x"54", x"54", x"54", x"78"),   -- 65 a
    (x"00", x"7F", x"48", x"44", x"44", x"38"),   -- 66 b
    (x"00", x"38", x"44", x"44", x"44", x"20"),   -- 67 c
    (x"00", x"38", x"44", x"44", x"48", x"7F"),   -- 68 d
    (x"00", x"38", x"54", x"54", x"54", x"18"),   -- 69 e
    (x"00", x"08", x"7E", x"09", x"01", x"02"),   -- 70 f
    (x"00", x"18", x"A4", x"A4", x"A4", x"7C"),   -- 71 g
    (x"00", x"7F", x"08", x"04", x"04", x"78"),   -- 72 h
    (x"00", x"00", x"44", x"7D", x"40", x"00"),   -- 73 i
    (x"00", x"40", x"80", x"84", x"7D", x"00"),   -- 74 j
    (x"00", x"7F", x"10", x"28", x"44", x"00"),   -- 75 k
    (x"00", x"00", x"41", x"7F", x"40", x"00"),   -- 76 l
    (x"00", x"7C", x"04", x"18", x"04", x"78"),   -- 77 m
    (x"00", x"7C", x"08", x"04", x"04", x"78"),   -- 78 n
    (x"00", x"38", x"44", x"44", x"44", x"38"),   -- 79 o
    (x"00", x"FC", x"24", x"24", x"24", x"18"),   -- 80 p
    (x"00", x"18", x"24", x"24", x"18", x"FC"),   -- 81 q
    (x"00", x"7C", x"08", x"04", x"04", x"08"),   -- 82 r
    (x"00", x"48", x"54", x"54", x"54", x"20"),   -- 83 s
    (x"00", x"04", x"3F", x"44", x"40", x"20"),   -- 84 t
    (x"00", x"3C", x"40", x"40", x"20", x"7C"),   -- 85 u
    (x"00", x"1C", x"20", x"40", x"20", x"1C"),   -- 86 v
    (x"00", x"3C", x"40", x"30", x"40", x"3C"),   -- 87 w
    (x"00", x"44", x"28", x"10", x"28", x"44"),   -- 88 x
    (x"00", x"1C", x"A0", x"A0", x"A0", x"7C"),   -- 89 y
    (x"00", x"44", x"64", x"54", x"4C", x"44"),   -- 90 z
    (x"14", x"14", x"14", x"14", x"14", x"14")    -- 91 horiz lines
);


constant ONN:std_logic:='0';
constant OFF:std_logic:='1';
constant CMD:std_logic:='0';
constant DATA:std_logic:='1';

begin
sclk<=clk;
vcc<='1';
gnd<='0';
led<='1';
lcd_rst<='1';



process (mclk)   ---div clk
begin
if mclk'event and mclk='1'
then if reset='0'
then cnt<=0;
else cnt<=cnt+1;
if cnt=49 then
cnt<=0;
end if;
if cnt<25 then
clk<='0';
else clk<='1';
end if;
end if;
end if;
end process ;


process (mclk)  
begin
if mclk'event and mclk='1'
then if reset='0'
then p<=clk_l;


else

case p is
when clk_l =>
if clk='1' then
p<=clk_rising_edge;
else p<=clk_l;
end if;

when clk_rising_edge=>
p<=clk_h;

when clk_h=>
if clk='0' then
p<=clk_falling_edge;
else p<=clk_h;
end if;

when clk_falling_edge=>
p<=clk_l;

when others =>null;
end case ;
end if;
end if;
end process;



process(mclk)                       

begin
if mclk'event and mclk='1'
then if reset='0'
then p2<=idle;
     cs<=OFF;
     cnt3<=0;
else

case p2 is
when idle =>
cs<=OFF;
cnt3<=cnt3+1;
case cnt3 is
when 0=> data_reg<=x"21";cd<=CMD;p2<=shift_data;p_back<=idle;
when 1=> data_reg<=x"c8";cd<=CMD;p2<=shift_data;p_back<=idle;
when 2=> data_reg<=x"06";cd<=CMD;p2<=shift_data;p_back<=idle;
when 3=> data_reg<=x"13";cd<=CMD;p2<=shift_data;p_back<=idle;
when 4=> data_reg<=x"20";cd<=CMD;p2<=shift_data;p_back<=idle;
when 5=> p2<=clear_screen;p_back<=clear_screen;
when 6=> data_reg<=x"0c";cd<=CMD;p2<=shift_data;p_back<=idle;
when 7=> p2<=set_xy;p_back<=set_xy;y_reg<="010";x_reg<="0000110";
when 8=> p2<=disp_char;p_back<=disp_char;char_reg<=40;  --H
when 9=> p2<=disp_char;p_back<=disp_char;char_reg<=69;  --e
when 10=> p2<=disp_char;p_back<=disp_char;char_reg<=76; --l
when 11=> p2<=disp_char;p_back<=disp_char;char_reg<=76; --l
when 12=> p2<=disp_char;p_back<=disp_char;char_reg<=79; --o
when 13=> p2<=disp_char;p_back<=disp_char;char_reg<=0;  --
when 14=> p2<=disp_char;p_back<=disp_char;char_reg<=55; --W
when 15=> p2<=disp_char;p_back<=disp_char;char_reg<=79; --o
when 16=> p2<=disp_char;p_back<=disp_char;char_reg<=82; --r
when 17=> p2<=disp_char;p_back<=disp_char;char_reg<=76; --l
when 18=> p2<=disp_char;p_back<=disp_char;char_reg<=68; --d
when 19=> p2<=disp_char;p_back<=disp_char;char_reg<=1;  --!
when 20=> p2<=set_xy;p_back<=set_xy;y_reg<="011";x_reg<="0011011";
when 21=> p2<=disp_char;p_back<=disp_char;char_reg<=18;  --2
when 22=> p2<=disp_char;p_back<=disp_char;char_reg<=16;  --0
when 23=> p2<=disp_char;p_back<=disp_char;char_reg<=17;  --1
when 24=> p2<=disp_char;p_back<=disp_char;char_reg<=16;  --0

when 25=>cnt3<=25;

when others=>null;
end case;

when shift_data=>
if p=clk_falling_edge then   --falling edge output
   if cnt2=8 then
      cnt2<=0;
      p2<=p_back;
   else
   p2<=shift_data1;
   cs<=ONN;
   mosi<=data_reg(7);
   end if;
else p2<=shift_data;
end if;


when shift_data1=>
if p=clk_rising_edge then   --rising edge input
   data_reg<=data_reg(6 downto 0)& miso;
   cnt2<=cnt2+1;
   p2<=shift_data;
else
   p2<=shift_data1;
end if;

when clear_screen=>
data_reg<=x"00";
cnt4<=cnt4+1;
cs<=OFF;
cd<=DATA;
if cnt4=504
then cnt4<=0;
p2<=idle;
else
p2<=shift_data;
end if;

when set_xy=>
cnt4<=cnt4+1;
cs<=OFF;
cd<=CMD;
case cnt4 is
when 0 => data_reg<=x"40" or y_reg;p2<=shift_data;
when 1 => data_reg<=x"80" or x_reg;p2<=shift_data;
when 2 => p2<=idle;cnt4<=0;
when others =>null;
end case;

when disp_char=>
cnt4<=cnt4+1;
cs<=OFF;
cd<=DATA;
if cnt4=6
then  p2<=idle;cnt4<=0;
else  data_reg<=ASCII(char_reg)(cnt4);
      p2<=shift_data;
end if;

when others => null;
end case;
end if;
end if;
end process;

end behav ;

(原文件名:31012010(002).jpg)

点击此处下载 ourdev_531236.rar(文件大小:1.17M) (原文件名:5110.rar)












欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4