FPGA实验三:液晶屏的显示设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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