国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

小梅哥和你一起深入學(xué)習(xí)FPGA之?dāng)?shù)碼管動態(tài)掃描

發(fā)布時間:2016-4-13 21:29    發(fā)布者:小梅哥
關(guān)鍵詞: FPGA , SOPC , NIOS , 小梅哥 , 芯航線
電子系統(tǒng)中,通常都需要有輸出設(shè)備來輸出或顯示一定的信息,以指示當(dāng)前系統(tǒng)運(yùn)行的狀態(tài)。在以單片機(jī)ARM為主的電子系統(tǒng)中,液晶屏是理想的輸出設(shè)備。而FPGA則因為其獨特的硬件結(jié)構(gòu),如果用RTL電路來驅(qū)動彩色液晶屏來顯示一定的數(shù)據(jù),勢必是非常不劃算的選擇,而且驅(qū)動也極為復(fù)雜。數(shù)碼管作為一種能夠直觀顯示一定數(shù)據(jù)信息的輸出設(shè)備,具有驅(qū)動簡單,顯示直觀的特點,尤其適合作為FPGA系統(tǒng)的輸出設(shè)備。本節(jié),小梅哥就將和大家一起進(jìn)行數(shù)碼管驅(qū)動的開發(fā)。
         
一、       實驗?zāi)康?/font>
實現(xiàn)67段數(shù)碼管的驅(qū)動,待顯示數(shù)據(jù)以BCD格式輸入。數(shù)碼管刷新時鐘為1KHz。實驗使用了4個獨立按鍵作為輸入,通過按鍵來改變需要數(shù)碼管顯示的數(shù)據(jù),以驗證數(shù)碼管驅(qū)動的正確性,同時也可檢驗獨立按鍵消抖模塊的可靠性。
二、       實驗原理
數(shù)碼管所謂的動態(tài)掃描,就是利用人眼的視覺暫留特性,在人眼能分辨的變化速度以外,快速分時的點亮各個數(shù)碼管對應(yīng)的段。因為分別點亮所有數(shù)碼管一次所用時間小于人眼的視覺暫留,因此,在人們眼里看來,這些數(shù)碼管都是同時持續(xù)點亮的,并不會有閃爍的感覺。


2-1 數(shù)碼管實物圖

關(guān)于數(shù)碼管的具體原理,請大家網(wǎng)上查閱,小梅哥一個人精力有限,沒辦法在這里從最低層的原理給大家一步一步講起,如果大家有不明白的,請自行百度。這里小梅哥就用最簡單粗暴的方式給大家簡單介紹一下。


2-2 數(shù)碼管簡單等效電路

上圖為37段數(shù)碼管的等效電路圖,在這個圖中,可以明顯的看到24個發(fā)光二極管被分為了三組,每一組的8發(fā)光二極管正極被接在了一起,通過一個三極管VCC相連。三極管的基極連接到了FPGAIO上,因此,只需要FPGA對應(yīng)的IO上給出低電平,三極管便會導(dǎo)通。而三組LED中所有的相同編號的LED的負(fù)極被連接在了一起,并接到了FPGAIO上。如果我們希望將最左邊一組的led0led5led7三個編號的led燈點亮,其它led不亮,則只需要給Q0的基極(sel0)連接上低電平,并將led0led5led7的負(fù)極(afh)連接上低電平,其它所有端口都輸出高電平,則最左邊一組的對應(yīng)的三個led燈就會被點亮,而其它led則會處于熄滅狀態(tài)。
假如我們需要在三秒時間內(nèi),完成以下三次操作:第一次操作,點亮最左邊一組led燈的led0led5led7;第二次操作,點亮中間一組led燈的led1led2led3;第三次操作,點亮最右邊一組led燈的led2led4led6;那么我們只需要按照如下表格中列出的真值表操作即可:


按照以上表格,我們就能知道該如何操作了,只需要在不同的時間給各個IO不同的電平,便能實現(xiàn)我們想要的亮滅組合。以上我們是以1秒為單位進(jìn)行led組的切換的,假如我們將切換速度加快,變?yōu)?font face="Calibri">1毫秒一切換,會是什么情況呢?在1毫秒一切換的速度下,完成所有操作所需時間為3ms,遠(yuǎn)遠(yuǎn)超出了我們?nèi)搜鬯鼙孀R的變化速度范圍。如果我們讓以上三個操作永遠(yuǎn)循環(huán)的進(jìn)行下去,那么我們將看見三組led燈中,我們點亮的那幾個led是同時且一直處于亮著的狀態(tài)的,這便是動態(tài)掃描的原理,假如我們把每個led做成一個長條型的,并按照如下形狀擺放,便就是我們常見的數(shù)碼管了。


