基於NiosⅡ軟核處理器的七段數碼管動態顯示

2020-12-19 電子產品世界

SOPC(System On Programmable Chip)技術是美國Altera公司於2000年最早提出的,並同時推出了相應的開發軟體Quartus II。SOPC是基於FPGA解決方案的SOC(System On Chip),構成SOPC的方案也有多種。第一種是基於FPGA嵌入IP硬核的SOPC系統,即在FPGA中事先植入嵌入式系統處理器,目前最常用的嵌入式處理器大多採用了含有ARM的32位智慧財產權處理器核的器件。第二種是基於FPGA嵌入IP軟核的SOPC系統,目前最有代表性的軟核處理器分別是Altera公司的Nios II核,以及Xilinx公司的MicroBlaze核。第三種是基於HardCopy技術的SOPC系統,HardCopy就是利用原有的FPGA開發工具,將成功實現於FPGA器件上的SOPC系統通過特定的技術直接向ASIC轉化。

1 基於Altera公司NiosⅡ軟核處理器的SOPC系統

Altera公司Nios II軟核是目前使用最為廣泛的一種軟核處理器。值得一提的是,利用Matlab和Altera公司的DSP Builder,用戶可以為Nios II軟核處理器設計各類DSP硬體加速器,並以指令的方式加入Nios II的指令集,從而可以構建自己的DSP處理器系統。

1.1 基於NiosⅡ軟核處理器的SOPC系統結構

如圖1所示的一個基本的基於NiosⅡ軟核的SOPC系統,除NiosⅡ核、定時器和片上存儲器以外,還需要在FPGA器件中添加一些接口元件。這些元件一方面通過片上的Avolon總線與NiosⅡ軟核相連,另外一方面又提供了外設與NiosⅡ軟核通信的接口界面。

Altera公司QuartusⅡ軟體中的SOPC Builder工具提供了許多常用的外設接口元件,如UART接口元件、PIO接口元件等,通過這些接口元件可以連接諸如RS232、LED、數碼管和按鍵等輸入輸出設備。在相對複雜的系統設計當中,還可以通過Avalon三態總線橋外接大容最的SRAM和FLASH,以提供更大的程序和數據存儲空間。從圖1中,還可以注意到,通過使用系統提供的用戶自定製外設接口元件的功能,用戶可以在系統中添加一個符合Avalon總線規範的外設接口元件,以連接用戶特定功能的外部設備。

1.2 自定製Avalon用戶外設接口元件簡介

對於自定製的Avalon外設接口元件按照Avalon總線操作的不同可以分為兩類:Avalon Slave外設接口元件型的自定製的Avalon Slave外設接口元件框圖。從圖2中可以看到寄存器的定義是自定製外設接口元件很重要的一部分,必須根據設計的需要確定寄存器的個數和種類。圖2中的Avalon Slave接口提供了自定製外設接口元件與NiosⅡ處理器之間數據交換的界面,其接口信號類型也必須根據設計的需要合理地進行選擇。常用的Avalon Slave接口信號類型有:clk,chipselect,address,write,writedata,byteenable,reset等。圖2中的任務邏輯具體說明了自定製外設接口的功能,並給出了與外設連接的接口信號。

自定製Avalon Slave外設接口元件的方法:可以利用SOPC Builder提供的元件編輯器在圖形用戶界面下將用硬體描述語言(Verilog或VHDL)描述的用戶邏輯封裝成一個SOPC Builder元件。相應的硬體描述語言文件給出了自定製外設接口元件的內部寄存器結構,使用到的Avalon Slave接口信號和自定製外設接口的邏輯功能。一旦定製成功後,用戶自定製的外設接口就可以象SOPCBuilder中其他元件一樣被調用。

2 基於NiosⅡ軟核處理器的七段數碼管動態顯示設計

