原创 FPGA培训白板整理--基础实验

2010-10-24 15:40 1462 6 6 分类: FPGA/CPLD

培训实验的内容:


一、拨码开关
(一)数码管的刷新
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;

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条