2-3 數(shù)碼管段分布

一、       硬件設(shè)計

2-2只是一個為了講述數(shù)碼管原理簡化了的電路模型,常見的數(shù)碼管電路結(jié)構(gòu)如下圖所示:



3-1 數(shù)碼管典型電路

         在這個圖中,共有6位數(shù)碼管,每個數(shù)碼管的正極被接在一個驅(qū)動三極管上,三極管的基極連接到三八譯碼器的Y端,則FPGA只需要三個引腳就可最多控制8個數(shù)碼管的位選。數(shù)碼管的段選在串接了470歐姆的電阻后與FPGAIO相連。這里470歐姆的電阻主要起到限流的作用,保證流過數(shù)碼管的電流在正常范圍內(nèi)。

一、       架構(gòu)設(shè)計

本實驗由總共四個模塊組成,分別為數(shù)碼管驅(qū)動模塊、獨立按鍵檢測模塊、控制模塊和頂層模塊,其架構(gòu)如下:



4-1 led實驗?zāi)K組織結(jié)構(gòu)圖

由圖可知本實驗有1個輸出端口,對應(yīng)驅(qū)動了38譯碼器的三個選擇端和數(shù)碼管的8個段選腳。6個輸入端口,對應(yīng)了4個獨立按鍵輸入和一個時鐘輸入以及一個復(fù)位輸入。詳細(xì)端口名及其意義如下



4-1 獨立按鍵檢測實驗端口說明

因為存在模塊間的連接,因此有部分內(nèi)部信號,下表為內(nèi)部信號的名稱和功能說明



4-2 獨立按鍵檢測實驗內(nèi)部信號說明



一、       代碼組織方式

         本實驗中,數(shù)碼管的驅(qū)動采用了組合邏輯譯碼的方式進(jìn)行,具體將在代碼解讀時講解。

實驗中還設(shè)計了一個控制器,該控制器主要通過讀取按鍵信息來改變待數(shù)碼管待顯示的數(shù)據(jù)內(nèi)容。

按鍵檢測部分使用前一節(jié)開發(fā)的獨立按鍵的驅(qū)動,因此這里不進(jìn)行過多的分析介紹。


二、       關(guān)鍵代碼解讀

因為數(shù)碼管屬于低速設(shè)備,其正常的掃描頻率為500~10KHz,掃描頻率太快,會導(dǎo)致系統(tǒng)功耗增加,顯示效果變暗。掃描頻率太慢,會有明顯的閃爍感。本實驗通過調(diào)試觀察,選擇以1KHz作為掃描頻率,實際顯示效果非常好。

因此本實驗首先就需要產(chǎn)生一個1KHz的掃描時鐘,該時鐘由系統(tǒng)時鐘分頻得到。產(chǎn)生1KHz掃描時鐘的代碼如下:
  • parameter system_clk = 50_000_000;
  • localparam cnt1_MAX = system_clk/1000/2-1;
  • //1KHz時鐘分頻計數(shù)器
  •         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;//翻轉(zhuǎn)掃描時鐘信號
  •         else ;


[color=rgb(51, 102, 153) !important]復(fù)制代碼

