培训实验的内容:
一、拨码开关
(一)数码管的刷新
always@(posedge clk or negedge rst)
begin
if(!rst) begin
cnt<=0;
en<=8'b1111_1110;
end
else begin
cnt<=cnt+1;
if(cnt==16'hffff) begin //按一定频率送出数码管COM使能信号
en[7:1]<=en[6:0];
en[0]<=en[7];
end
end
end
(二)存储器变量
reg[3:0] dataout_buf;
(三)拨码开关和数码管的对应
always@(en or datain)
begin
case(en)
8'b1111_1110:
dataout_buf=datain[0];
8'b1111_1101:
dataout_buf=datain[1];
8'b1111_1011:
dataout_buf=datain[2];
8'b1111_0111:
dataout_buf=datain[3];
8'b1110_1111:
dataout_buf=datain[4];
8'b1101_1111:
dataout_buf=datain[5];
8'b1011_1111:
dataout_buf=datain[6];
8'b0111_1111:
dataout_buf=datain[7];
default:
dataout_buf=datain[7];
endcase
end
(四)扫描输出
always@(dataout_buf) //显示,dataout_buf--要输出的值,dataout控制段的输出引脚
begin
case(dataout_buf)
4'b0000:
dataout=8'b0000_0011;
4'b0001:
dataout=8'b1001_1111;
4'b0010:
dataout=8'b0010_0101;
4'b0011:
dataout=8'b0000_1101;
4'b0100:
dataout=8'b1001_1001;
4'b0101:
dataout=8'b0100_1001;
4'b0110:
dataout=8'b0100_0001;
4'b0111:
dataout=8'b0001_1111;
4'b1000:
dataout=8'b0000_0001;
4'b1001:
dataout=8'b0001_1001;
4'b1010:
dataout=8'b0001_0001;
4'b1011:
dataout=8'b1100_0001;
4'b1100:
dataout=8'b0110_0011;
4'b1101:
dataout=8'b1000_0101;
4'b1110:
dataout=8'b0110_0001;
4'b1111:
dataout=8'b0111_0001;
endcase
end
(五)I2C
一、要点
1。I2C总线通过SDA(数据线)
SCL(时钟线),和各器件连接
2。主机、从机:发送数据的是主机,接收数据的
是从机,地位可变换
二、时钟线和数据线的关系
1.SDA,1-->0,起始位;0-->1,停止位
注意:上面两个条件产生的前提是时钟线是高电平。
2。SCL:高低电平的变换,驱动数据的传输
三、数据的传输结构
开始位+数据位+停止位
四、仲裁
仲裁的方法:
判断时钟线的低电平周期的长度,谁的低电平周期长
谁就先发,低电平周期短的处于等待状态。
五、ACK--应答
从机收到数据后,向主机发出特定的低电平脉冲,表示收到。
注意:数据和应答都必须在SCL为低电平时变化,在SCL为高电平时保持
稳定。
(六)VGA
一、引脚介绍
1。RGB--控制图像的明亮度,色调,色差,饱和度
2。VGA-HS:行同步
VGA-VS:场同步
二、VGA时序和显示原理
(一)CRT(阴极射线管),彩色是RGB控制。
(二)显示方式:
1.逐行扫描,阴极射线枪发出电子束打在涂有荧光粉的
荧光屏上,产生RGB三色,合成一个彩色像素。
2. 扫描从屏幕的左上方开始,从左到右,从上到下,进行扫描,每
扫完一行,电子束回到屏幕的左边下一行的起始位置.(在扫描的期间CRT对电子
束进行消隐)
3.每行结束后,用行同步信号进行同步。
扫描完所有行,用场同步信号进行场同步。
并使扫描回到屏幕的左上方,同时进行场消隐。
(三)对于5个信号的时序驱动,对于VGA显示器要严格遵循"VGA工业标准"
即640x480x60Hz
1.VGA工业标准要求的频率:
*时钟(Clock frequency):25.175MHz(像素输出的频率)
*行频(Line frequecy):31469Hz
*场频(Field frequency):59.94Hz(每秒图像刷新频率)
2。行时序和场时序
液晶显示--字符型液晶
要点
(一)空闲
data<=8'bzzzz_zzzz;
(二)标志的使用
(三)状态机的嵌套使用
(四)data[7:2]<=6'b000001;data[1]<=cur_inc;data[0]<=cur_noshift
上面的方式的使用若外部输入设备,可增加用户的可定制性
(五)状态机的位数很灵活
(八)图形液晶
(一)基本概念
1.16*16点阵汉字
2。可显示4行,每行8个字
3。lcd_psb--控制串并行通信方式。
4。有复位针脚--lcd_rst
(二)控制信号
注意使能信号,比字符型液晶复杂。
每个名令分三步完成:
clear_a : begin //清屏操作
mstate<=clear_b;
lcd_rs<=0;
lcd_e<=0;
data<=8'b00010000;
end
clear_b : begin
mstate<=clear_c;
lcd_rs<=0;
lcd_e<=1;
end
clear_c : begin
mstate<=setmode_a;
lcd_rs<=0;
lcd_e<=0;
(三)同样有字库存储器
CGROM,CGRAM
(四)指令--基本指令和扩充指令
在功能设定里有扩充指令的设定。
(五)字符数据如何查找
1。每个汉字也分高位和低位
2。写入一个汉字要分六步
writDDRAM_Ha : begin //调用汉字库显示
mstate<=writDDRAM_Hb; //写入第一字节数据(高位)
lcd_rs<=1;
lcd_e<=0;
data<=8'b10110000;
end
writDDRAM_Hb : begin
mstate<=writDDRAM_Hc;
lcd_rs<=1;
lcd_e<=1;
end
writDDRAM_Hc : begin
mstate<=writDDRAM_La;
lcd_rs<=1;
lcd_e<=0;
end
writDDRAM_La : begin //写入第一字节数据(低位)
mstate<=writDDRAM_Lb;
lcd_rs<=1;
lcd_e<=0;
data<=10100000+cnt;
end
writDDRAM_Lb : begin
mstate<=writDDRAM_Lc;
lcd_rs<=1;
lcd_e<=1;
end
writDDRAM_Lc : begin
lcd_rs<=1;
lcd_e<=0;
if(!cnt)
mstate<=delay;
else
begin
cnt<=cnt-1;
mstate<=writDDRAM_Ha;
end
end
(九)实验分析
一、典型例子分析
(一)在数码管上显示数字
1..什么时候把输出声明成寄存器变量
assign en=8'b11111110;
2。数码管的哪一个位,显示什么数值
always@(en) //对应COM信号给出各段数据
begin
case(en)
8'b1111_1110:
dataout_buf=0;
8'b1111_1101:
dataout_buf=7;
8'b1111_1011:
dataout_buf=5;
8'b1111_0111:
dataout_buf=2;
8'b1110_1111:
dataout_buf=9;
8'b1101_1111:
dataout_buf=6;
8'b1011_1111:
dataout_buf=6;
8'b0111_1111:
dataout_buf=7;
default:
dataout_buf=3;
endcase
end
3。扫描输出
always@(dataout_buf)
begin
case(dataout_buf)
4'b0000:
dataout=8'b0000_0011;
4'b0001:
dataout=8'b1001_1111;
4'b0010:
dataout=8'b0010_0101;
4'b0011:
dataout=8'b0000_1101;
4'b0100:
dataout=8'b1001_1001;
4'b0101:
dataout=8'b0100_1001;
4'b0110:
dataout=8'b0100_0001;
4'b0111:
dataout=8'b0001_1111;
4'b1000:
dataout=8'b0000_0001;
4'b1001:
dataout=8'b0001_1001;
4'b1010:
dataout=8'b0001_0001;
4'b1011:
dataout=8'b1100_0001;
4'b1100:
dataout=8'b0110_0011;
4'b1101:
dataout=8'b1000_0101;
4'b1110:
dataout=8'b0110_0001;
4'b1111:
dataout=8'b0111_0001;
endcase
end
(二)数字时钟
1。初始化时间是怎样设置的
dataout_buf[0]<=0;
dataout_buf[1]<=0;
dataout_buf[2]<=15;
dataout_buf[3]<=0;
dataout_buf[4]<=0;
dataout_buf[5]<=15;
dataout_buf[6]<=2;
dataout_buf[7]<=1;
2。小数点是怎样显示的
dataout_buf[2]<=15;
3。如何实现进位的
(1)数码管各个位的计数的增加和各个位的逻辑关系分开编写。
(2)进位标志的使用。
wire[5:0] cal; //各级进位标志(m)-定义了一个六位的wire型变量
assign cal[0]=(dataout_buf[0]==9)?1:0;//
assign cal[1]=(cal[0]&&dataout_buf[1]==5)?1:0;//(m)[&&]逻辑与,进位相等输出为1,否则为0
assign cal[2]=(cal[1]&&dataout_buf[3]==9)?1:0;//分的个位
assign cal[3]=(cal[2]&&dataout_buf[4]==5)?1:0;//分的十位
assign cal[4]=(cal[3]&&dataout_buf[6]==2)?1:0; //小时
assign cal[5]=(cal[3]&&dataout_buf[6]==2&&dataout_buf[7]==1)?1:0;
文章评论(0条评论)
登录后参与讨论