基于FPGA的数字系统设计实验3控制液晶显示屏显示字符OK
更新时间:2024-06-21 12:49:01 阅读量: 综合文库 文档下载
Jian程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM;
--use UNISIM.VComponents.all; entity lcd is port(
clk, reset : in bit;
SF_D : out bit_vector(3 downto 0);
LCD_E, LCD_RS, LCD_RW, SF_CE0 : out bit; LED : out bit_vector(7 downto 0) ); end lcd;
architecture behavior of lcd is
type tx_sequence is (high_setup, high_hold, oneus, low_setup, low_hold, fortyus, done); signal tx_state : tx_sequence := done; signal tx_byte : bit_vector(7 downto 0); signal tx_init : bit := '0';
type init_sequence is (idle, fifteenms, one, two, three, four, five, six, seven, eight, done); signal init_state : init_sequence := idle; signal init_init, init_done : bit := '0'; signal i : integer range 0 to 750000 := 0; signal i2 : integer range 0 to 2000 := 0; signal i3 : integer range 0 to 82000 := 0;
signal SF_D0, SF_D1 : bit_vector(3 downto 0); signal LCD_E0, LCD_E1 : bit; signal mux : bit;
type display_state is (init, function_set, entry_set, set_display, clr_display, pause, set_addr, char_f, char_p, char_g, char_a, done);
signal cur_state : display_state := init; begin
LED <= tx_byte; --for diagnostic purposes SF_CE0 <= '1'; --disable intel strataflash LCD_RW <= '0'; --write only
--The following \--when to transmit a command/data and when not to with cur_state select
tx_init <= '0' when init | pause | done, '1' when others;
--control the bus with cur_state select mux <= '1' when init, '0' when others;
--control the initialization sequence with cur_state select init_init <= '1' when init,
'0' when others;--register select with cur_state select
LCD_RS <= '0' when function_set|entry_set|set_display|clr_display|set_addr, '1' when others;
--what byte to transmit to lcd
--refer to datasheet for an explanation of these values with cur_state select
tx_byte <= \\\\\\\\\\--main state machine
display: process(clk, reset) begin
if(reset='1') then
cur_state <= function_set;
elsif(clk='1' and clk'event) then case cur_state is
--refer to intialize state machine below when init =>
if(init_done = '1') then cur_state <= function_set; else
cur_state <= init; end if;
--every other state but pause uses the transmit state machine when function_set => if(i2 = 2000) then
cur_state <= entry_set; else
cur_state <= function_set;
end if;
when entry_set => if(i2 = 2000) then
cur_state <= set_display; else
cur_state <= entry_set; end if;
when set_display => if(i2 = 2000) then
cur_state <= clr_display; else
cur_state <= set_display; end if;
when clr_display => i3 <= 0;
if(i2 = 2000) then cur_state <= pause; else
cur_state <= clr_display; end if;
when pause => if(i3 = 82000) then cur_state <= set_addr; i3 <= 0;else
cur_state <= pause; i3 <= i3 + 1; end if;
when set_addr => if(i2 = 2000) then cur_state <= char_J; else
cur_state <= set_addr; end if;
when char_J => if(i2 = 2000) then cur_state <= char_I; else
cur_state <= char_J; end if;
when char_I => if(i2 = 2000) then cur_state <= char_A; else
cur_state <= char_I;
end if;
when char_A=> if(i2 = 2000) then cur_state <= char_N; else
cur_state <= char_A; end if;
when char_N => if(i2 = 2000) then cur_state <= done; else
cur_state <= char_N; end if;
when done => cur_state <= done; end case; end if;
end process display; with mux select
SF_D <= SF_D0 when '0', --transmit SF_D1 when others; --initialize with mux select
LCD_E <= LCD_E0 when '0', --transmit LCD_E1 when others; --initialize --specified by datasheet
transmit : process(clk, reset, tx_init) begin
if(reset='1') then tx_state <= done;
elsif(clk='1' and clk'event) then case tx_state is
when high_setup => --40ns LCD_E0 <= '0';
SF_D0 <= tx_byte(7 downto 4); if(i2 = 2) then
tx_state <= high_hold; i2 <= 0; else
tx_state <= high_setup;i2 <= i2 + 1; end if;
when high_hold => --230ns LCD_E0 <= '1';
SF_D0 <= tx_byte(7 downto 4); if(i2 = 12) then
tx_state <= oneus; i2 <= 0; else
tx_state <= high_hold; i2 <= i2 + 1; end if;
when oneus => LCD_E0 <= '0'; if(i2 = 50) then
tx_state <= low_setup; i2 <= 0; else
tx_state <= oneus; i2 <= i2 + 1; end if;
when low_setup => LCD_E0 <= '0';
SF_D0 <= tx_byte(3 downto 0); if(i2 = 2) then
tx_state <= low_hold; i2 <= 0; else
tx_state <= low_setup; i2 <= i2 + 1; end if;
when low_hold => LCD_E0 <= '1';
SF_D0 <= tx_byte(3 downto 0); if(i2 = 12) then tx_state <= fortyus; i2 <= 0; else
tx_state <= low_hold; i2 <= i2 + 1; end if;
when fortyus => LCD_E0 <= '0'; if(i2 = 2000) then tx_state <= done; i2 <= 0; else
tx_state <= fortyus; i2 <= i2 + 1; end if;
when done => LCD_E0 <= '0'; if(tx_init = '1') then tx_state <= high_setup; i2 <= 0; else
tx_state <= done; i2 <= 0; end if; end case; end if;
end process transmit;--specified by datasheet
power_on_initialize: process(clk, reset, init_init) --power on initialization sequence begin
if(reset='1') then init_state <= idle; init_done <= '0';
elsif(clk='1' and clk'event) then case init_state is when idle => init_done <= '0'; if(init_init = '1') then init_state <= fifteenms; i <= 0; else
init_state <= idle; i <= i + 1; end if;
when fifteenms => init_done <= '0'; if(i = 750000) then init_state <= one; i <= 0; else
init_state <= fifteenms; i <= i + 1; end if;
when one =>
SF_D1 <= \LCD_E1 <= '1'; init_done <= '0'; if(i = 11) then init_state<=two; i <= 0;
else
init_state<=one; i <= i + 1; end if;
when two => LCD_E1 <= '0'; init_done <= '0'; if(i = 205000) then init_state<=three; i <= 0; else
init_state<=two; i <= i + 1; end if;
when three => SF_D1 <= \LCD_E1 <= '1'; init_done <= '0'; if(i = 11) then init_state<=four; i <= 0; else
init_state<=three; i <= i + 1; end if;
when four => LCD_E1 <= '0'; init_done <= '0'; if(i = 5000) then
init_state<=five;i <= 0; else
init_state<=four; i <= i + 1; end if;
when five =>
SF_D1 <= \LCD_E1 <= '1'; init_done <= '0'; if(i = 11) then init_state<=six; i <= 0; else
init_state<=five; i <= i + 1;
end if;
when six => LCD_E1 <= '0'; init_done <= '0'; if(i = 2000) then init_state<=seven; i <= 0; else
init_state<=six; i <= i + 1; end if;
when seven => SF_D1 <= \LCD_E1 <= '1'; init_done <= '0'; if(i = 11) then init_state<=eight; i <= 0; else
init_state<=seven; i <= i + 1; end if;
when eight => LCD_E1 <= '0'; init_done <= '0'; if(i = 2000) then init_state<=done; i <= 0; else
init_state<=eight; i <= i + 1; end if;
when done => init_state <= done; init_done <= '1'; end case; end if;
end process power_on_initialize; end behavior;
源程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM;
--use UNISIM.VComponents.all; entity lcd is port(
clk, reset : in bit;
SF_D : out bit_vector(3 downto 0);
LCD_E, LCD_RS, LCD_RW, SF_CE0 : out bit; LED : out bit_vector(7 downto 0) ); end lcd;
architecture behavior of lcd is
type tx_sequence is (high_setup, high_hold, oneus, low_setup, low_hold, fortyus, done); signal tx_state : tx_sequence := done; signal tx_byte : bit_vector(7 downto 0); signal tx_init : bit := '0';
type init_sequence is (idle, fifteenms, one, two, three, four, five, six, seven, eight, done); signal init_state : init_sequence := idle; signal init_init, init_done : bit := '0'; signal i : integer range 0 to 750000 := 0; signal i2 : integer range 0 to 2000 := 0; signal i3 : integer range 0 to 82000 := 0;
signal SF_D0, SF_D1 : bit_vector(3 downto 0); signal LCD_E0, LCD_E1 : bit; signal mux : bit;
type display_state is (init, function_set, entry_set, set_display, clr_display, pause, set_addr, char_f, char_p, char_g, char_a, done);
signal cur_state : display_state := init; begin
LED <= tx_byte; --for diagnostic purposes SF_CE0 <= '1'; --disable intel strataflash LCD_RW <= '0'; --write only
--The following \--when to transmit a command/data and when not to
with cur_state select
tx_init <= '0' when init | pause | done, '1' when others; --control the bus with cur_state select mux <= '1' when init, '0' when others;
--control the initialization sequence with cur_state select init_init <= '1' when init,
'0' when others;--register select with cur_state select
LCD_RS <= '0' when function_set|entry_set|set_display|clr_display|set_addr, '1' when others;
--what byte to transmit to lcd
--refer to datasheet for an explanation of these values with cur_state select
tx_byte <= \\\\\\\\\\--main state machine
display: process(clk, reset) begin
if(reset='1') then
cur_state <= function_set;
elsif(clk='1' and clk'event) then case cur_state is
--refer to intialize state machine below when init =>
if(init_done = '1') then cur_state <= function_set; else
cur_state <= init; end if;
--every other state but pause uses the transmit state machine when function_set => if(i2 = 2000) then
cur_state <= entry_set; else
cur_state <= function_set; end if;
when entry_set => if(i2 = 2000) then
cur_state <= set_display; else
cur_state <= entry_set; end if;
when set_display => if(i2 = 2000) then
cur_state <= clr_display; else
cur_state <= set_display; end if;
when clr_display => i3 <= 0;
if(i2 = 2000) then cur_state <= pause; else
cur_state <= clr_display; end if;
when pause => if(i3 = 82000) then cur_state <= set_addr; i3 <= 0;else
cur_state <= pause; i3 <= i3 + 1; end if;
when set_addr => if(i2 = 2000) then cur_state <= char_f; else
cur_state <= set_addr; end if;
when char_f => if(i2 = 2000) then cur_state <= char_p; else
cur_state <= char_f; end if;
when char_p => if(i2 = 2000) then
cur_state <= char_g; else
cur_state <= char_p; end if;
when char_g => if(i2 = 2000) then cur_state <= char_a; else
cur_state <= char_g; end if;
when char_a => if(i2 = 2000) then cur_state <= done; else
cur_state <= char_a; end if;
when done => cur_state <= done; end case; end if;
end process display; with mux select
SF_D <= SF_D0 when '0', --transmit SF_D1 when others; --initialize with mux select
LCD_E <= LCD_E0 when '0', --transmit LCD_E1 when others; --initialize --specified by datasheet
transmit : process(clk, reset, tx_init) begin
if(reset='1') then tx_state <= done;
elsif(clk='1' and clk'event) then case tx_state is
when high_setup => --40ns LCD_E0 <= '0';
SF_D0 <= tx_byte(7 downto 4); if(i2 = 2) then
tx_state <= high_hold; i2 <= 0; else
tx_state <= high_setup;i2 <= i2 + 1; end if;
when high_hold => --230ns
LCD_E0 <= '1';
SF_D0 <= tx_byte(7 downto 4); if(i2 = 12) then tx_state <= oneus; i2 <= 0; else
tx_state <= high_hold; i2 <= i2 + 1; end if;
when oneus => LCD_E0 <= '0'; if(i2 = 50) then
tx_state <= low_setup; i2 <= 0; else
tx_state <= oneus; i2 <= i2 + 1; end if;
when low_setup => LCD_E0 <= '0';
SF_D0 <= tx_byte(3 downto 0); if(i2 = 2) then
tx_state <= low_hold; i2 <= 0; else
tx_state <= low_setup; i2 <= i2 + 1; end if;
when low_hold => LCD_E0 <= '1';
SF_D0 <= tx_byte(3 downto 0); if(i2 = 12) then tx_state <= fortyus; i2 <= 0; else
tx_state <= low_hold; i2 <= i2 + 1; end if;
when fortyus => LCD_E0 <= '0'; if(i2 = 2000) then tx_state <= done; i2 <= 0; else
tx_state <= fortyus; i2 <= i2 + 1; end if;
when done => LCD_E0 <= '0'; if(tx_init = '1') then tx_state <= high_setup; i2 <= 0; else
tx_state <= done; i2 <= 0; end if; end case; end if;
end process transmit;--specified by datasheet
power_on_initialize: process(clk, reset, init_init) --power on initialization sequence begin
if(reset='1') then init_state <= idle; init_done <= '0';
elsif(clk='1' and clk'event) then case init_state is when idle => init_done <= '0'; if(init_init = '1') then init_state <= fifteenms; i <= 0; else
init_state <= idle; i <= i + 1; end if;
when fifteenms => init_done <= '0'; if(i = 750000) then init_state <= one; i <= 0; else
init_state <= fifteenms; i <= i + 1; end if;
when one =>
SF_D1 <= \LCD_E1 <= '1'; init_done <= '0';
if(i = 11) then init_state<=two; i <= 0; else
init_state<=one; i <= i + 1; end if;
when two => LCD_E1 <= '0'; init_done <= '0'; if(i = 205000) then init_state<=three; i <= 0; else
init_state<=two; i <= i + 1; end if;
when three => SF_D1 <= \LCD_E1 <= '1'; init_done <= '0'; if(i = 11) then init_state<=four; i <= 0; else
init_state<=three; i <= i + 1; end if;
when four => LCD_E1 <= '0'; init_done <= '0'; if(i = 5000) then
init_state<=five;i <= 0; else
init_state<=four; i <= i + 1; end if;
when five =>
SF_D1 <= \LCD_E1 <= '1'; init_done <= '0'; if(i = 11) then init_state<=six; i <= 0;
else
init_state<=five; i <= i + 1; end if;
when six => LCD_E1 <= '0'; init_done <= '0'; if(i = 2000) then init_state<=seven; i <= 0; else
init_state<=six; i <= i + 1; end if;
when seven => SF_D1 <= \LCD_E1 <= '1'; init_done <= '0'; if(i = 11) then init_state<=eight; i <= 0; else
init_state<=seven; i <= i + 1; end if;
when eight => LCD_E1 <= '0'; init_done <= '0'; if(i = 2000) then init_state<=done; i <= 0; else
init_state<=eight; i <= i + 1; end if;
when done => init_state <= done; init_done <= '1'; end case; end if;
end process power_on_initialize; end behavior;
第三种 verilog
该程序实现对 SPARTAN3E 上2x16 LCD 的初始化及各种初始设置,最后输出“OK”字样
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: //
// Create Date: 17:43:15 10/03/2009 // Design Name:
// Module Name: lcd_disp_ok // Project Name: // Target Devices: // Tool versions: // Description: //
// Dependencies: //
// Revision:
// Revision 0.01 - File Created // Additional Comments: //
//////////////////////////////////////////////////////////////////////////////////
module lcd_disp_ok(clk,reset,lcd_rs,lcd_rw,lcd_e,lcd_d,flash_ce);
input clk; input reset;
output lcd_rs; output lcd_rw; output lcd_e;
output [3:0] lcd_d; output flash_ce;
reg lcd_rs,lcd_e; reg [3:0] lcd_d;
assign flash_ce = 1; assign lcd_rw = 0;
reg [19:0] delay_count; reg [19:0] num_count;
parameter state1 = 6'b000001;
parameter state2 = 6'b000010; parameter state3 = 6'b000011; parameter state4 = 6'b000100; parameter state5 = 6'b000101; parameter state6 = 6'b000110; parameter state7 = 6'b000111; parameter state8 = 6'b001000; parameter state9 = 6'b001001; parameter state10 = 6'b001010; parameter state11 = 6'b001011; parameter state12 = 6'b001100; parameter state13 = 6'b001101; parameter state14 = 6'b001110; parameter state15 = 6'b001111; parameter state16 = 6'b010000; parameter state17 = 6'b010001; parameter state18 = 6'b010010; parameter state19 = 6'b010011; parameter state20 = 6'b010100; parameter state21 = 6'b010101; parameter state22 = 6'b010110; parameter state23 = 6'b010111; parameter state24 = 6'b011000; parameter state25 = 6'b011001; parameter state26 = 6'b011010; parameter state27 = 6'b011011; parameter state28 = 6'b011100; parameter state29 = 6'b011101; parameter state30 = 6'b011110; parameter state31 = 6'b011111; parameter state32 = 6'b100000; parameter state33 = 6'b100001; parameter state34 = 6'b100010; parameter state35 = 6'b100011; parameter state36 = 6'b100100; parameter state37 = 6'b100101; parameter state38 = 6'b100110;
parameter state39 = 6'b100111; parameter state40 = 6'b101000; parameter state41 = 6'b101001; parameter state42 = 6'b101010; parameter state43 = 6'b101011; parameter state44 = 6'b101100; parameter state45 = 6'b101101;
parameter state46 = 6'b101110; parameter state47 = 6'b101111; parameter state48 = 6'b110000; parameter state49 = 6'b110001; parameter state50 = 6'b110010; parameter state51 = 6'b110011; parameter state52 = 6'b110100; parameter state53 = 6'b110101; parameter state54 = 6'b110110; parameter state55 = 6'b110111; parameter state56 = 6'b111000; parameter state57 = 6'b111001; parameter state58 = 6'b111010; parameter state59 = 6'b111011;
reg [5:0] state; reg state_change;
always @(posedge clk or posedge reset) if(reset) begin
state_change <= 1'b0; delay_count <= 1'b1; end else
if(delay_count == num_count - 1) begin
state_change <= 1'b1; delay_count <= 1'b1; end else
begin
state_change <= 1'b0;
delay_count <= delay_count + 1'b1;
end
always @(posedge state_change or posedge reset) if(reset) begin
state <= state1;
num_count <= 20'd750000;
end else
case(state)
state1:begin
state <= state2; num_count <= 20'd4;
lcd_rs <= 1'b0; lcd_e <= 1'b0; lcd_d <= 4'h3; end
state2:begin
state <= state3;
num_count <= 20'd12; lcd_e <= 1'b1; end
state3:begin
state <= state4;
num_count <= 20'd205000; lcd_e <= 1'b0; end
state4:begin
state <= state5;
num_count <= 20'd4; lcd_d <= 4'h3; end
state5:begin
state <= state6;
num_count <= 20'd12; lcd_e <= 1'b1; end
state6:begin
state <= state7;
num_count <= 20'd5000; lcd_e <= 1'b0; end
state7:begin
state <= state8; num_count <= 20'd4; lcd_d <= 4'h2; end
state8:begin
state <= state9;
num_count <= 20'd12; lcd_e <= 1'b1; end
state9:begin
state <= state10;
num_count <= 20'd4000; lcd_e <= 1'b0; end
//set funtion mode state10:begin
state <= state11;
num_count <= 20'd4; lcd_rs <= 0; lcd_d <= 4'h2; end
state11:begin
state <= state12;
num_count <= 20'd12; lcd_e <= 1'b1; end
state12:begin
state <= state13;
num_count <= 20'd80; lcd_e <= 1'b0; end
state13:begin
state <= state14; num_count <= 20'd4; lcd_d <= 4'h8; end
state14:begin
state <= state15;
num_count <= 20'd12; lcd_e <= 1'b1; end
state15:begin
state <= state16;
num_count <= 20'd4000; lcd_e <= 1'b0; end //set entry mode state16:begin
state <= state17; num_count <= 20'd4; lcd_d <= 4'h0; end
state17:begin
state <= state18;
num_count <= 20'd12; lcd_e <= 1'b1; end
state18:begin
state <= state19;
num_count <= 20'd80; lcd_e <= 1'b0; end
state19:begin
state <= state20; num_count <= 20'd4; lcd_d <= 4'h6; end state20:begin
state <= state21;
num_count <= 20'd12; lcd_e <= 1'b1;
end state21:begin
state <= state22;
num_count <= 20'd4000; lcd_e <= 1'b0; end
//set display on/off
state22:begin state <= state23; num_count <= 20'd4; lcd_d <= 4'h0; end state23:begin
state <= state24;
num_count <= 20'd12; lcd_e <= 1'b1; end state24:begin
state <= state25;
num_count <= 20'd80; lcd_e <= 1'b0; end state25:begin
state <= state26; num_count <= 20'd4; lcd_d <= 4'hc; end
state26:begin state <= state27;
num_count <= 20'd12; lcd_e <= 1'b1; end state27:begin
state <= state28;
num_count <= 20'd4000; lcd_e <= 1'b0; end //clear display
state28:begin state <= state29; num_count <= 20'd4; lcd_d <= 4'h0; end state29:begin
state <= state30;
num_count <= 20'd12; lcd_e <= 1'b1; end state30:begin
state <= state31;
num_count <= 20'd80;
lcd_e <= 1'b0; end state31:begin
state <= state32; num_count <= 20'd4; lcd_d <= 4'h1; end
state32:begin state <= state33;
num_count <= 20'd12; lcd_e <= 1'b1; end state33:begin
state <= state34;
num_count <= 20'd2000; lcd_e <= 1'b0; end state34:begin
state <= state35;
num_count <= 20'd82000; end
//set DD RAM address state35:begin
state <= state36; num_count <= 20'd4; lcd_rs <= 1'b0; lcd_e <= 1'b0; lcd_d <= 4'h8; end
state36:begin
state <= state37;
num_count <= 20'd12; lcd_e <= 1'b1; end
state37:begin
state <= state38;
num_count <= 20'd80; lcd_e <= 1'b0; end
state38:begin state <= state39;
num_count <= 20'd4; lcd_d <= 4'h0; end
state39:begin state <= state40;
num_count <= 20'd12; lcd_e <= 1'b1; end
state40:begin state <= state41;
num_count <= 20'd4000; lcd_e <= 1'b0; end
// now starts writing data to DD RAM state41:begin state <= state42; num_count <= 20'd4; lcd_rs <= 1'b1; lcd_d <= 4'h4; end
state42:begin
state <= state43;
num_count <= 20'd12; lcd_e <= 1'b1; end
state43:begin
state <= state44;
num_count <= 20'd80; lcd_e <= 1'b0; end
state44:begin
state <= state45;
num_count <= 20'd4; lcd_d <= 4'hf; end state45:begin
state <= state46;
num_count <= 20'd12; lcd_e <= 1'b1;
end state46:begin
state <= state47;
num_count <= 20'd2000; lcd_e <= 1'b0; end
state47:begin
state <= state48; num_count <= 20'd4; lcd_rs <= 1'b1; lcd_d <= 4'h4; end
state48:begin
state <= state49;
num_count <= 20'd12; lcd_e <= 1'b1; end
state49:begin
state <= state50;
num_count <= 20'd80; lcd_e <= 1'b0; end
state50:begin
state <= state51; num_count <= 20'd4; lcd_d <= 4'hb; end
state51:begin
state <= state52;
num_count <= 20'd12; lcd_e <= 1'b1; end
state52:begin state <= state53;
num_count <= 20'd2000; lcd_e <= 1'b0; end
state53:begin
state <= state54; num_count <= 20'd4; lcd_rs <= 1'b1; lcd_d <= 4'h2;
end
state54:begin state <= state55;
num_count <= 20'd12; lcd_e <= 1'b1; end state55:begin
state <= state56;
num_count <= 20'd80; lcd_e <= 1'b0; end
state56:begin
state <= state57; num_count <= 20'd4; lcd_d <= 4'h1; end state57:begin
state <= state58;
num_count <= 20'd12; lcd_e <= 1'b1; end state58:begin
state <= state59;
num_count <= 20'd4000; lcd_e <= 1'b0; end
state59:begin
state <= state35;
num_count <= 20'd800; end
default:begin
state <= state1; num_count <= 20'd800; end endcase
endmodule
4、编译成功的程序
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: //
// Create Date: 15:48:30 04/21/2015 // Design Name:
// Module Name: lcd // Project Name: // Target Devices: // Tool versions: // Description: //
// Dependencies: //
// Revision:
// Revision 0.01 - File Created // Additional Comments: //
////////////////////////////////////////////////////////////////////////////////// module lcd(clk,reset,lcd_rs,lcd_rw,lcd_e,lcd_d,flash_ce); input clk; input reset; output lcd_rs; output lcd_rw; output lcd_e;
output [3:0] lcd_d; output flash_ce; reg lcd_rs,lcd_e; reg[3:0] lcd_d; assign flash_ce = 1; assign lcd_rw = 0;
reg [19:0] delay_count; reg [19:0] num_count;
parameter state1 = 6'b000001;
parameter state2 = 6'b000010; parameter state3 = 6'b000011; parameter state4 = 6'b000100; parameter state5 = 6'b000101;
parameter state6 = 6'b000110; parameter state7 = 6'b000111; parameter state8 = 6'b001000; parameter state9 = 6'b001001; parameter state10 = 6'b001010; parameter state11 = 6'b001011; parameter state12 = 6'b001100; parameter state13 = 6'b001101; parameter state14 = 6'b001110; parameter state15 = 6'b001111; parameter state16 = 6'b010000; parameter state17 = 6'b010001; parameter state18 = 6'b010010; parameter state19 = 6'b010011; parameter state20 = 6'b010100; parameter state21 = 6'b010101; parameter state22 = 6'b010110; parameter state23 = 6'b010111; parameter state24 = 6'b011000; parameter state25 = 6'b011001; parameter state26 = 6'b011010; parameter state27 = 6'b011011; parameter state28 = 6'b011100; parameter state29 = 6'b011101; parameter state30 = 6'b011110; parameter state31 = 6'b011111; parameter state32 = 6'b100000; parameter state33 = 6'b100001; parameter state34 = 6'b100010; parameter state35 = 6'b100011; parameter state36 = 6'b100100; parameter state37 = 6'b100101; parameter state38 = 6'b100110; parameter state39 = 6'b100111; parameter state40 = 6'b101000; parameter state41 = 6'b101001; parameter state42 = 6'b101010; parameter state43 = 6'b101011; parameter state44 = 6'b101100; parameter state45 = 6'b101101;
parameter state46 = 6'b101110; parameter state47 = 6'b101111; parameter state48 = 6'b110000; parameter state49 = 6'b110001;
parameter state50 = 6'b110010; parameter state51 = 6'b110011; parameter state52 = 6'b110100; parameter state53 = 6'b110101; parameter state54 = 6'b110110; parameter state55 = 6'b110111; parameter state56 = 6'b111000; parameter state57 = 6'b111001; parameter state58 = 6'b111010; parameter state59 = 6'b111011;
reg [5:0] state; reg state_change;
always @(posedge clk or posedge reset) if(reset) begin
state_change <= 1'b0; delay_count <= 1'b1; end else
if(delay_count == num_count - 1) begin
state_change <= 1'b1; delay_count <= 1'b1; end else
begin
state_change <= 1'b0;
delay_count <= delay_count + 1'b1; end
always @(posedge state_change or posedge reset) if(reset) begin
state <= state1;
num_count <= 20'd750000;
end else
case(state)
state1:begin
state <= state2; num_count <= 20'd4;
lcd_rs <= 1'b0; lcd_e <= 1'b0; lcd_d <= 4'h3; end
state2:begin
state <= state3;
num_count <= 20'd12; lcd_e <= 1'b1; end
state3:begin
state <= state4;
num_count <= 20'd205000; lcd_e <= 1'b0; end
state4:begin
state <= state5;
num_count <= 20'd4; lcd_d <= 4'h3; end
state5:begin
state <= state6;
num_count <= 20'd12; lcd_e <= 1'b1; end
state6:begin
state <= state7;
num_count <= 20'd5000; lcd_e <= 1'b0; end
state7:begin
state <= state8; num_count <= 20'd4; lcd_d <= 4'h2; end
state8:begin
state <= state9;
num_count <= 20'd12; lcd_e <= 1'b1; end
state9:begin
state <= state10;
num_count <= 20'd4000; lcd_e <= 1'b0; end
//set funtion mode state10:begin
state <= state11;
num_count <= 20'd4; lcd_rs <= 0; lcd_d <= 4'h2; end
state11:begin
state <= state12;
num_count <= 20'd12; lcd_e <= 1'b1; end
state12:begin
state <= state13;
num_count <= 20'd80; lcd_e <= 1'b0; end
state13:begin
state <= state14; num_count <= 20'd4; lcd_d <= 4'h8; end
state14:begin
state <= state15;
num_count <= 20'd12; lcd_e <= 1'b1; end
state15:begin
state <= state16;
num_count <= 20'd4000; lcd_e <= 1'b0; end //set entry mode state16:begin
state <= state17; num_count <= 20'd4; lcd_d <= 4'h0; end
state17:begin
state <= state18;
num_count <= 20'd12; lcd_e <= 1'b1; end
state18:begin
state <= state19;
num_count <= 20'd80; lcd_e <= 1'b0; end
state19:begin
state <= state20; num_count <= 20'd4; lcd_d <= 4'h6; end state20:begin
state <= state21;
num_count <= 20'd12; lcd_e <= 1'b1; end state21:begin
state <= state22;
num_count <= 20'd4000; lcd_e <= 1'b0; end
//set display on/off
state22:begin state <= state23; num_count <= 20'd4; lcd_d <= 4'h0;
end state23:begin
state <= state24;
num_count <= 20'd12; lcd_e <= 1'b1; end state24:begin
state <= state25;
num_count <= 20'd80; lcd_e <= 1'b0; end state25:begin
state <= state26; num_count <= 20'd4; lcd_d <= 4'hc; end
state26:begin state <= state27;
num_count <= 20'd12; lcd_e <= 1'b1; end state27:begin
state <= state28;
num_count <= 20'd4000; lcd_e <= 1'b0; end //clear display
state28:begin state <= state29; num_count <= 20'd4; lcd_d <= 4'h0; end state29:begin
state <= state30;
num_count <= 20'd12; lcd_e <= 1'b1; end state30:begin
state <= state31;
num_count <= 20'd80;
lcd_e <= 1'b0; end state31:begin
state <= state32;
num_count <= 20'd4; lcd_d <= 4'h1; end
state32:begin state <= state33;
num_count <= 20'd12; lcd_e <= 1'b1; end state33:begin
state <= state34;
num_count <= 20'd2000; lcd_e <= 1'b0; end state34:begin
state <= state35;
num_count <= 20'd82000; end
//set DD RAM address state35:begin
state <= state36; num_count <= 20'd4; lcd_rs <= 1'b0; lcd_e <= 1'b0; lcd_d <= 4'h8; end
state36:begin
state <= state37;
num_count <= 20'd12; lcd_e <= 1'b1; end
state37:begin state <= state38;
num_count <= 20'd80; lcd_e <= 1'b0; end
state38:begin state <= state39;
num_count <= 20'd4; lcd_d <= 4'h0; end
state39:begin state <= state40;
num_count <= 20'd12; lcd_e <= 1'b1; end
state40:begin state <= state41;
num_count <= 20'd4000; lcd_e <= 1'b0; end
// now starts writing data to DD RAM state41:begin state <= state42; num_count <= 20'd4; lcd_rs <= 1'b1; lcd_d <= 4'h4; end
state42:begin
state <= state43;
num_count <= 20'd12; lcd_e <= 1'b1; end
state43:begin
state <= state44;
num_count <= 20'd80; lcd_e <= 1'b0; end
state44:begin
state <= state45; num_count <= 20'd4; lcd_d <= 4'hf; end state45:begin
state <= state46;
num_count <= 20'd12; lcd_e <= 1'b1; end state46:begin state <= state47;
num_count <= 20'd2000;
lcd_e <= 1'b0; end
state47:begin
state <= state48; num_count <= 20'd4; lcd_rs <= 1'b1; lcd_d <= 4'h4; end
state48:begin
state <= state49;
num_count <= 20'd12; lcd_e <= 1'b1; end
state49:begin
state <= state50;
num_count <= 20'd80; lcd_e <= 1'b0; end
state50:begin
state <= state51; num_count <= 20'd4; lcd_d <= 4'hb; end
state51:begin
state <= state52;
num_count <= 20'd12; lcd_e <= 1'b1; end
state52:begin state <= state53;
num_count <= 20'd2000; lcd_e <= 1'b0; end
state53:begin
state <= state54; num_count <= 20'd4; lcd_rs <= 1'b1; lcd_d <= 4'h2;
end
state54:begin state <= state55;
num_count <= 20'd12; lcd_e <= 1'b1; end state55:begin
state <= state56;
num_count <= 20'd80; lcd_e <= 1'b0; end
state56:begin
state <= state57; num_count <= 20'd4; lcd_d <= 4'h1; end state57:begin
state <= state58;
num_count <= 20'd12; lcd_e <= 1'b1; end state58:begin
state <= state59;
num_count <= 20'd4000; lcd_e <= 1'b0; end
state59:begin
state <= state35;
num_count <= 20'd800; end default:begin
state <= state1; num_count <= 20'd800; end endcase endmodule
正在阅读:
基于FPGA的数字系统设计实验3控制液晶显示屏显示字符OK06-21
2012—2013学年度第二学期期末教学质量监测小学五年级语文试题(人教版)09-04
堂吉诃德人物形象分析论文07-03
关于分子动力学模拟的实验手册10-22
2020年护理工作计划范文12-11
论中国海洋权益03-18
ug编程学习07-02
水工钢筋混凝土结构学考试试题及答案411-09
- 小学生造句大全
- 增压泵投资项目可行性研究报告(模板)
- 高中语文人教版粤教版必修1-5全部文言文知识点归纳
- 两学一做专题民主生活会组织生活会批评与自我批评环节个人发言提
- 管理处环境保洁工作操作标准作业指导书
- 2012六一儿童节活动议程 - 图文
- 移树申请报告
- 《贵州省市政工程计价定额》2016定额说明及计算规则
- 计算机长期没有向WSUS报告状态
- 汉语拼音教学策略研究
- 发展西部领先的航空货运枢纽
- 司法所上半年工作总结4篇
- 如何提高银行服务水平
- 发电厂各级人员岗位职责
- 丰田汽车的外部环境分析
- 2017—2018年最新冀教版四年级数学下册《混合运算》教案精品优质
- 中建八局样板策划 - 图文
- 戚安邦《项目管理学》电子书
- 2015年高级项目经理笔记
- 弯桥的设计要点
- 显示屏
- 字符
- 液晶
- 基于
- 实验
- 控制
- 数字
- 显示
- 设计
- 系统
- FPGA