數字系統設計中,用數碼管顯示數據結果是常用的一種方法。利用Altera的SOPC Builder工具進行Nios Ⅱ系統設計時,並沒有提供專門的數碼管顯示接口元件,但可以使用PIO元件驅動數碼管顯示,不足之處是佔用器件引腳數目過多。本文當中以自定製Avalon Slave外設接口元件的方式,給出了一種基於NiosⅡ軟核的七段數碼管動態顯示設計方案。該設計可以用來驅動1~8個共陰極(或共陽極)數碼管的顯示,可以根據需要選擇小數點顯示的位置,每個數碼管可以顯示0~F之間的十六進位字符。

圖3為自定製的數碼管動態顯示接口元件邏輯結構圖,其中定義了2個寄存器display_data_reg和controlreg。display_data_reg是個一個32位二進位的數據寄存器,其數據每4位可以解碼得到1個數碼管的七段顯示所需的字符碼,因此,display_data_reg同時最多可以給出8個數碼管所需要的顯示數據。control_reg是一個8位二進位的控制寄存器,但只定義了0~2位和第4位的含義。0~2位的數據給出了小數點顯示的位置,數值範圍在「000」~「111」之間,對應著8個數碼管最低位到最高位的小數點的位置。第4位是數碼管顯示的啟動停止位,當該數據位為1時,可使自定製接口元件所驅動的數碼管正常顯示結果;當該數據位為0時,停止顯示,所有被驅動的數碼管熄滅。

參數n定義了循環加法計數器的模數,同時也決定了驅動數碼管顯示的個數,其取值範圍在1~8之間。clkdisplay是循環加法計數器的時鐘輸入,他決定了計數器的計數頻率,同時也決定了數碼管顯示的動態掃描頻率。參數pos用於決定驅動數碼管的類型,其值可設定為0或1。當其值為0時,seg_out字符碼輸出高電平有效,bit_control數碼管位選控制輸出低電平有效,此時輸出結果用於驅動共陰極數碼管顯示;當pos值為1時,seg_out字符碼輸出低電平有效,bit_control數碼管位選控制輸出高電平有效,此時輸出結果用於驅動共陽極數碼管顯示。

seg_out為自定製元件的字符碼輸出,用於驅動數碼管顯示(包括小數點位)。其中,最高一位seg_out[7]用於驅動對應數碼管的小數點顯示,低7位seg_out[6..0]用於驅動數碼管的七段寧符顯示。圖3中數碼管七段解碼器根據循環加法計數器的當前狀態值,從display_data_reg寄存器中選擇4位二進位數據進行解碼。例如,當前驅動的數碼管的個數為5個(即n=5),循環加法計數器的當前狀態值用count表示,則count在0~4範圍內變化;若計數器的當前狀態值count為2,則選擇寄存器display_data_reg[11..8]的4位二進位數據進行解碼,若計數器的當前狀態值count為3,則選擇寄存器display_data_reg[15..12]的4位二進位數據進行解碼,即總是選擇寄存器display_data_reg[(count+1)×4-1..count×4]的4位二進位數據進行解碼。寄存器control_reg的低3位指明了小數點顯示的位置,如control_reg[2..0]的值為「000」,則第0位數碼管的小數點點亮,若control_reg[2..0]的值為「010」,則第2位數碼管的小數點點亮。因為,循環計數器的狀態值count反應了數碼管動態顯示過程中當前數碼管顯示的位皆,因此,數碼管小數點解碼器只要比較control_reg[2..0]與count的值,若兩者相等,seg_out[7]輸山有效值(共陰極輸出為高電平,共陽極輸出為低電平)即可驅動對應數碼管的小數點點亮。

bit_control為自定製元件的位選控制輸出,其數據寬度為n位二進位,與要驅動的數碼管的個數是一致的。上面已經提到,循環加法計數器的狀態值count反應了當前數碼管顯示的位置。因此,只要根據count的值,使得bit_control對應位輸出有效值即可。例如,n取值為5,pos取值為0(即驅動共陰極數碼管),若計數器的當前狀態值count為2,則bit_control的輸出結果為「11011」,若count為4,則bit_control的輸出結果為「01111」。

