FPGA实验三:液晶屏的显示设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程名称:_____FPGA实验______指导老师:__竺红卫/陈宏__成绩:__________________

实验名称:____液晶屏的显示设计______实验类型:_FPGA实验_同组学生姓名:__

一、实验目的

1. 熟悉实验板上液晶屏的工作原理;

2. 熟悉驱动电路的源代码。

二、实验装置

1. 电脑一台;

2. 实验板一块;

3. 实验板电源一只;

4. 实验板连接电脑的下载线一根。

三、实验原理

实验板显著的特征是2 线16 字符液晶显示器LCD。尽管LCD 支持8 位的数据接口,为了与其它的XILINX 的开发板保持兼容并且尽可能减少针脚数,FPGA 仅通过4 位的数据接口线控制LCD,LCD 通过使用ASCII 标准和自定义字符可以有效地显示多种信息。但是,这些显示速度并不是很快。每半秒扫描一次以测试实际清晰度的界限。与50MHz 时钟频率相比,这样的显示速度是慢的。PicoBlaze 处理器

可以有效地控制显示时间和显示内容。

字符LCD 的供电电压是+5V。FPGA 的I/O 口信号的电压是3.3V。但是,FPGA 的输出电平是通过LCD 来识别是有效的低电平还是高电平。LCD 控制器接收5V TTL 信号电平,FPGA输出3.3V 的LCMOS 以满足5V TTL 电压要求。数据线上的390 欧串联电阻,当LCD 驱动一个逻辑高电平时,其用来防止了FPGA 和SrtataFlsah I/O 管脚的超负载。当LCD_RW 为高时,LCD驱动数据线。在绝大多数应用中,LCD作为只读外围设备,几乎没有从显示器读数据。

四、操作方法和实验步骤

对于程序的各个步骤,如新建项目、新建Verilog HDL、新建.ucf文件、Synthesize、Implement Design、Generate Programming File、Configure Target Device等等,在实验一中已经展示过,每一次实验的基本操作步骤都是差不多的,故这里不再重复阐述。

本次实验总共需要做三份程序并观察现象:

1)例程

2)设计按键拨动时显示小时、分钟和秒,中间分别空一格。

3)按键拨动开始显示,10秒钟显示结束,结束时LCD上显示ABCDEF,同时八只LED灯亮。

五、实验源代码和现象

1)例程

UCF文件如下:

NET "CLK_50MHZ" LOC="C9";

NET "LCD_D<0>" LOC="R15";

NET "LCD_D<1>" LOC="R16";

NET "LCD_D<2>" LOC="P17";

NET "LCD_D<3>" LOC="M15";

NET "LCD_E" LOC="M18";

NET "LCD_RS" LOC="L18";

NET "LCD_RW" LOC="L17";

源代码如下:

module lcd_write_number_test

(

input CLK_50MHZ,

output LCD_E,

output LCD_RS,

output LCD_RW,

output [3:0] LCD_D

);

wire if_ready;

reg if_write;

reg [31:0] if_data;

reg [1:0] state;

reg [31:0] cntr;

parameter IDLE = 2'b00,

IF_WRITE_1 = 2'b01,

SET_IF_WRITE_0 = 2'b10,

WAIT = 2'b11;

// Instantiate the Unit Under Test (UUT)

lcd_write_number uut

(

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

);

initial begin

if_data <= 32'habba0123;

state <= IDLE;

if_write <= 1'b0;

cntr <= 32'b0;

end

always@ (posedge CLK_50MHZ) begin

case (state)

IDLE:

if (if_ready) begin

if_data <= if_data + 1'b1;

if_write <= 1'b1;

state <= IF_WRITE_1;

cntr <= 32'b0;

end

IF_WRITE_1: // this state to keep if_write up for 2 cycles state <= SET_IF_WRITE_0;

SET_IF_WRITE_0: // set if_write 0 and start the counter begin

if_write <= 1'b0;

state <= WAIT;

cntr <= 32'b0;

end

WAIT:

if (cntr < 25000000) // wait for 0.5 seconds

cntr <= cntr + 32'b1;

else

state <= IDLE;

endcase

end

endmodule

相关文档
最新文档