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; 
      vcc ut std_logic; 
      gnd ut std_logic; 
      led ut std_logic; 
      lcd_rst ut std_logic; 
      cs,sclk,mosi,cd ut 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) |  
  
 
 
 
 
 |   
 |  
  
 |