自定製元件的設計採用的是VHDL語言,其實體描述如下面程序所示:

從上面的程序可以看到:n和pos定義成了類屬變量,當完成接口元件的定製以後,類屬變量在自定製元件的設置窗口中將以用戶參數的形式出現,如圖4所示,用戶可以設置其值。

實體描述當中除定義了自定製元件與外部設備的接口信號clk_display,seg7_out,bit_control信號以外,還定義了 Avalon Slave接口信號,NiosⅡ軟核通過這些信號訪問自定製元件中定義的寄存器。前面介紹的兩個寄存器display_data_reg和control_reg是在程序的結構體說明部分定義的,具體語句如下:

signal display_data_reg:std_logic_vector(31downto 0);
signal control_reg:std_logic_vector(7 downto 0);

結構體中還完成了所定義的兩個寄存器的數據寫入操作。圖3中所示的模n循環加法計數器、七段解碼器、小數點解碼器和位解碼器也在結構體中按上面所介紹的功能設計完成。

3 實驗結果

為了驗證用於驅動七段數碼管動態顯示的自定製元件功能,實驗中使用SOPC Builder建立了一個最簡單的NiosⅡ系統。該NiosⅡ系統添加了3個元件,名稱為cpu_0的NiosⅡ軟核處理器;名稱為seg7的自定製元件,用於完成數碼管的顯示驅動;名稱為onchip_RAM的片上隨機存儲器,存放調試時的程序代碼以及用作程序運行空間。生成的NiosⅡ系統的圖形符號如圖5所示,clk是系統工作時鐘輸入;reset_n是系統復位輸入,低電平有效;clk_display_to_the_seg7是數碼管掃描時鐘輸入,他決定了數碼管動態顯示的掃描速度;bit_control_from_the_seg7是位選控制輸出,決定了動態過程中哪一個數碼進行顯示;seg7_out_from_the_seg7是數碼管顯示數據輸出,決定了數碼管顯示的內容。

新建頂層原理圖,調用該NiosⅡ系統,為其添加輸入輸出引腳,並定義引腳號,選擇目標器件型號為EP1C6Q240C8,編譯生成配置文件,並通過下載電纜下載到目標器件中。接下來利用NiosⅡIDE建立用戶程序。

實驗建立NiosⅡ系統時,添加驅動七段數碼管顯示的自定製元件seg7時的參數n和pos(如圖4所示)設置成了兩種測試情況,分別用來驗證其驅動共陰極和共陽極數碼管顯示的情況。第一種測試情況將n設置成7,pos設置成0,用來驅動7個共陰極數碼管顯示。NiosⅡIDE建立的用戶測試程序如下:

程序編譯通過後,可以在硬體中調試運行程序。為了便於觀察測試結果,在ModelSim中運行仿真結果,得到仿真波形如圖6所示。仿真分析時系統工作時鐘(clk)設置為了50 MHz,數碼管動態顯示掃描頻率(clk_display)設置為1 kHz。圖6(a)給出了寄存器內容的寫入過程,3個write高電平期間完成了 3次寄存器的寫入操作。第一次write高電平將0x00寫入address為1的寄存器(即控制寄存器,該定義是在自定製元件的硬體描述語言設計中完成的);第二次write高電平將0xAF05163寫入address為0的寄存器(即數據寄存器);第三次write高電平將0x13又寫入address為1的控制寄存器。當控制寄存器的內容為0x00時,數碼管是停止顯示的,因此,在共陰極顯示的情況下bit_control的輸出全為高電平,直到控制寄存器的內容寫入0x13後,bit_control才有輸出為低電平的情況(如圖6所示)。圖6(b)給出了寫入寄存器內容以後的工作情況,當數據寄存器寫入0xAF05163、控制寄存器寫入0x13後,bit_control將從1111110到0111111循環變化,同時將數碼管顯示所需要的字符碼從seg7_out輸出。如當bit_control為1111110時,seg7_out輸出字符碼為0x4F,對應顯示「3」;當bit_control為1111101時,seg7_out輸出字符碼為0x7D,對應顯示「6」。由於控制寄存器寫入的內容為0x13,即第三位數據管的小數點會亮起,因此當bit_control為1110111時,seg7_out輸出字符碼為0xED(即二進位的「11101101」),數碼管對應顯示「5」,而最高一位的「1」會讓該數碼管的小數點點亮。