其中,定義了一個全局參數(shù)system_clk,該參數(shù)為Clk的頻率,不同的時鐘頻率,只需要更改該參數(shù),就可改變分頻計數(shù)器的最大計數(shù)值,以保證1KHz分頻的精準(zhǔn)性。
在驅(qū)動中,數(shù)碼管的位選以掃描時鐘的速率進(jìn)行切換,因為只有6位數(shù)碼管,因此當(dāng)位選計數(shù)到6-1后必須清零從頭開始計數(shù)。相關(guān)代碼如下:
//位選信號控制
         always@(posedgeclk_1K or negedge Rst_n)
         if(!Rst_n)sel_r<=3'd0;
         elseif(sel_r == 3'd5)
                   sel_r<=3'd0;
         else
                   sel_r<=sel_r+1'b1;


每個數(shù)碼管需要顯示的內(nèi)容都不相同,由Data中相應(yīng)的位指定,Data中各位與數(shù)碼管的位對應(yīng)關(guān)系如下:
因此需要從Data中將每個數(shù)碼管被選中時需要顯示的數(shù)據(jù)提取出來,提取數(shù)據(jù)的代碼如下所示:
  • //根據(jù)不同的數(shù)碼管位選擇不同的待顯示數(shù)據(jù)
  •         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

[color=rgb(51, 102, 153) !important]復(fù)制代碼


因為提取出來的數(shù)據(jù)還是BCD碼的形式,還需要將BCD碼對應(yīng)的數(shù)據(jù)翻譯成為數(shù)碼管顯示對應(yīng)字符時應(yīng)該點亮或熄滅的對應(yīng)的LED的控制信號,因此必須還有一個BCD碼譯碼的過程,該過程代碼如下所示:
  • //數(shù)據(jù)譯碼,將待顯示數(shù)據(jù)翻譯為符合數(shù)碼管顯示的編碼
  •         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


[color=rgb(51, 102, 153) !important]復(fù)制代碼

最后,需要將位選和段選信號輸出:
         assignDig_Led_seg = seg_r;
         assignDig_Led_sel = sel_r;

控制部分相對簡單,只需要根據(jù)對應(yīng)的 按鍵信息,給待顯示的數(shù)據(jù)加上一個對應(yīng)的值,該部分代碼如下所示:
always @(posedge Clk or negedge Rst_n)
         if(!Rst_n)
                   Dig_Led_Data<= 24'd0;
         elseif(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;
                   endcase
         end


一、       測試平臺設(shè)計

本實驗主要對數(shù)碼管驅(qū)動引腳的狀態(tài)與預(yù)期進(jìn)行比較和分析,通過仿真,驗證設(shè)計的正確性和合理性。數(shù)碼管驅(qū)動模塊的testbench如下所示:

`timescale 1ns/1ns
module DIG_LED_DRIVE_tb;
         reg [23:0]data;
         reg clk;
         reg rst_n;
         wire [7:0]seg;
         wire [2:0]sel;
         
         DIG_LED_DRIVE DIG_LED_DRIVE_inst1(
                   .Data(data),
                   .Clk(clk),
                   .Rst_n(rst_n),
                   .Dig_Led_seg(seg),
                   .Dig_Led_sel(sel)
         );
         initial begin
                   data = 0;
                   clk = 1;
                   rst_n = 0;
                   #200;
                   rst_n = 1;
                   data = 24'h012345;
                   #10000;
                   data = 24'h518918;
                   #10000;
                   data = 24'h543210;
                   #10000;
                   $stop;      
         end
         
         always #10 clk = ~clk;
endmodule


每隔一段時間,更換數(shù)碼管的Data輸入數(shù)據(jù),觀察數(shù)碼管的輸出是否正確。


一、       仿真分析



如有任何疑問,歡迎加入芯航線FPGA學(xué)習(xí)支持群(472607506)進(jìn)行討論
本文地址:http://m.qingdxww.cn/thread-165251-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Chiptorials ——使用ATECC608 TrustFLEX實現(xiàn)基本非對稱身份驗證
  • 無線充電基礎(chǔ)知識及應(yīng)用培訓(xùn)教程
  • Chiptorials——如何使用ATECC608 TrustFLEX實現(xiàn)公鑰輪換
  • FPGA設(shè)計流程培訓(xùn)教程
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本久久中文字幕 | 国产成人av在线 | 日韩一级片在线免费观看 | 99热国产在线观看 | 大蕉久久伊人中文字幕 | 欧美成人观看视频在线 | 特级做a爰片毛片免费看 | 亚洲毛片免费在线观看 | 污视频导航 | 网www天堂资源在线 王者荣耀之白丝玉足榨精 王茜麻豆 | 男女男在线精品网站免费观看 | 色香视频在线 | 敢死队4免费播放完整版 | 精品国产香蕉在线播出 | 毛片视频在线免费观看 | 高清视频 一区二区三区四区 | 91视频中文 | 一级毛片视频在线观看 | 青青青免费在线视频 | 亚洲视频免费在线观看 | 久久久精品免费观看 | 韩国成人毛片aaa黄 韩国本免费一级毛片免费 韩国r天堂 | 天天在线免费视频 | 日韩天堂视频 | 国产成人禁片免费观看 | www.亚洲黄色 | 2022国产精品福利在线观看 | 美女视频永久黄网站免费观看国产 | 国内精品卡一卡二卡三 | 四虎影院一区二区 | 青青草国产成人久久91网 | 久热国产vs视频在线观看 | 老司机导航福利 | 中文精品视频一区二区在线观看 | h网站在线看 | 青青热久久国产久精品秒播 | 香蕉蕉亚亚洲aav综合 | 国产福利一区二区三区在线观看 | 日韩日韩日韩日韩日韩 | 日韩在线视频免费不卡一区 | 九九热免费视频 |