2017最新博彩娱乐网站大全|亚洲博彩排名|澳门正规博彩娱乐!

设为首页 收藏本页

logo

小梅哥和你一起深入学习FPGA之数码管动态扫描(上)何韵诗贾宝玉

时间:2017-09-24 16:15 来源:http://www.dgtzhb.com 作者:莞城在线
摘要:在电子系统中,凡是都需要有输出设备来输出或显示必然的信息,以指示当前系统运行的状况。在以单片机和ARM为主的电子系统中,液晶屏是抱负的输出设备。而FPGA则因为其奇特的硬件布局,假如用RTL级电路来驱动彩色液晶屏来显示必然的数据,势必长短常不贰贰划算
小梅哥和你一起深入学习FPGA之数码管动态扫描(上)何韵诗贾宝玉   在电子系统中,凡是都需要有输出设备来输出或显示必然的信息,以指示当前系统运行的状况。在以单片机和ARM为主的电子系统中,液晶屏是抱负的输出设备。而FPGA则因为其奇特的硬件布局,假如用RTL级电路来驱动彩色液晶屏来显示必然的数据,势必长短常不贰贰划算的选择,而且驱动也极为庞大。数码管作为一种能够直不雅观显示必然数据信息的输出设备,具有驱动简朴,显示直不雅观的特点,尤其适相助为FPGA系统的输出设备。本节,小梅哥就将和大家一起进行数码管驱动的开发。本文引用地点:   尝试目的   实现6位7段数码管的驱动,待显示数据以BCD格局输入。数码管刷新时钟为1KHz。尝试使用了4个独立按键作为输入,通过按键来转变需要数码管显示的数据,以验证数码管驱动的正确性,同时也可查验独立按键消抖模块的可靠性。   尝试道理   数码管所谓的动态扫描,就是操作人眼的视觉暂留特性,在人眼能辨别的变革速度以外,快速分时的点亮各个数码管对应的段。因为分袂点亮所有数码管一次序顺序序所用时间小于人眼的视觉暂留,因此,在人们眼里看来,这些数码管都是同时连续点亮的,并不贰贰会有闪烁的觉得。    数码管实物图.jpg   图2-1 数码管实物图   关于数码管的详细道理,请大家网上查阅,小梅哥一小我私家精力有限,没步伐在这里从最低层的道理给大家一步一步讲起,假如大家有不贰贰明利剑的,请自行百度。这里小梅哥就用最简朴粗暴的方法给大家简朴介绍一下。    数码管等级效电路.jpg   图2-2 数码管简朴等级效电路   上图为3位7段数码管的等级效电路图,在这个图中,可以明显的看到24个发光二极管被分为了三组,每一组的8个发光二极管正极被接在了一起,通过一个三极管与VCC相连。三极管的基极连接到了FPGA的IO上,因此,只需要FPGA对应的IO上给出低电平,三极管便会导通。而三组LED中所有的不异编号的LED的负极被连接在了一起,并接到了FPGA的IO上。假如我们但愿将最左边一组的led0、led5、led7三个编号的led灯点亮,其它led不贰贰亮,则只需要给Q0的基极(sel0)连接上低电平,并将led0、led5、led7的负极(a、f、h)连接上低电平,其它所有端口都输出高电平,则最左边一组的对应的三个led灯就会被点亮,而其它led则会处于熄灭状况。   如果我们需要在三秒时间内,完成以下三次序顺序序操纵:第一次序顺序序操纵,点亮最左边一组led灯的led0、led5、led7;第二次序顺序序操纵,点亮中央一组led灯的led1、led2、led3;第三次序顺序序操纵,点亮最右边一组led灯的led2、led4、led6;那么涡蛩承蛐蛞们只需要凭据如下表格中列出的真值表操纵即可:   第一秒第二秒第三秒   sel0011   sel1101   sel2110   a011   b101   c100   d101   e110   f011   g110   h011   凭据以上表格,我们就能知道该如何操纵了,只需要在不贰贰同的时间给各个IO不贰贰同的电平,便能实现我们想要的亮灭组合。以上我们是以1秒为单位进行led组的切换的,如果我们将切换速度加快,变为1毫秒一切换,会是什么环境呢?在1毫秒一切换的速度下,完成所有操纵所需时间为3ms,远远超过了我们人眼所能辨识的变革速度范畴。假如我们让以上三个操纵永远循环的进行下去,那么涡蛩承蛐蛞们将看见三组led灯中,我们点亮的那几个led是同时且一直处于亮着的状况的,这等于动态扫描的道理,如果我们把每个led做成一个长条型的,并凭据如下外形摆放,便就是我们常见的数码管了。    数码管摆放示意图.jpg   图2-3 数码管段漫衍   硬件设计   图2-2只是一个为了讲述数码管道理简化了的电路模型,常见的数码管电路布局如下图所示:    数码管规范应用电路.jpg   图3-1 数码管规范电路   在这个图中,共有6位数码管,每个数码管的正极被接在一个驱动三极管上,三极管的基极连接到三八译码器的Y端,则FPGA只需要三个引脚就可最多控制8个数码管的位选。数码管的段选在串接了470欧姆的电阻后与FPGA的IO相连。这里470欧姆的电阻紧张起到限流的感化,保证流过数码管的电流在正常范畴内。   架构设计   本尝试由总共四个模块组成,分袂为数码管驱动模块、独立按键检测模块、控制模块和顶层模块,其架构如下:    系统布局图.jpg   图4-1 led尝试模块结构布局图   由图可知本尝试有1个输出端口,对应驱动了38译码器的三个选择端和数码管的8个段选脚。6个输入端口,对应了4个独立按键输入和一个时钟输入以登科一个复涡蛩承蛐蚧输入。具体端口名登科其意义如下 小梅哥和你一起深入学习FPGA之数码管动态扫描(上)何韵诗贾宝玉   代码结构方法   本尝试中,数码管的驱动给与了组合逻辑译码的方法进行,详细将在代码解读时讲解。   尝试中还设计了一个控制器,该控制重视要通过读取按键信息来转变待数码管待显示的数据内容。   按键检测部分使用前一节开发的独立按键的驱动,因此这里不贰贰进行过多的分析介绍。   关头代码解读   因为数码管属于低速设备,其正常的扫描频率为500~10KHz,扫描频率太快,会导致系统功耗增加,显示效果变暗。扫描频率太慢,会有明显的闪烁感。本尝试通过调试不雅察看,选择以1KHz作为扫描频率,实际显示效果很是好。   因此本尝试首先就需要孕育产生一个1KHz的扫描时钟,该时钟由系统时钟分频获得。孕育产生1KHz扫描时钟的代码如下:   parameter system_clk = 50_000_000;   localparam cnt1_MAX = system_clk/1000/2-1;   //1KHz时钟分频计数器   always@(posedge Clk)   begin   if(!Rst_n)cnt1<=0;   else if(cnt1==cnt1_MAX)cnt1<=0;   else cnt1<=cnt1+1'b1;   end   //获得1KHz时钟   always@(posedge Clk or negedge Rst_n)   if(!Rst_n)clk_1K<=0;   else if(cnt1==cnt1_MAX)   clk_1K<=~clk_1K;//翻转扫描时钟信号   else ;   此中,界说了一个全局参数system_clk,该参数为Clk的频率,不贰贰同的时钟频率,只需要变动该参数,就可转变分频计数器的最大计数值,以保证1KHz分频的精准性。   在驱动中,数码管的位选以扫描时钟的速率进行切换,因为只有6位数码管,因此当位选计数到6-1后必需清零从新最先计数。相关代码如下:   //位选信号控制   always@(posedge clk_1K or negedge Rst_n)   if(!Rst_n)sel_r<=3'd0;   else if(sel_r == 3'd5)   sel_r<=3'd0;   else   sel_r<=sel_r+1'b1;   每个数码管需要显示的内容都不贰贰不异,由Data中相应的位指定,Data中列位与数码管的位对应干系燃剁下:   Data位Data[23:20]Data[19:16]Data[15:12]Data[11:8]Data[7:4]Data[3:0]   数码管位数码管0数码管1数码管2数码管3数码管4数码管5   因此需要从Data中将每个数码管当选中时需要显示的数据提取出来,提取数据的代码如下所示:   //按照不贰贰同的数码管位选择不贰贰同的待显示数据   always@(*)   if(!Rst_n)   disp_data<=4'd0;   else   begin   case(sel_r)   0:disp_data<=Data[23:20];   1:disp_data<=Data[19:16];   2:disp_data<=Data[15:12];   3:disp_data<=Data[11:8];   4:disp_data<=Data[7:4];   5:disp_data<=Data[3:0];   default :disp_data<=4'd0;   endcase   end   因为提取出来的数据照旧BCD码的形式,还需要将BCD码对应的数据翻译成为数码管显示对应字符时应该点亮或熄灭的对应的LED的控制信号,因此必需另有一个BCD码译码的历程,该历程代码如下图所示:   //数据译码,将待显示数据翻译为切合数码管显示的编码   always@(*)   if(!Rst_n)   seg_r<=8'hff;   else   begin   case(disp_data)   4'd0: seg_r<=8'hc0;   4'd1: seg_r<=8'hf9;   4'd2: seg_r<=8'ha4;   4'd3: seg_r<=8'hb0;   4'd4: seg_r<=8'h99;   4'd5: seg_r<=8'h92;   4'd6: seg_r<=8'h82;   4'd7: seg_r<=8'hf8;   4'd8: seg_r<=8'h80;   4'd9: seg_r<=8'h90;   4'd10: seg_r<=8'h88;   4'd11: seg_r<=8'h83;   4'd12: seg_r<=8'hc6;   4'd13: seg_r<=8'ha1;   4'd14: seg_r<=8'h86;   4'd15: seg_r<=8'h8e;   default : seg_r<=8'hff;   endcase   end   末了,需要将位选和段选信号输出:   assign Dig_Led_seg = seg_r;   assign Dig_Led_sel = sel_r;   控制部分相对简朴,只需要按照对应的 按键信息,给待显示的数据加上一个对应的值,该部分代码如下所示:   always @(posedge Clk or negedge Rst_n)   if(!Rst_n)   Dig_Led_Data <= 24'd0;   else if(Key_Flag)   begin   case(Key_Value)   4'b0001:Dig_Led_Data <= Dig_Led_Data + 23'd1;   4'b0010:Dig_Led_Data <= Dig_Led_Data + 23'd100;   4'b0100:Dig_Led_Data <= Dig_Led_Data + 23'd10000;   4'b1000:Dig_Led_Data <= Dig_Led_Data + 23'd100000;   default:Dig_Led_Data <= Dig_Led_Data;
责任编辑: 莞城在线