FPGA实验三 液晶屏的显示设计说明Word格式.docx

上传人:b****8 文档编号:22759953 上传时间:2023-02-05 格式:DOCX 页数:46 大小:147.93KB
下载 相关 举报
FPGA实验三 液晶屏的显示设计说明Word格式.docx_第1页
第1页 / 共46页
FPGA实验三 液晶屏的显示设计说明Word格式.docx_第2页
第2页 / 共46页
FPGA实验三 液晶屏的显示设计说明Word格式.docx_第3页
第3页 / 共46页
FPGA实验三 液晶屏的显示设计说明Word格式.docx_第4页
第4页 / 共46页
FPGA实验三 液晶屏的显示设计说明Word格式.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

FPGA实验三 液晶屏的显示设计说明Word格式.docx

《FPGA实验三 液晶屏的显示设计说明Word格式.docx》由会员分享,可在线阅读,更多相关《FPGA实验三 液晶屏的显示设计说明Word格式.docx(46页珍藏版)》请在冰豆网上搜索。

FPGA实验三 液晶屏的显示设计说明Word格式.docx

但是,FPGA的输出电平是通过LCD来识别是有效的低电平还是高电平。

LCD控制器接收5VTTL信号电平,FPGA输出3.3V的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;

//InstantiatetheUnitUnderTest(UUT)

lcd_write_numberuut

.CLK_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:

//thisstatetokeepif_writeupfor2cycles

=SET_IF_WRITE_0;

SET_IF_WRITE_0:

//setif_write0andstartthecounter

begin

=WAIT;

WAIT:

if(cntr<

25000000)//waitfor0.5seconds

=cntr+32'

else

endcase

endmodule

`timescale1ns/1ps

modulelcd_write_number

0]LCD_D,

input[31:

0]if_data,

inputif_write,

outputif_ready

reg[7:

0]disp_data;

regdisp_rs;

0]disp_delay;

regdisp_write;

wiredisp_ready;

regdisp_b8;

0]char;

0]number;

reginit_done;

regrunning;

reg[4:

0]shift_cntr;

regif_ready_r;

assignif_ready=if_ready_r;

lcd_displaydisplay

(.clk(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;

//resetthedisplay

endelseif(char<

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@(negedgeCLK_50MHZ)begin

//thesenextstepsinitializetheLCDdisplay:

case(char)

0:

disp_b8<

disp_data<

h30;

disp_delay<

d10000000;

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(disp_ready&

state==START)begin

if(shift_cntr<

5'

d8)begin

if(number[31:

28]<

4'

b1010)

=number[31:

28]+8'

h37;

=number<

<

4;

=shift_cntr+5'

endcase//case(char)

end//always@(negedgeCLK_50MHZ)

modulelcd_display

(inputclk,

inputrst,

outputlcd_e,

outputlcd_rw,

outputlcd_rs,

0]lcd_d,

input[7:

inputif_rs,

0]if_delay,

outputif_ready,

inputif_8bit);

reg[2:

reglcdr_e;

reg[3:

0]lcdr_d;

0]wait_cntr;

regready;

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'

d20000000;

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:

=if_data[3:

0];

//lowernibble

=WAIT_PULSE_E_1;

WAIT_PULSE_E_1:

WAIT_COMMAND:

if_delay)begin

=wait_cntr+32'

if(!

if_write)begin

共有三个module,它们的包含关系为lcd_write_number_test包含lcd_write_number,lcd_write_number包含lcd_display,下同。

实验现象:

如下图,刚烧录程序完时,LCD前8位依次显示十六进制数“ABBA0123”,然后每过0.5秒,该数值增一,满十六进位。

SW1"

L14"

inputSW1,

.SW1(SW1),

initial

h19044012;

always@(posedgeCLK_50MHZ)

if(if_ready)

if(if_data[31:

0]==32'

h23059059)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<

50000000)//waitfor1seconds

INIT_TIME

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1