以上是第一種測試情況。第二種測試情況是將seg7的參數n設置成5,pos設置成1,用來驅動5個共陽極數碼管顯示。NiosⅡ IDE建立的用戶測試程序如下:

程序編譯通過後,同樣在Modelsim中運行仿真結果,得到仿真波形如罔7所示。仿真分析時系統工作時鐘(clk)設置為了50 MHz,數碼管動態顯示掃描頻率(clkdisplay)設置為1 kHz。

與第一種共陰極顯示情況相比,第二種共陽極顯示時的寄存器寫入過程是大體一樣的。不同之處在於共陽極顯示時的bit_control和seg7_out和輸出極性正好與共陰極顯示時的相反。

通過以上的實驗,驗證了自定製七段數碼管動態顯示接口元件功能的正確性。

4 結 語

在用Altera公司的SOPC Builder工具完成NiosⅡ軟核SOPC系統設計時,可以用SOPC Builder中提供的元件來構建整個系統。但對於有些外部設備,SOPC Builder並沒有提供對應的接口元件,此時,就可以使用SOPC Build-er工具的自定製用戶元件功能來創建特定功能的接口元件。在本文中,針對數碼管的顯示,定製了一個七段數碼管動態顯示接口元件,可以用來驅動1~8個共陰極(或共陽極)數碼管的顯示,可以根據需要選擇小數點顯示的位置,每個數碼管可以顯示0~F之間的十六進位字符,並通過實驗驗證了其功能的正確性。

