FPGA实验三液晶屏的显示设计Word格式.docx
《FPGA实验三液晶屏的显示设计Word格式.docx》由会员分享,可在线阅读,更多相关《FPGA实验三液晶屏的显示设计Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
但是,FPGA的输出电平是通过LCD来识别是有效的低电平还是高电平。
LCD控制器接收5VTTL信号电平,FPGA输出的LCMOS以满足5VTTL电压要求。
数据线上的390欧串联电阻,当LCD驱动一个逻辑高电平时,其用来防止了FPGA和SrtataFlsahI/O管脚的超负载。
当LCD_RW为高时,LCD驱动数据线。
在绝大多数应用中,LCD作为只读外围设备,几乎没有从显示器读数据。
四、操作方法和实验步骤
对于程序的各个步骤,如新建项目、新建VerilogHDL、新建.ucf文件、Synthesize、ImplementDesign、GenerateProgrammingFile、ConfigureTargetDevice等等,在实验一中已经展示过,每一次实验的基本操作步骤都是差不多的,故这里不再重复阐述。
本次实验总共需要做三份程序并观察现象:
1)例程
2)设计按键拨动时显示小时、分钟和秒,中间分别空一格。
3)按键拨动开始显示,10秒钟显示结束,结束时LCD上显示ABCDEF,同时八只LED灯亮。
五、实验源代码和现象
UCF文件如下:
NET"
CLK_50MHZ"
LOC="
C9"
;
LCD_D<
0>
"
R15"
1>
R16"
2>
P17"
3>
M15"
LCD_E"
M18"
LCD_RS"
L18"
LCD_RW"
L17"
源代码如下:
modulelcd_write_number_test
(
inputCLK_50MHZ,
outputLCD_E,
outputLCD_RS,
outputLCD_RW,
output[3:
0]LCD_D
);
wireif_ready;
regif_write;
reg[31:
0]if_data;
reg[1:
0]state;
0]cntr;
parameterIDLE=2'
b00,
IF_WRITE_1=2'
b01,
SET_IF_WRITE_0=2'
b10,
WAIT=2'
b11;
LK_50MHZ(CLK_50MHZ),
.LCD_E(LCD_E),
.LCD_RS(LCD_RS),
.LCD_RW(LCD_RW),
.LCD_D(LCD_D),
.if_data(if_data),
.if_write(if_write),
.if_ready(if_ready)
initialbegin
if_data<
=32'
habba0123;
state<
=IDLE;
if_write<
=1'
b0;
cntr<
end
always@(posedgeCLK_50MHZ)begin
case(state)
IDLE:
if(if_ready)begin
=if_data+1'
b1;
=IF_WRITE_1;
IF_WRITE_1:
lk(CLK_50MHZ),
.rst(1'
b0),
.lcd_e(LCD_E),
.lcd_rw(LCD_RW),
.lcd_rs(LCD_RS),
.lcd_d(LCD_D),
.if_data(disp_data),
.if_rs(disp_rs),
.if_delay(disp_delay),
.if_write(disp_write),
.if_ready(disp_ready),
.if_8bit(disp_b8)
parameterNB_CHARS=8'
d12;
parameterSTART=2'
WAIT_WRITE_0=2'
WRITE_1=2'
WAIT_WRITE_1=2'
=2'
b00;
char<
=8'
init_done<
if_ready_r<
shift_cntr<
=5'
if(init_done&
&
char>
8'
d16)begin
if(disp_ready)
if(if_write)begin
=4'
d8;
W1(SW1),
.CLK_50MHZ(CLK_50MHZ),
initial
begin
h;
always@(posedgeCLK_50MHZ)
if(if_ready)
if(if_data[31:
0]==32'
h)if_data<
h0;
elseif(if_data[27:
0]==28'
h9059059)if_data<
=if_data+32'
h6fa6fa7;
elseif(if_data[19:
0]==20'
h59059)if_data<
hfa6fa7;
elseif(if_data[15:
0]==16'
h9059)if_data<
h6fa7;
elseif(if_data[7:
0]==8'
h59)if_data<
hfa7;
elseif(if_data[3:
0]==4'
h9)if_data<
h7;
elseif_data<
WAIT_WRITE_0=2'
WRITE_1=2'
WAIT_WRITE_1=2'
d16)
if(disp_ready)
if_ready_r<
if(if_write)
begin
char<
.if_ready(if_ready),
.LED0(LED0),
.LED1(LED1),
.LED2(LED2),
.LED3(LED3),
.LED4(LED4),
.LED5(LED5),
.LED6(LED6),
.LED7(LED7)
cnt_state<
cnt<
=29'
light<
//resetthedisplay
end
end
elseif(char<
case(state)
START:
if(disp_ready)begin
disp_write<
=WAIT_WRITE_0;
WAIT_WRITE_0:
=WRITE_1;
WRITE_1:
WAIT_WRITE_1:
=START;
=char+8'
endcase//case(state)
end//else:
!
if(!
running)
end//always@(posedgeCLK_50MHZ)
always@(posedgeCLK_50MHZ)
if(!
SW1)
cnt_state<
=1'
elseif(cnt==29'
h1dcd6500)cnt_state<
elsecnt<
=cnt+1'
always@(negedgeCLK_50MHZ)begin
//thesenextstepsinitializetheLCDdisplay:
case(char)
0:
disp_b8<
disp_data<
h30;
disp_delay<
d;
disp_rs<
1:
disp_data<
2:
d1000000;
3:
h20;
d20000;
4:
h28;
5:
h06;
6:
h0C;
7:
h01;
d9;
8:
//thisstateprovidesanentrypointtoresetthedisplayandthen
//goontothedefaultstatethatwritesthenumber
number<
=if_data;
default:
//statemachinetoprinta32-bitnumberout
if(SW1&
(!
cnt_state))
if(disp_ready&
state==START)
if(shift_cntr<
5'
d8)
disp_rs<
disp_delay<
if((shift_cntr==5'
d2)||(shift_cntr==5'
d5))
else
if(number[31:
28]<
4'
b1010)
=number[31:
28]+8'
h37;
number<
=number<
<
4;
shift_cntr<
=shift_cntr+5'
light<
elseif(SW1&
cnt_state)
elseif(shift_cntr==5'
d0)
h41;
d1)
h42;
d3)
h43;
d4)
h44;
d6)
h45;
d7)
h46;
else
endcase//case(char)
end//always@(negedgeCLK_50MHZ)
assignLED0=light;
assignLED1=light;
assignLED2=light;
assignLED3=light;
assignLED4=light;
assignLED5=light;
assignLED6=light;
assignLED7=light;
endmodule
`timescale1ns/1ps
modulelcd_display
(inputclk,
inputrst,
outputlcd_e,
outputlcd_rw,
outputlcd_rs,
0]lcd_d,
input[7:
0]if_data,
inputif_rs,
input[31:
0]if_delay,
inputif_write,
outputif_ready,
inputif_8bit);
reg[2:
reglcdr_e;
reg[3:
0]lcdr_d;
0]wait_cntr;
regready;
reginit_done;
parameterIDLE=3'
b000,
WAIT_PULSE_E_0=3'
b001,
LOAD_LOWER_NIBBLE=3'
b010,
WAIT_PULSE_E_1=3'
b011,
WAIT_COMMAND=3'
b100;
parameterPULSE_E_DLY=32'
parameterINIT_TIME=32'
assignlcd_d=lcdr_d;
assignlcd_rs=if_rs;
assignlcd_rw=1'
assignlcd_e=lcdr_e;
assignif_ready=ready;
ready<
lcdr_e<
always@(posedgeclk)begin
if(rst)begin
endelseif(!
init_done)begin
if(wait_cntr<
INIT_TIME)
wait_cntr<
=wait_cntr+1;
elsebegin
endelsebegin
lcdr_d<
=if_data[7:
4];
//uppernibblefirst
=WAIT_PULSE_E_0;
WAIT_PULSE_E_0:
PULSE_E_DLY)begin
=0;
if(if_8bit)
=LOAD_LOWER_NIBBLE;
=WAIT_COMMAND;
LOAD_LOWER_NIBBLE: