资源预览内容
第1页 / 共60页
第2页 / 共60页
第3页 / 共60页
第4页 / 共60页
第5页 / 共60页
第6页 / 共60页
第7页 / 共60页
第8页 / 共60页
第9页 / 共60页
第10页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
. . . . .专业:_电子信息工程_姓名:_陈华杰_学号:_日期:_4月4日_地点:应电楼303桌号2组 实验报告课程名称:_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 LOC=R15;NET LCD_D LOC=R16;NET LCD_D LOC=P17;NET LCD_D 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 = 2b00,IF_WRITE_1 = 2b01,SET_IF_WRITE_0 = 2b10,WAIT = 2b11;/ 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 beginif_data = 32habba0123;state = IDLE;if_write = 1b0;cntr = 32b0;endalways (posedge CLK_50MHZ) begincase (state)IDLE:if (if_ready) beginif_data = if_data + 1b1;if_write = 1b1;state = IF_WRITE_1;cntr = 32b0;endIF_WRITE_1: / this state to keep if_write up for 2 cyclesstate = SET_IF_WRITE_0;SET_IF_WRITE_0: / set if_write 0 and start the counterbeginif_write = 1b0;state = WAIT;cntr = 32b0;endWAIT:if (cntr 25000000) / wait for 0.5 secondscntr = cntr + 32b1;elsestate = IDLE;endcaseendendmoduletimescale 1ns / 1psmodule lcd_write_number(input CLK_50MHZ,output LCD_E,output LCD_RS,output LCD_RW,output 3:0 LCD_D,input 31:0 if_data,input if_write,output if_ready);reg 7:0 disp_data;reg disp_rs;reg 31:0 disp_delay;reg disp_write;wire disp_ready;reg disp_b8;reg 7:0 char;reg 1:0 state;reg 31:0 number;reg init_done;reg running;reg 4:0 shift_cntr;reg if_ready_r;assign if_ready = if_ready_r;lcd_display display(.clk(CLK_50MHZ),.rst(1b0),.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);parameter NB_CHARS = 8d12;parameter START = 2b00,WAIT_WRITE_0 = 2b01,WRITE_1 = 2b10,WAIT_WRITE_1 = 2b11;initial beginstate = 2b00;char = 8b0;init_done = 1b0;if_ready_r = 1b0;shift_cntr 8d16) beginif (disp_ready)if_ready_r = 1b1;if (if_write) beginchar = 4d8; / reset the displayendend else if (char = 8d16) beginif_ready_r = 1b0;case (state)START:if (disp_ready) begindisp_write = 1b1;state = WAIT_WRITE_0;endWAIT_WRITE_0:state = WRITE_1;WRITE_1:begindisp_write = 1b0;state = 2b11;endWAIT_WRITE_1:beginstate =START;char = char + 8b1;endendcase / case (state)end / else: !if(!running)end / always (posedge CLK_50MHZ)always (negedge CLK_50MHZ) begin/ these next steps initialize the LCD display:case (char)0:begindisp_b8 = 1b0;disp_data = 8h30;disp_delay = 32d10000000;disp_rs = 1b0;end1: disp_data = 8h30;2:begindisp_data = 8h30;disp_delay = 32d1000000;end3:begindisp_data = 8h20;disp_delay = 32d20000;end4:begindisp_b8 = 1b1;disp_data = 8h28;end5: disp_data = 8h06;6: disp_data = 8h0C;7:begindisp_data = 8h01;disp_delay = 32d1000000;init_done = 1b1;shift_cntr = 5d9;end8: / this state provides an entry point to reset the display and then/ go on to the default state that writes the numberbegindisp_rs = 1b0;disp_data = 8h01;disp_delay = 32d1000000;shift_cntr = 5b0;number = if_data;enddefault:/ state machine to print a 32-bit number outif (disp_ready & state = START) beginif (shift_cntr 5d8) begindisp_rs = 1b1;disp_delay =
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号