相關焦點

  • 基於Nios II軟核的多核處理器系統的設計與實現
    摘要:本文設計了一個基於FPGA解決方案的多核處理器系統,整體上提高了系統性能,解決了單核處理能力提升受到的制約。
  • LEON3開源軟核處理器動態圖像邊緣檢測SoC設計
    實現了多路數據並行處理和DSP模塊加速處理,配合CPU軟核的協調參數配置功能,可以充分發揮硬體設計的高速性和靈活性。此外,由於動態圖像邊緣檢測是圖像處理應用中必不可少的一部分,因此文中設計的動態圖像邊緣檢測SoC可以方便的移植到其他圖像處理應用中,具有廣泛的應用前景。
  • 8段數碼管引腳圖,8段數碼管動態顯示詳解
    打開APP 8段數碼管引腳圖,8段數碼管動態顯示詳解 發表於 2016-09-13 18:12:25   數碼管按段數可分為七段數碼管和8段數碼管,八段數碼管比七段數碼管多一個發光二極體單元,也就是多一個小數點(DP)這個小數點可以更精確的表示數碼管想要顯示的內容;按能顯示多少個(8)可分為1位、2位、3位、4位、5位、6位、7位等數碼管。   按發光二極體單元連接方式可分為共陽極數碼管和共陰極數碼管。
  • 基於LEON3處理器動態圖像邊緣檢測的SoC設計
    摘要:針對LEON3開源軟核處理器具有高性能,高可靠性等特徵,構建了一個基於LEON3的動態圖像邊緣檢測SoC。文中採用局部熵邊緣檢測算法,將圖像採集,邊緣檢測和圖像顯示三個部分封裝設計為IP核,通過APB總線嵌入到LEON3的經典SoC架構中。與利用微控制器或DSP實現的動態圖像邊緣檢測系統相比.基於LEON3的動態圖像邊緣檢測SoC能夠充分發揮硬體設計的高速性和靈活性,並且系統具有很好的可移植性與可配置性,佔用資源少,速度快,具有良好的應用前景。
  • 數碼管的靜態與動態顯示技術分析
    數碼管是單片機系統中經常用到的顯示器件, 從內部結構上可以分為共陰極和共陽極數碼管。對不同的數碼管,電路的接法也不一樣。圖1A為數碼管的結構圖。以共陽極數碼管為例, 要想點亮某段, 只需要在相應的段上給低電平即可。圖1B為共陽極數碼管段碼分布, 以及一個顯示的實例。
  • 七段LED數碼管結構
    七段LED數碼管的驅動電路(a) BCD 七段解碼法 (b) 軟體解碼法多位七段LED>數碼顯示器結構利用人的視覺延遲的特點,採用掃描的方式驅動多位七段LED數碼管,節省驅動電路,降低功耗。保證一定的掃描循環頻率,得到較好的顯示質量。各位七段LED數碼管公用一個段驅動器、一個段碼鎖存器,為段驅動器提供邏輯輸入。每位七段LED數碼管的公共端連接一個位驅動器,控制各位數碼管的點燃。位驅動器由一個位碼鎖存器提供輸入邏輯電平。顯示器在系統中佔用兩個埠號:段碼口與位碼口。
  • 基於PIC16F877的四位數碼管動態顯示PROTEUS仿真
    本文引用地址:http://www.eepw.com.cn/article/201807/384748.htm本文為基於PIC16F877的四位數碼管動態顯示PROTEUS仿真。源程序代碼說明;*********************************************;** 文件名:four_led.asm **;** 功 能:四位數碼管動態顯示1234 **;*********************************************LIST P=16F877
  • proteus仿真之8位數碼管動態掃描顯示試驗
    /*Proteus 仿真之8位共陰數碼管動態掃描實驗*/程序:/*Proteus 仿真之8位共陰數碼管動態掃描實驗*/#include#define SegPortP0   //定義數碼管連接埠sbit LE_Duan = P2^0;   //定義573鎖存使能埠 段鎖存sbit LE_Wei = P2^1;   //定義573鎖存使能埠 位鎖存unsigned char code Seg_Duan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  • 德武的Python學習筆記(八):七段數碼管
    當數碼管顯示出設想的數字時,激動之情溢於言表。言歸正傳,今天主要是通過python繪製7段數碼管的實例,學習一些關於函數的定義和使用。目標:在計算機上,實現自動獲取當前系統日期,用數碼管的形式繪製出來。如何實現呢,首先繪圖肯定要用到turtle庫,另外獲取時間會用到time庫。
  • 數碼管顯示數字 5 C語言程序設計
    推薦閱讀 C51單片機數碼管動態顯示 數碼管作為最廉價的輸出設備,在各種自動化設備中有很大的應用,最簡單普通的顯示方式為動態刷新顯示,稱為假動態顯示,即通過分時掃描每一位,利於人眼的視覺停留現象,造成一種靜態顯示的效果,如下圖所示:C51單片機由於運行速度很慢
  • 詳解led數碼管的接口編程技術
    由此可見,按照數字的筆畫排列,則很容易得到10 個數字0~9 共10 個顯示字符,七段共陽數碼管10 個數欄位碼錶詳見表4.2。 表4.2 七段共陽極數碼管段碼錶 至此已經實現了0~9 的循環顯示,能否循環顯示0~99 呢?這就是下面將要介紹的數碼管動態掃描顯示。
  • 基於VHDL和QuartusⅡ的數字電子鐘設計與實現
    1 數字鐘的設計方案本文以FPGA平臺為基礎,採用VHDL語言在QuartusⅡ開發環境下設計開發多功能數字鐘,具有計時、校時、蜂鳴鬧鈴的功能,具體功能為:1)能夠對秒、分、小時進行正常計時,每日按24小時計時制,能用八個七段數碼管進行友好界面的顯示;2)具有復位功能,可以對當前時間進行清零;3)能夠對電子時鐘進行時分秒設置,方便在時鐘跑錯時進行校正;4
  • 74ls595應用電路圖大全(五款74ls595驅動數碼管/計時顯示/超聲波...
    打開APP 74ls595應用電路圖大全(五款74ls595驅動數碼管/計時顯示/超聲波測距儀電路) 發表於 2018-04-28 11:32:04
  • 基於三八解碼器控制八個數碼管同時顯示內容的問題
    ,那麼我們怎麼樣才能夠讓這八個數碼管同時工作,讓我們看上去八個IO口顯示不同的內容呢?我的開發板是P0低三位(38數碼管的輸入埠)口控制數碼管的位選的,八個輸出口分別控制八個數碼管工作的。P1,#00111111B;顯示 0CALL DELAY;短暫的延時MOV P0,#00000001B;根據三八解碼器真值表的原理控制第二數碼管工作MOV P1,#00000110B;顯示 1CALL DELAY;短暫的延時MOV P0,#00000010B;根據三八解碼器真值表的原理控制第三數碼管工作MOV P1,#01011011B
  • 通過38解碼器控制數碼管顯示數字
    今天終於把38數碼器控制原理及編程序搞得一點點了,之前因為是P0^1,2,3三個口控制數碼管的位操作,一直搞不懂其原理,呵呵,看了下PDF文檔,以及編程實例,總算明白一點點了,剛剛編成了一連串的數字
  • 上海連續真空包裝機的七段解碼器和數碼顯示器
    上海連續真空包裝機的七段解碼器和數碼顯示器;隨著科技的發展,機械設備也在不斷的進步,真空包裝機由以前的需要手工包裝、計算數碼,發展到目前的可以採用機械代替傳統的手工包裝;目前包裝機械中較受歡迎、性價比高的設備則是全自動真空包裝機
  • 數碼管顯示矩陣鍵盤掃描值
    /*矩陣鍵盤掃描出鍵值,在數碼管上顯示出來 P0口接數碼管的段選碼,P2口通過反相器接數 管的位選碼*/ #includereg52.h> //所用的器件是AT89S52 #define uchar unsigned char void delayms(uchar j); //聲明延時函數 uchar getkey(void); //聲明掃描函數 void
  • 74ls273應用電路圖大全(七款74ls273串行顯示/共陽LED數碼顯示/...
    打開APP 74ls273應用電路圖大全(七款74ls273串行顯示/共陽LED數碼顯示/埠擴展電路) 發表於 2018-04-28 08:35:01
  • 基於AT89C51單片機的十進位計算器系統設計
    顯示採用4 位7 段共陽極LED 動態顯示。軟體方面從分析計算器功能、流程圖設計,再到程序的編寫進行系統設計。  引言  本系統採用AT89C51 單片機作為控制器,用來實現實現四位數的「+」,「-」,「*」,「/」運算,運算結果通過數碼管顯示,並具有有清零功能。
  • 簡單共陰極數碼管電路圖大全
    圖中的8個LED分別與上面那個圖中的A~DP各段相對應,通過控制各個LED的亮滅來顯示數字。簡單共陰極數碼管電路圖(一)CD4511是一片CMOSBCD—鎖存/7段解碼/驅動器,用於驅動共陰極LED(數碼管)顯示器的BCD碼—七段碼解碼器。它具有BCD轉換、消隱和鎖存控制、七段解碼及驅動功能的CMOS電路能提供較大的拉電流。可直接驅動共陰LED數碼管。以下是cd4511數碼管驅動原理圖。