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

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

课程名称:_____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 口信号的电压是。但是, FPGA 的输出电平是通过LCD 来识别是有效的低电平还是高电平。 LCD 控制器接收5V TTL 信号电平, FPGA输出的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;

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)

);

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

);

parameter NB_CHARS = 8'd12; parameter START = 2'b00,

WAIT_WRITE_0 = 2'b01,

WRITE_1 = 2'b10,

WAIT_WRITE_1 = 2'b11;

initial begin

state <= 2'b00;

char <= 8'b0;

init_done <= 1'b0;

if_ready_r <= 1'b0;

shift_cntr <= 5'b0;

end

always@ (posedge CLK_50MHZ) begin

if (init_done && char > 8'd16) begin if (disp_ready)

if_ready_r <= 1'b1;

if (if_write) begin

char <= 4'd8; W1(SW1),

.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'h;

state <= IDLE;

if_write <= 1'b0;

cntr <= 32'b0;

end

always@ (posedge CLK_50MHZ)

begin

case (state)

IDLE:

if (if_ready)

begin

if(if_data[31:0]==32'h)if_data <= 32'h0;

else if(if_data[27:0]==28'h9059059)if_data <= if_data + 32'h6fa6fa7; else if(if_data[19:0]==20'h59059)if_data <= if_data + 32'hfa6fa7; else if(if_data[15:0]==16'h9059)if_data <= if_data + 32'h6fa7;

else if(if_data[7:0]==8'h59)if_data <= if_data + 32'hfa7;

else if(if_data[3:0]==4'h9)if_data <= if_data + 32'h7;

else if_data <= if_data + 1'b1;

if_write <= 1'b1;

state <= IF_WRITE_1;

cntr <= 32'b0;

end

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)

);

parameter NB_CHARS = 8'd12;

parameter START = 2'b00,

WAIT_WRITE_0 = 2'b01,

WRITE_1 = 2'b10,

WAIT_WRITE_1 = 2'b11;

initial

begin

state <= 2'b00;

char <= 8'b0;

init_done <= 1'b0;

if_ready_r <= 1'b0;

shift_cntr <= 5'b0;

end

always@ (posedge CLK_50MHZ) begin

if (init_done && char > 8'd16) begin

if (disp_ready)

if_ready_r <= 1'b1;

if (if_write)

begin

char <= 4'd8; W1(SW1),

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

.LED0(LED0),

.LED1(LED1),

.LED2(LED2),

.LED3(LED3),

.LED4(LED4),

.LED5(LED5),

.LED6(LED6),

.LED7(LED7)

);

initial

begin

if_data <= 32'h;

state <= IDLE;

if_write <= 1'b0;

end

always@ (posedge CLK_50MHZ)

begin

case (state)

IDLE:

if (if_ready)

begin

if(if_data[31:0]==32'h)if_data <= 32'h0;

else if(if_data[27:0]==28'h9059059)if_data <= if_data + 32'h6fa6fa7; else if(if_data[19:0]==20'h59059)if_data <= if_data + 32'hfa6fa7; else if(if_data[15:0]==16'h9059)if_data <= if_data + 32'h6fa7;

else if(if_data[7:0]==8'h59)if_data <= if_data + 32'hfa7;

else if(if_data[3:0]==4'h9)if_data <= if_data + 32'h7;

else if_data <= if_data + 1'b1;

if_write <= 1'b1;

state <= IF_WRITE_1;

cntr <= 32'b0;

end

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)

);

parameter NB_CHARS = 8'd12;

parameter START = 2'b00,

WAIT_WRITE_0 = 2'b01,

WRITE_1 = 2'b10,

WAIT_WRITE_1 = 2'b11;

initial

begin

state <= 2'b00;

init_done <= 1'b0;

if_ready_r <= 1'b0;

shift_cntr <= 5'b0;

cnt_state <= 1'b0;

cnt <= 29'b0;

light <= 1'b0;

end

always@ (posedge CLK_50MHZ)

begin

if (init_done && char > 8'd16)

begin

if (disp_ready)

if_ready_r <= 1'b1;

if (if_write)

begin

char <= 4'd8; // reset the display end

end

else if (char <= 8'd16) begin

if_ready_r <= 1'b0;

case (state)

START:

if (disp_ready) begin

disp_write <= 1'b1;

state <= WAIT_WRITE_0;

end

WAIT_WRITE_0:

state <= WRITE_1;

WRITE_1:

begin

disp_write <= 1'b0;

state <= 2'b11;

end

WAIT_WRITE_1:

begin

state <= START;

char <= char + 8'b1;

end

endcase // case (state)

end // else: !if(!running)

end // always@ (posedge CLK_50MHZ)

always@ (posedge CLK_50MHZ)

if (!SW1)

begin

cnt <= 29'b0;

cnt_state<=1'b0;

end

else if (cnt==29'h1dcd6500) cnt_state<=1'b1; else cnt <= cnt+1'b1;

always@ (negedge CLK_50MHZ) begin

// these next steps initialize the LCD display: case (char)

0:

begin

disp_b8 <= 1'b0;

disp_data <= 8'h30;

disp_delay <= 32'd;

disp_rs <= 1'b0;

end

1: disp_data <= 8'h30;

2:

begin

disp_data <= 8'h30;

disp_delay <= 32'd1000000;

end

3:

begin

disp_data <= 8'h20;

disp_delay <= 32'd20000;

end

4:

begin

disp_b8 <= 1'b1;

disp_data <= 8'h28;

end

5: disp_data <= 8'h06;

6: disp_data <= 8'h0C;

7:

begin

disp_data <= 8'h01;

disp_delay <= 32'd1000000;

init_done <= 1'b1;

shift_cntr <= 5'd9;

end

8: // this state provides an entry point to reset the display and then // go on to the default state that writes the number

begin

disp_rs <= 1'b0;

disp_data <= 8'h01;

disp_delay <= 32'd1000000;

shift_cntr <= 5'b0;

number <= if_data;

end

default:

// state machine to print a 32-bit number out

if (SW1 && (!cnt_state))

begin

if (disp_ready && state == START)

begin

if (shift_cntr < 5'd8)

begin

disp_rs <= 1'b1;

disp_delay <= 32'd20000;

if((shift_cntr == 5'd2) || (shift_cntr == 5'd5))

disp_data <= 8'h20;

else

begin

if (number[31:28] < 4'b1010)

disp_data <= number[31:28] + 8'h30;

else

disp_data <= number[31:28] + 8'h37;

end

number <= number << 4;

shift_cntr <= shift_cntr + 5'b1;

end

end

light <= 1'b0;

end

else if (SW1 && cnt_state)

begin

if (disp_ready && state == START)

begin

if (shift_cntr < 5'd8)

begin

disp_rs <= 1'b1;

disp_delay <= 32'd20000;

if((shift_cntr == 5'd2) || (shift_cntr == 5'd5)) disp_data <= 8'h20;

else if(shift_cntr == 5'd0)

disp_data <= 8'h41;

else if(shift_cntr == 5'd1)

disp_data <= 8'h42;

else if(shift_cntr == 5'd3)

disp_data <= 8'h43;

else if(shift_cntr == 5'd4)

disp_data <= 8'h44;

else if(shift_cntr == 5'd6)

disp_data <= 8'h45;

else if(shift_cntr == 5'd7)

disp_data <= 8'h46;

end

shift_cntr <= shift_cntr + 5'b1;

end

light <= 1'b1;

end

else

light <= 1'b0;

endcase // case (char)

end // always@ (negedge CLK_50MHZ)

assign LED0 = light;

assign LED1 = light;

assign LED2 = light;

assign LED3 = light;

assign LED4 = light;

assign LED5 = light;

assign LED6 = light;

assign LED7 = light; endmodule

`timescale 1ns / 1ps

module lcd_display

(input clk,

input rst,

output lcd_e,

output lcd_rw,

output lcd_rs,

output [3:0] lcd_d,

input [7:0] if_data,

input if_rs,

input [31:0] if_delay,

input if_write,

output if_ready,

input if_8bit);

reg [2:0] state;

reg lcdr_e;

reg [3:0] lcdr_d;

reg [31:0] wait_cntr;

reg ready;

reg init_done;

parameter IDLE = 3'b000,

WAIT_PULSE_E_0 = 3'b001,

LOAD_LOWER_NIBBLE = 3'b010, WAIT_PULSE_E_1 = 3'b011,

WAIT_COMMAND = 3'b100;

parameter PULSE_E_DLY = 32'd12; parameter INIT_TIME = 32'd; assign lcd_d = lcdr_d;

assign lcd_rs = if_rs;

assign lcd_rw = 1'b0;

assign lcd_e = lcdr_e;

assign if_ready = ready;

initial begin

state <= IDLE;

ready <= 1'b0;

lcdr_e <= 1'b0;

init_done <= 1'b0;

end

always@ (posedge clk) begin

if (rst) begin

state <= IDLE;

end else if (!init_done) begin

if (wait_cntr < INIT_TIME)

wait_cntr <= wait_cntr + 1;

else begin

init_done <= 1'b1;

ready <= 1'b1;

end

end else begin

case (state)

IDLE:

begin

if (if_write) begin

lcdr_e <= 1'b1;

lcdr_d <= if_data[7:4]; // upper nibble first ready <= 1'b0;

wait_cntr <= 32'b0;

state <= WAIT_PULSE_E_0;

end

end

WAIT_PULSE_E_0:

if (wait_cntr < PULSE_E_DLY) begin

wait_cntr <= wait_cntr + 1;

end else begin

lcdr_e <= 1'b0;

wait_cntr <= 0;

if (if_8bit)

state <= LOAD_LOWER_NIBBLE;

else

state <= WAIT_COMMAND;

end

LOAD_LOWER_NIBBLE:

if (wait_cntr < PULSE_E_DLY) begin

wait_cntr <= wait_cntr + 1;

end else begin

wait_cntr <= 0;

lcdr_e <= 1'b1;

lcdr_d <= if_data[3:0]; // lower nibble

state <= WAIT_PULSE_E_1;

end

WAIT_PULSE_E_1:

if (wait_cntr < PULSE_E_DLY) begin

wait_cntr <= wait_cntr + 1;

end else begin

lcdr_e <= 1'b0;

wait_cntr <= 0;

state <= WAIT_COMMAND;

end

WAIT_COMMAND:

if (wait_cntr < if_delay) begin

wait_cntr <= wait_cntr + 32'b1;

end else begin

wait_cntr <= 0;

if (!if_write) begin

state <= IDLE;

ready <= 1'b1;

end

end

endcase // case (state)

end

end

endmodule

实验现象:

当SW1为低电平时,LCD无显示,LED都不亮。将SW1向上拨,LCD立即显示小时(空格)分钟(空格)秒数,且该时钟会走动;LCD显示10秒钟后,LCD上变成显示AB(空格)CD(空格)EF,同时八只LED 灯亮;此时再将SW1向下拨,则LCD变为无显示,LED全灭。再将SW1向上拨,又将重复上述过程。

将SW1向上拨,LCD显示持续10秒钟的时钟,如图:

10秒钟后,LCD改为显示AB CD EF,且8个LED全亮,如图:

fpga数字钟课程设计报告

f p g a数字钟课程设计报告 Prepared on 24 November 2020

课程设计报告 设计题目:基于FPGA的数字钟设计 班级:电子信息工程1301 姓名:王一丁 指导教师:李世平 设计时间:2016年1月 摘要 EDA(Electronic Design Automation)电子设计自动化,是以大规模可编程器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,通过相关的软件,自动完成软件方式设计得电子系统到硬件系统,最终形成集成电子系统或专用集成芯片。本次课程设计利用Quartus II 为设计软件,VHDL为硬件描述语言,结合所学知识设计一个多功能时钟,具有显示年、月、日、时、分、秒显示,计时,整点报时,设定时间等功能。利用硬件描述语言VHDL 对设计系统的各个子模块进行逻辑描述,采用模块化的思想完成顶层模块的设计,通过软件编译、逻辑化简、逻辑综合优化、逻辑仿真、最终完成本次课程设计的任务。 关键词:EDA VHDL语言数字钟 目录 摘要 1 课程设计目的 2 课程设计内容及要求

设计任务 设计要求 3 VHDL程序设计 方案论证 系统结构框图 设计思路与方法 状态控制模块 时分秒模块 年月日模块 显示模块 扬声器与闹钟模块 RTL整体电路 4 系统仿真与分析 5 课程设计总结,包括.收获、体会和建议 6 参考文献 1 课程设计目的 (1)通过设计数字钟熟练掌握EDA软件(QUARTUS II)的使用方法,熟练进行设计、编译,为以后实际工程问题打下设计基础。 (2)熟悉VHDL 硬件描述语言,提升分析、寻找和排除电子设计中常见故障的能力。 (3)通过课程设计,锻炼书写有理论根据的、实事求是的、文理通顺的课程设计报告。

单片机实验lcd显示实验

实验19 LCD显示实验 一、实验目的: 学习液晶显示的编程方法,了解液晶显示模块的工作原理。 掌握液晶显示模块与单片机的接口方法。 二、所需设备 CPU挂箱、8031CPU模块 三、实验内容 编程实现在液晶显示屏上显示中文汉字“北京理工达盛科技有限公司”。四、实验原理说明 五、实验步骤 1、实验连线 8255的PA0~PA7接DB0~DB7,PC7接BUSY,PC0接REQ,CS8255接CS0。 2、运行实验程序,观察液晶的显示状态。 六、程序框图 七、程序清单

八、附:点阵式LCD模块 点阵式LCD模块由一大一小两块液晶模块组成。两模块均由并行的数据接口和应答信号接口两部分组成,电源由接口总线提供。 (1)OCMJ2×8液晶模块介绍及使用说明 OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实现文本显示。 OCMJ中文模块系列液晶显示器也可用作一般的点阵图形显示器之用。提供有位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。完全兼容一般的点阵模块。 OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。 本系列模块具有上/下/左/右移动当前显示屏幕及清除屏幕的命令。一改传统的使用大量的设置命令进行初始化的方法,OCMJ 中文模块所有的设置初始化工作都是在上电时自动完成的,实现了“即插即用”。同时保留了一条专用的复位线供用户选择使用,可对工作中的模块进行软件或硬件强制复位。规划整齐的10个用户接口命令代码,非常容易记忆。标准用户硬件接口采用REQ/BUSY 握手协议,简单可靠。 1)表—1:OCMJ2X8(128X32)引脚说明 硬件接口 接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1)表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节后才开始执行整个命令的内

FPGA设计的报告课程设计

FPGA课程设计 实 验 报 告

实验一:设计一个可控的100进制可逆计数器 一、实验要求 用DE2-115开发板下载。 (1)计数器的时钟输入信号周期为200ns。 (2)以十进制形式显示。 (3)有一个复位端clr和两个控制端plus和minus,在这些控制信号的作用 clr plus minus 功能 0 ××复位为0 1 1 0 递增计数 1 0 1 递减计数 1 1 1 暂停计数 二、关键词 可控制、可逆、100进制、复位、暂停、递增、递减 三、内容摘要 module updown_count(qout,reset,clk,plus,minus); output[7:0] qout;/*定义一个8位的输出,其目的是 低四位和高四位分别表示计数器的个位和十位。*/ input clk,plus,minus,reset;//定义四个输入,时钟,加计数,减计数和清零 reg[7:0] qout;//qout的数据类型为寄存器型 always @(posedge clk)//当clk上升沿到来时执行一遍下列程序 begin if(!reset) qout<=0;//当reset为低电平时,计数器执行清零功能,否则跳过else begin case({minus,plus})//case语句模块,包含加,减和暂停四个模块 2'b10: if (qout[3:0]==0)//判断个位是否为零,若不为零,跳到个位减一begin qout[3:0]<=9;//给个位赋值 if(qout[7:4]==0) qout[7:4]<=9;//判断十位是否为零,并且给十位赋值 else qout[7:4]<=qout[7:4]-1;//由于个位赋9,相当于向十位借一,因而十位减一end else qout[3:0]<=qout[3:0]-1;//个位减一 /*这一部分是减计数模块,其思路是:首先判断个位是否为零,若为零,则执行后面的程序,个位直接赋9,并且十位减一;否则个位减一*/ 2'b01: if (qout[3:0]==9)//判断个位是否为9,否则跳到个位加一begin

(完整版)12864lcd显示部分试验总结报告

12864lcd显示部分试验总结报告 管岱2014.12.19 【实验目的】 在12864液晶显示屏上能够显示出在4×4小键盘上输入的激励源频率值,如输入“789HZ”、“8MHZ”、“2.3KHZ”,显示出“789H”、“8M”、“2.3K”。并且要求此部分程序有较好的可移植性,在最后对电阻率值的显示上能够较好的应用。 【实验原理】 12864-3A接口说明表: 在12864液晶显示原理的基础上,通过在ise上编写vhdl语言,使之能够在fpga学习板上顺利显示数据。

【实验内容】 12864的显示原理并不难理解,并且在以前也用汇编语言实现过,所以本次实验的难点不在于显示原理的理解,而在于VHDL语言的编写。 在实验初期,由于对vhdl语言的不熟练,我们“类比”汇编语言的显示程序,编写出如下的程序: 发现编译时就出现了问题,出现如“multi-source in unit <*> on signal <*>”的报错。在仔细调试检查后发现,我们错误的原因在于:在不同的进程中对同一个信号赋值。例如,在写指

令的进程中,将rs信号置‘0’,而在后面写数据的进程中又将rs置‘1’,由于在vhdl中各进程之间是并行的关系,因此这样编写程序会出现在同一时刻对同一个引脚赋高电平和低电平,从而出现矛盾。虽然在程序实际运行中,写指令进程在系统一上电就会完成,远早于写数据进程,但是在逻辑上这样编写是不符合VHDL语言的规则的。 因此,我们利用状态机的思想,将写指令和写数据的两个进程合二为一。程序片段如下: 利用状态机,将写指令和写数据的各个步骤分为一个一个分立的状态,顺序执行。这样编写将对同一个引脚信号的变化放在一个进程中,很好的解决了之前存在的问题。

单片机实验--LCD显示实验

实验19L C D显示实验 一、实验目的: 学习液晶显示的编程方法,了解液晶显示模块的工作原理。 掌握液晶显示模块与单片机的接口方法。 二、所需设备 CPU挂箱、8031CPU模块 三、实验内容 编程实现在液晶显示屏上显示中文汉字“北京理工达盛科技 有限公司”。 四、实验原理说明 五、实验步骤 1、实验连线 8255的PA0~PA7接DB0~DB7,PC7接BUSY,PC0接REQ,CS8255 接CS0。 2、运行实验程序,观察液晶的显示状态。 六、程序框图 八、附:点阵式LCD 模块 点阵式LCD模块 由一大一小两块液晶 模块组成。两模块均 由并行的数据接口和 应答信号接口两部分 组成,电源由接口总 线提供。 (1)OCMJ2×8液晶 模块介绍及使 用说明 OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和 ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实现文本显示。 OCMJ中文模块系列液晶显示器也可用作一般的点阵图形显示器

之用。提供有位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。完全兼容一般的点阵模块。 OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。 本系列模块具有上/下/左/右移动当前显示屏幕及清除屏幕的命令。一改传统的使用大量的设置命令进行初始化的方法,OCMJ 中文模块所有的设置初始化工作都是在上电时自动完成的,实现了“即插即用”。同时保留了一条专用的复位线供用户选择使用,可对工作中的模块进行软件或硬件强制复位。规划整齐的10个用户接口命令代码,非常容易记忆。标准用户硬件接口采用REQ/BUSY 握手协议,简单可靠。 硬件接口 接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1)表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节

FPGA课程设计报告

F P G A 课 程 设 计 报 告 学部:信息科学与技术学部 专业:通信工程 班级:10级1班 学号:100103011125 姓名:万洁 指导老师:祝宏 合作伙伴:张紫君 2012.12.13

一.《任务书》: 实验一100进制的可逆计数器(11——12周)实验二交通灯控制系统(15周) 实验三多功能数字钟系统(14-15周)二.实验书写格式: 一:题目要求 二:程序代码 三:操作步骤及运行结果截图 四:心得体会 三.实验附录: 一:老师提供的资源 二:关于实验所用EP4CE115F29板的简介

实验一100进制的可逆计数器 一、设计一个可控的100进制可逆计数器,要求用实验箱下载。 (1)计数器的时钟输入信号周期为200ns。 (2)以十进制形式显示。 (3)有一个复位端clr和两个控制端plus和minus,在这些控制信号的作用下,计数器具有复位、增或减计数、暂停功能。 clr plus minus 功能 0 ××复位为0 1 1 0 递增计数 1 0 1 递减计数 1 1 1 暂停计数 二、程序如下: module keni100(CLR,CLK,PLUS,MINUS,OUT); //100进制的可逆计数器 input CLR,PLUS,MINUS,CLK; output [7:0]OUT; reg [7:0]OUT; always@(posedge CLK) begin if(!CLR) //如果CLR为零,输出为零;反之,运行else程序 OUT[7:0]<=0; else

begin if(PLUS==0 && MINUS==1) //100进制的递减计数 begin if (OUT[3:0]==0) begin OUT[3:0]<=9; if (OUT[7:4]==0) OUT[7:4]<=9; else OUT[7:4]<=OUT[7:4]-1; end else OUT[3:0]<=OUT[3:0]-1; end if(PLUS==1 && MINUS==0) //100进制的递增计数 begin if (OUT[3:0]==9) begin OUT[3:0]<=0; if (OUT[7:4]==9) OUT[7:4]<=0; else OUT[7:4]<=OUT[7:4]+1; end else OUT[3:0]<=OUT[3:0]+1; end if(PLUS==1 && MINUS==1) OUT<=OUT; //若PLUS和MINUS都为1,暂停计数 if(PLUS==0 && MINUS==0) OUT<=0; //若都为零,输出为零end end endmodule 三、运行程序 1、在quarters II9.1输入程序 打开quarters II界面,点击file→New,在出现的对话框,如图1.1所示,选择Text File,点击OK.

LCD1602液晶显示实验要点

实验报告 实验名称: [LCD1602液晶显示实验]姓名: 学号: 指导教师: 实验时间: [2013年6月15日] 信息与通信工程学院

LCD1602液晶显示实验 1.实验原理 1.1 基本原理 1.1.1 1602字符型LCD简介 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。 1.1.2 1602LCD的基本参数及引脚功能 1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图1-2所示: 图1-2 1602LCD尺寸图 1.1602LCD主要技术参数: 显示容量: 16×2个字符 芯片工作电压: 4.5~5.5V 工作电流: 2.0mA(5.0V) 模块最佳工作电压: 5.0V 字符尺寸: 2.95×4.35(W×H)mm 2.引脚功能说明: 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表: 表1-3引脚接口说明表 编 符号引脚说明编号符号引脚说明 号 1 VSS 电源地9 D 2 数据 2 VDD 电源正极10 D 3 数据 3 VL 液晶显示偏压11 D 4 数据 4 RS 数据/命令选择12 D 5 数据 5 R/W 读/写选择13 D 6 数据 6 E 使能信号14 D 7 数据 7 D0 数据15 BLA 背光源正极 8 D1 数据16 BLK 背光源负极

1.1.3 1602LCD的指令说明及时序 1602液晶模块内部的控制器共有11条控制指令,如表1-4所示: 表1-4 控制命令表 序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示0 0 0 0 0 0 0 0 0 1 2 光标返回0 0 0 0 0 0 0 0 1 * 3 置输入模式0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制0 0 0 0 0 0 1 D C B 5 光标或字符移位0 0 0 0 0 1 S/C R/L * * 6 置功能0 0 0 0 1 DL N F * * 7 置字符发生存贮器 地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到CGRAM或 DDRAM) 1 0 要写的数据内容 11 从CGRAM或 DDRAM读数 1 1 读出的数据内容 1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)读写操作时序如图1-5和1-6所示: 图1-5 读操作时序

LCD液晶显示实验实验报告及程序

实验三 LCD1602液晶显示实验 姓名专业学号成绩 一、实验目的 1.掌握Keil C51软件与proteus软件联合仿真调试的方法; 2.掌握LCD1602液晶模块显示西文的原理及使用方法; 3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法; 4.掌握用LCM1602液晶模块显示数字的C语言编程方法。 二、实验仪器与设备 1.微机一台 C51集成开发环境仿真软件 三、实验内容 1.用Proteus设计一LCD1602液晶显示接口电路。要求利用P0口接LCD1602 液晶的数据端,~做LCD1602液晶的控制信号输入端。~口扩展3个功能键 K1~K3。参考电路见后面。 2.编写程序,实现字符的静态和动态显示。显示字符为 第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。 3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。显示字 符为:

“1.姓名全拼 2.专业全拼+学号 EXP8 DISPLAY ” 主程序静态显示“My information!” 四、实验原理 液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。 1.LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚 接口说明如表:

FPGA课程设计题目

1、彩灯控制器设计 内容及要求: 设计一个彩灯控制器,具体设计要求如下: (1)要有多种花型变化(至少设计5种),led至少16路 (2)多种花型可以自动变化 (3)彩灯变换的快慢节拍可以选择 (4)具有清零开关 (5)完成全部流程:设计规范文档、模块设计、代码输入、仿真、下载验证等,最后就课程设计本身提交一篇课程设计报告。 2、数字秒表设计 内容及要求: 设计一用于体育比赛的数字秒表,具体设计要求如下: (1)6位数码管显示,其中两位显示min,四位显示see,显示分辨率为0.01 s。 (2)秒表的最大计时值为59min59.99see。 (3)设置秒表的复位/启动键,按一下该键启动计时,再按即清0。依此循环。 (4)设置秒表的暂行/继续键。启动后按一下暂行,再按继续。依此循环。 (5)完成全部流程:设计规范文档、模块设计、代码输入、仿真、下载验证等,最后就课程设计本身提交一篇课程设计报告。 3、交通信号控制系统设计 内容及要求: 设计一个十字路口交通控制系统,具体设计要求如下: (1)东西(用A表示)、南北(用B表示)方向均有绿灯、黄灯、红灯指示,其持续时间分别是40秒、5秒和45秒, 交通灯运行的切换示意图和时序图分别如图1、图2所示。 (2)系统设有时钟,以倒计时方式显示每一路允许通行的时间。 (3)当东西或南北两路中任一路出现特殊情况时,系统可由交警手动控制立即进入特殊运行状态,即红灯全亮,时钟停止计时,东西、南北两路所有车辆停止通行;当特殊运行状态结束后,系统恢复工作,继续正常运行。 图1 交通灯运行切换示意图

B红 CP A绿 A黄 A红 B黄 B绿 5S 5S 图2 交通灯时序图 (4)完成全部流程:设计规范文档、模块设计、代码输入、仿真、下载验证等,最后就课程设计本身提交一篇课程设计报告。 4、简易密码锁设计 内容及要求 设计一个4位串行数字锁。 (1)开锁代码为4位二进制,当输入代码的位数与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮一个指示灯。否则进入“错误”状态,并发出报警信号。 (2)锁内的密码可调,且预置方便,保密性好。 (3)串行数字锁的报警由点亮一个灯,直到按下复位开关,报警才停下。此时,数字锁又自动等待下一个开锁状态。 (4)完成全部流程:设计规范文档、模块设计、代码输入、仿真、下载验证等,最后就课程设计本身提交一篇课程设计报告。 5、出租车计价器设计 内容及要求 (1)设一个出租车自动计费器,计费包括起步价、行驶计费和等待计费三个部分,用4个数码管显示出金额数目,最大值为999.9元,最小计价单位为0.1元。行驶里程在3公里范围内且等待时间未超过三分钟时按起步价8元计费;行驶里程超过三公里后按每公里2元收费;等待时间超过三分钟后按每分钟1元收费。等待时间用两个数码管显示,最大值为59分钟。 总费用=起步价+(里程-3km )*里程单价+(等待时间-3)*等候单价 (2)能够实现的功能: 显示汽车行驶里程:用四位数字显示,单位为km 。 计程范围为0~99km ,计程分辨率为1km 。 显示等候时间:用两位数字显示分钟,单位为min 。计时范围为0~59min ,计时分辨率为1min 。

LCD显示实验..

昆明理工大学 微型计算机技术实验设计报告 设计项目名称:LCD显示实验 设计完成人:张恩寿王基春 班级:2011级电科111、112班 学号:201111103123 姓名:张恩寿学号:201111103223 姓名:王基春

一、实验目的 学习液晶显示的编程方法,了解液晶显示模块的工作原理。 掌握液晶显示模块与pc机的接口方法。 掌握点阵式LCD的工作原理、使用方法以及动态显示的编程方法。 二、所需设备 8086cpu试验箱、8255芯片、导线。 三、实验内容 编程实现在液晶显示屏上显示中文汉字,显示各自的名字。首先,显示器第一行从左到右依次显示“我是张恩寿腾”,然后,第二行倒序依次显示“我是王基 春冲”。 四、实验原理 (一)、液晶显示器LCD的工作原理 ,厚度各为1mm的玻璃板之间充满液晶材料,在结构上,LCD屏幕是用两块间距为5~7m 并在这两片玻璃板上设置两个透明电极构成的,屏幕最前面是彩色滤光膜,屏幕 的后面是背光源。 LCD中的背光源在反射板和光导板的作用下,变成平面光,射向液晶板,形成面光源。 液晶屏幕上的各单元即像素采用行列式结构,在没有电信号时,像素排成整齐的矩阵,使背光源发出的光畅通无阻的穿过。在液晶两边的电极加上信号电压后,液晶板就处 于电场中,液晶单元在电场作用下其状态不再整齐,从而引起各个像素点的透光 率发生改变,引起光线灰度有深浅变化。 每个像素点有对应的行位和列位,处于行列交叉点的一个液晶单元的扭曲状态决定于行位上的电极和列位上的电极之间的电压。组成LCD屏幕时,将同一行上的行位连在一 起,称为行电极,而将同一列上的列位连在一起,称为列电极。显示过程中,依 次往每个行电极加选通信号,而往每个列电极加要显示的信号,显示信号的强弱 决定了相应像素点液晶的扭曲状态,从而对光的穿透率产生控制作用。扭曲范围 越大,对比度越高。这样,通过控制电极信号的电压就可以控制像素点的亮度, 从而使屏幕产生不同亮度层次的图象。但如果没有彩色滤光膜,那么,这种图象 只能是黑白的。 要使LCD显示彩色影像,必须加上彩色滤光膜。彩色滤光膜中有一个具有绿光功能的彩色层,它让需要的光透过去,而把不需要的光阻挡住。和液晶板相对应,滤光膜中 的彩色层也分成许多像素单元。实际上,彩色层中的每个像素和液晶板上的每个 像素都由红绿蓝三个子像素构成,两者的子像素也一一对应。背光源发出的白光 透过液晶板以后,成为不同灰度层次的白色光线,照射到滤光膜上的红绿蓝三个

FPGA课程设计报告--简易电子琴的设计

邮电大学 FPGA课程设计报告 题目:简易电子琴设计及FPGA功能验证 院系: 专业班级: 学生:XX 导师:XX 起止时间:2012、6、18至2012、6、29

一、课程设计任务: 本设计一个简易电子琴,具体功能如下: 1、具有手动弹奏和自动播放功能; 2、以按键或开关作为电子琴的琴键,输出7个音节的音阶; 3、可以自动播放曲目至少两首。 二、课程设计目的: 1、培养综合运用知识和独立开展实践创新的能力; 2、深入学习Verilog HDL,了解其编程环境; 3、学会运用Modelsim和Quartus II等编程仿真软件; 4、将硬件语言编程与硬件实物功能演示相结合,加深理解Verilog HDL的学习; 三、使用环境: 1、软件:Modelsim和Quartus II等编程仿真软件; 2、硬件:FPGA开发板。 四、课程设计详细方案及功能验证: 1、总体实现方案: 1、简易电子琴的设计通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、LED、蜂鸣器等,软件资源包括编写Verilog HDL程序的应用软件Modelsim和仿真软件Quartus II。电子琴有按键代替琴键的弹奏功能和自动播放功能。 2、整个程序总共分5个模块:主模块,按键模块,曲目1模块,曲目2模块,

曲目3模块。 整个方案总共用了9个按键(key1~key9),按键key1~key7作为琴键,通过这七个按键键入不同的音阶。主模块中key8、key9两个按键用于选择是自动播放还是弹奏曲目,令mm=(key8、key9),用mm值的不同选择调用不同模块。如果mm=00,则程序调用按键模块;如果mm=01,则调用曲目1模块,播放曲目1;如果mm=10,则调用曲目2模块,播放曲目2;如果mm11,则调用曲目3模块,播放曲目3。 本次设计的框图:

液晶显示技术试验讲义

附件一 彰化師大光電所 光電實驗技術 液晶顯示技術實驗講義 (初稿) Version Ⅰ

實驗項目: 1.基版、液晶空盒之製作及聚光干涉圖樣之觀察。 2. TN 面板之製作及量測。 3. PSCT 面板之製作及量測。 4. SSCT面板之製作及量測。 5.圖形顯示及4X4顯示面板之製作。

實驗一基板、液晶空盒之製作及聚光干涉圖樣之觀察 一、目的: (1) 學習基板處理及製作水平、垂直配向液晶樣品。 (2) 觀察各樣品於聚光干涉儀下之圖樣,藉以瞭解配向原理與效果 二、使用儀器設備及材料: 儀器設備:超音波清洗機、紫外光源、烘箱、旋轉塗佈機、聚光干涉儀、摩擦配向機。 使用材料:ITO玻璃、玻璃清潔藥品、PVA (水平配向用)、DMOAP (垂直配向用)、spacer (間隔物)、向列相液晶(nematic LC, NLC) (E7)、紫 外硬化膠。 三、實驗步驟: (一) 玻璃的清洗: (1) 以玻璃切割機製作ITO玻璃基板為尺寸約2cm 3cm數塊,並整齊擺置 於鐵槽上。 (2) 將此鐵槽(先清洗乾淨)置於裝有RO水稀釋化學清潔液(1:20) 之容 器中,於超音波清洗機(內裝定量RO水) 內振盪清洗~20分鐘後倒掉 此清潔液,並以RO水沖刷掉附著之泡沫。 (3) 換裝以RO水,重複步驟(2) 三次。 (4) 換裝以丙酮,重複步驟(2) 一次,振盪完時立即將裝有已清洗過玻璃 群之鐵槽置於烘箱內(~70o C) 約數分鐘後直至丙酮立即完全揮發,此 時玻璃清洗完成。 (二) 水平配向(homogeneous alignment) 膜製作: (1) 準備PVA (Polyvinyl Alcohol;顆粒狀) 及RO水混於容器中,製作PVA 溶液(~0.05wt%);其中加熱皿至100o C並放入攪拌石,使PVA顆粒 溶解於水中後,冷卻備用。 (2) 使用旋轉塗佈機塗佈PVA溶液於已清洗乾淨之玻璃基片。 (3) 將玻璃基片置入烘箱內(~120o C) 約20分鐘,烤乾後移出。 (4) 最後,以摩擦配向機(Rubbing Machine) 摩擦玻璃基片(ITO面) , 完成水平配向膜之塗佈;滾筒轉速依最初調至較佳經驗值後固定不動。

FPGA课程设计报告--简易电子琴的设计[1].doc

西安邮电大学 FPGA课程设计报告 题目:简易电子琴设计及FPGA功能验证 院系: 专业班级: 学生姓名: XX 导师姓名: XX 起止时间: 2012、6、18至2012、6、29

一、课程设计任务: 本设计一个简易电子琴,具体功能如下: 1、具有手动弹奏和自动播放功能; 2、以按键或开关作为电子琴的琴键,输出7个音节的音阶; 3、可以自动播放曲目至少两首。 二、课程设计目的: 1、培养综合运用知识和独立开展实践创新的能力; 2、深入学习Verilog HDL,了解其编程环境; 3、学会运用Modelsim和Quartus II等编程仿真软件; 4、将硬件语言编程与硬件实物功能演示相结合,加深理解Verilog HDL的学习; 三、使用环境: 1、软件:Modelsim和Quartus II等编程仿真软件; 2、硬件:FPGA开发板。 四、课程设计详细方案及功能验证: 1、总体实现方案: 1、简易电子琴的设计通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、LED、蜂鸣器等,软件资源包括编写Verilog HDL程序的应用软件Modelsim和仿真软件Quartus II。电子琴有按键代替琴键的弹奏功能和自动播放功能。 2、整个程序总共分5个模块:主模块,按键模块,曲目1模块,曲目2模块,曲目3模块。 整个方案总共用了9个按键(key1~key9),按键key1~key7作为琴键,通过这七个按键键入不同的音阶。主模块中key8、key9两个按键用于选择是自动播放还是弹奏曲目,令mm=(key8、key9),用mm值的不同选择调用不同模块。如果mm=00,则程序调用按键模块;如果mm=01,则调用曲目1模块,播放曲目1;如果mm=10,则调用曲目2模块,播放曲目2;如果mm11,则调用曲目3模块,播放曲目3。 本次设计的框图:

LCD显示实验

. 单片机实验报告 班级: 姓名: 学号: 指导教师:

实验三 LCD显示实验(2学时) 一、实验目的: 学习液晶显示的编程方法,了解液晶显示模块的工作原理。 掌握液晶显示模块与单片机的接口方法。 学习和掌握8255扩展通用I/O的方法。 基于扩展I/O口,实现LCD显示器的控制。 二、实验设备: CPU挂箱、8031CPU模块 三、实验内容: 在掌握8255扩展I/O口的基础上,实现LCD的显示,并显示“中北大学1105064102 姓名”。。 四、实验原理说明 LCD显示电路 点阵式LCD显示电路是在系统板上外挂电正式液晶显示模块,模块的数据线、状态、控制线都通过插孔引出。可直接与系统相连。 1、OCMJ2×8液晶模块介绍及使用说明 OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实

现文本显示。也可用作一般的点阵图形显示器之用。提供位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。完全兼容一般的点阵模块。OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。本系列模块具有上/下/左/右移动当前显示屏幕及清除屏幕的命令。一改传统的使用大量的设置命令进行初始 1)表—1:OCMJ2X8(128X32)引脚说明 化的方法,OCMJ 中文模块所有的设置初始化工作都是在上电时自动完成的,实现了“即插即用”。同时保留了一条专用的复位线供用户选择使用,可对工作中的模块进

fpga课程设计报告

第一部分 EDA技术的仿真 1、奇偶校验位产生器 1.1奇偶校验位的技术要求 奇偶校验是通信中常用的一种数据校验方式,试设计一个奇偶校验位产生器,根据输入字节(8位)产生相应的奇偶校验位(1的个数为奇数时输出低电平,即奇校验位为1)和偶校验位(1的个数为偶数时输出高电平,即偶校验位为1) 1.2奇偶校验位的原理 通过计算数据中“1”的个数是奇数还是偶数来判断数据的正确性。在被校验的数据后加一位校验位或校验字符用作校验码实现校验。 其生成方法是: 奇校验:确保整个被传输的数据中“1”的个数是奇数个,即载荷数据中“1”的个数是奇数个时校验位填“0”,否则填“1”; 偶校验:确保整个被传输的数据中“1”的个数是偶数个,即载荷数据中“1”的个数是奇数个时校验位填“1”,否则填“0”。 1.3奇偶校验位的功能及其仿真波形 奇偶校验位的功能具体见下表所示: 输入8位的二进制序列奇校验位 even 偶校验位 odd 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 0 1 其具体实现程序如下所示: module parity(data,odd,even); input [0:7]data; output odd,even; assign odd=^data; assign even=~odd; endmodule 根据程序我们得到如下的仿真波形: 图1 奇偶校验位仿真波形 中国计量学院信息工程学院课程设计报告P.2

2、十六位数据选择器 2.1数据选择器的原理 在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,数据选择器(MUX)的逻辑功能是在地址选择信号的控制下,从多路数据中选择一路数据作为输出信号。 在数据选择器中,我们设定一个控制输入端ENA ,当ENA=1时,电路不能工作,输出Y=0;而当ENA=0时,电路才处于工作状态。由于我们设计的是16选1数据选择器,因而其有4个数据控制端,即S0,S1,S2,S3,根据这4个控制端的状态有选择性的输出。 2.2数据选择器的实现电路图 我们知道一个16选1的数据选择器是由5个4选1的数据选择器组成的,4选1的基本电路如下图所示: W[0..3]S[1..0] ENA f mux_4 inst2 在左图中,ENA 为使能控制输入端,低 电平有效,S 为两位的数据控制端,W 为输入端,f 为输出端。有上述4选1的原理图我们可以得到16选1的原理图: W[0..3]S[1..0]ENA f mux_4 inst W[0..3]S[1..0]ENA f mux_4 inst1 W[0..3]S[1..0]ENA f mux_4 inst2 W[0..3]S[1..0]ENA f mux_4 inst3 W[0..3]S[1..0]ENA f mux_4 inst4S3\32控制端 S1\S0控制端 图2 16选1数据选择器原理图 2.3数据选择器的功能仿真

FPGA课程设计报告

F P G A课程设计报告 (实现多功能数字钟) 专业班级: 07通信2班 姓名:朱绍兴 学号:0701******** 时间:2009.12.30

一、标题:设计多功能数字钟控制电路 二、任务书:用MAX+PLU SⅡ软件及Verilog HDL语言设计 一个多功能的数字钟,包括有时、分、秒的计 时,以及校时(对小时、分钟和秒能手动调整 以校准时间)、正点报时(每逢整点,产生“嘀 嘀嘀嘀-嘟”,4短一长的报时音)等附加功能。 三、关键词:24进制、60进制、正点报时、校时、数字钟 四、总体方案:多功能数字钟控制电路框图是由三部分组成 的,即秒分时控制电路、整点报时控制电路、 时段控制电路。用Verilog HDL硬件描述语 言完成编译和仿真。 五、原理框图如下: ↓ ↓ ↓

六、Verilog HDL硬件描述语言编写的功能模块: /*秒计数器m60*/ module m60(M,CP60M,CPM,RD); output [7:0]M; output CP60M; input CPM; input RD; reg [7:0]M; wire CP60M; always@(negedge RD or posedge CPM) begin if(!RD) begin M[7:0]<=0; end else begin if((M[7:4]==5)&&(M[3:0]==9)) begin M[7:0]<=0; end else begin if(M[3:0]==9) begin M[3:0]<=0; if(M[7:4]==5) begin M[7:4]<=0;end else M[7:4]<=M[7:4]+1; end

FPGA课程设计(最终版)

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:信息工程学院 题目: 电子琴的设计 课程设计目的: 《FPGA原理与应用》课程设计的目的是为了让学生熟悉基于VHDL语言进行FPGA开发的全流程,并且利用FPGA设计进行专业课程理论知识的再现,让学生体会EDA技术的强大功能,为今后使用FPGA进行电子设计奠定基础。 课程设计内容和要求 设计内容: (1)设计一个八音电子琴。 (2)由键盘输入控制音响,同时可自动演奏乐曲。 (3)用户可以将自己编制的乐曲存入电子琴,演奏时可选择键盘输入乐曲或者已存入的乐曲。 要求每个学生单独完成课程设计内容,并写出课程设计说明书、说明书应该包括所涉及到的理论部分和充足的实验结果,给出程序清单,最后通过课程设计答辩。 时间安排: 所需时 序号阶段内容 间 1 方案设计1天 2 软件设计2天 3 系统调试1天 4 答辩1天 合计5天 指导教师签名:年月日

系主任(或责任教师)签名:年月日

目录 摘要 (1) Abstract (2) 1设计意义和要求 (3) 1.1设计意义 (3) 1.2功能要求 (3) 2方案论证及原理分析 (4) 2.1实现方案比较 (4) 2.2乐曲实现原理 (4) 2.3系统组成及工作原理 (6) 3系统模块设计 (8) 3.1顶层模块的设计 (8) 3.2乐曲自动演奏模块的设计 (8) 3.3音阶发生器模块的设计 (9) 3.4数控分频器模块的设计 (9) 4程序设计 (11) 4.1VHDL设计语言和ISE环境简介 (11) 4.2顶层模块的程序设计 (12) 4.3乐曲自动演奏模块的程序设计 (13) 4.4音阶发生器模块的程序设计 (13) 4.5数控分频模块的程序设计 (14) 5设计的仿真与实现 (15) 5.1乐曲自动演奏模块仿真 (15) 5.2音调发生模块仿真 (18) 5.3数控分频模块仿真 (19) 5.4电子琴系统的仿真 (20) 5.5设计的实现 (22) 5.6查看RTL视图 (23) 5.7查看综合报告 (25) 6心得体会 (31) 7参考文献 (32) 8附录 (33)

大学物理实验讲义实验液晶电光效应实验

实验14 液晶电光效应实验 液晶是介于液体与晶体之间的一种物质状态。一般的液体内部分子排列是无序的,而液晶既具有液体的流动性,其分子又按一定规律有序排列,使它呈现晶体的特性。当光通过液晶时,会产生偏振面旋转,双折射等效应。液晶分子是含有极性基团的极性分子,在电场作用下,偶极子会按电场方向取向,导致分子原有的排列方式发生变化,从而液晶的光学性质也随之发生改变,这种因外电场引起的液晶光学性质的改变称为液晶的电光效应。 1888年,奥地利植物学家Reinitzer在做有机物溶解实验时,在一定的温度范围内观察到液晶。1961年美国RCA公司的Heimeier发现了液晶的一系列电光效应,并制成了显示器件。从70年代开始,日本公司将液晶与集成电路技术结合,制成了一系列的液晶显示器件,至今在这一领域保持领先地位。液晶显示器件由于具有驱动电压低(一般为几伏),功耗极小,体积小,寿命长,无辐射等优点,在当今各种显示器件的竞争中有独领风骚之势。 【实验目的】 1.在学习液晶光开关的基本原理,测量液晶光开关的电光特性曲线,并由电光特性曲线得到液晶的阈值电压和关断电压。 2.测量驱动电压周期变化时,液晶光开关的时间响应曲线,并由时间响应曲线得到液晶的上升时间和下降时间。 3.测量液晶光开关的视角特性。 4.了解液晶光开关构成矩阵式图像显示的原理。 【仪器用具】 ZKY-LCDEO型液晶光开关电光特性综合实验仪、数字示波器 【实验原理】 1.液晶光开关的工作原理

液晶的种类很多,仅以常用的扭曲向列型液晶为例,说明其工作原理。光开关的结构如图1所示。在两块玻璃板之间夹有液晶,液晶分子的形状如同火柴一样,为棍状。棍的长度 在十几埃,直径为4~6埃,液晶层厚度一般为5-8微米。玻璃板的内表面涂有透明电极,电极的表面预先作了定向处理(可用软绒布朝一个方向摩擦),这样,液晶分子在透明电极表面就会躺倒在摩擦所形成的微沟槽里;电极表面的液晶分子按一定方向排列,且上下电极上的定向方向相互垂直。上下电极之间的那些液晶分子趋向于平行排列。然而由于上下电极上液晶的定向方向相互垂直,所以从俯视方向看,液晶分子的排列从上电极的沿-45度方向排列逐步地、均匀地扭曲到下电极的沿+45度方向排列,整个扭曲了90度。如图1左图所示。 理论和实验都证明,上述均匀扭曲排列起来的结构具有光波导的性质,即偏振光从上电极表面透过扭曲排列起来的液晶传播到下电极表面时,偏振方向会旋转90度。 取两张偏振片贴在玻璃的两面,P1的透光轴与上电极的定向方向相同,P2的透光轴与下电极的定向方向相同,于是P1和P2的透光轴相互正交。 在未加驱动电压的情况下,来自光源的自然光经过偏振片P1后只剩下平行于透光轴的线偏振光,该线偏振光到达输出面时,其偏振面旋转了90°。这时光的偏振面与P2的透光轴平行,因而有光通过。 在施加足够电压情况下,在静电场的作用下,除了基片附近的液晶分子被基片“锚定”以外,其他液晶分子趋于平行于电场方向排列。于是原来的扭曲结构被破坏,成了均匀结构,如图1右图所示。从P1透射出来的偏振光的偏振方向在液晶中传播时不再旋转,保持原来的偏振方向到达下电极。这时光的偏振方向与P2正交,因而光被关断。 由于上述光开关在没有电场的情况下让光透过,加上电场的时候光被关断,因此叫做常通型光开关,又叫做常白模式。若P1和P2的透光轴相互平行,则构成常黑模式。 入射的自然光 偏振片P1 偏振片P2 出射光 扭曲排列的液晶分子具有光波导效应 光波导已被电场拉伸 图1. 液晶光开关的工作原理

相关文档
最新文档