李強(qiáng) 房雅文 黃蕾 李雪 王世龍 陳初俠
關(guān)鍵詞:簡易計算器;FPGA;Verilog HDL;Quartus II
中圖分類號:TP29 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2024)03-0046-04
0 引言
計算器作為一種簡單而實用的計算工具,在日常生活中被廣泛使用,如今市場上的計算器種類豐富且功能多樣,但功能過多的計算器價格昂貴且大多數(shù)功能可能還用不上,所以設(shè)計一款簡單而實用的計算器具有較好的現(xiàn)實意義[1]。本文基于Quartus II 13.1軟件和Verilog HDL語言設(shè)計了一款簡易計算器,主控芯片采用Altera公司Cyclone Ⅳ E系列的FPGA芯片EP4CE6E22C8[2]。所設(shè)計的簡易計算器具有加減乘除四則運(yùn)算功能,輸入的兩個操作數(shù)采用撥碼開關(guān)來實現(xiàn),輸出結(jié)果用數(shù)碼管進(jìn)行顯示。
1 簡易計算器設(shè)計要求
簡易計算器設(shè)計要求如下:
1) 能實現(xiàn)操作數(shù)0至15的加減乘除四則運(yùn)算。
2) 具有復(fù)位功能,當(dāng)復(fù)位時運(yùn)算結(jié)果為0。
3) 輸入數(shù)據(jù)用四位二進(jìn)制表示,通過8個撥碼開關(guān)來實現(xiàn)。
4) 輸入數(shù)據(jù)和計算結(jié)果采用8個共陽極八段數(shù)碼管顯示。
5) 四則運(yùn)算的選擇通過4個獨(dú)立按鍵來實現(xiàn)。
6) 具有LED點(diǎn)亮功能,當(dāng)選擇不同的運(yùn)算時會有與之對應(yīng)的LED燈被點(diǎn)亮。
7) 減法運(yùn)算時,若被減數(shù)小于減數(shù),運(yùn)算結(jié)果能顯示負(fù)號“-”。
8) 除法運(yùn)算時,運(yùn)算結(jié)果要保留一位小數(shù),當(dāng)除數(shù)為零時,顯示的運(yùn)算結(jié)果為“EE.E”。
2 簡易計算器設(shè)計方案
簡易計算器設(shè)計框圖如圖1所示,根據(jù)設(shè)計要求,簡易計算器電路分為六部分,分別是分頻、運(yùn)算、選擇控制、數(shù)據(jù)選擇、碼制轉(zhuǎn)換和顯示。分頻是將高頻率的系統(tǒng)時鐘50MHz轉(zhuǎn)為用于數(shù)碼管動態(tài)掃描的較低頻率時鐘10KHz;運(yùn)算包括加減乘除運(yùn)算四個模塊,實現(xiàn)四則運(yùn)算功能;選擇控制用于選擇不同的獨(dú)立按鍵實現(xiàn)加減乘除四種運(yùn)算操作;數(shù)據(jù)選擇包括三選一和二選一數(shù)據(jù)選擇模塊,三選一數(shù)據(jù)選擇模塊實現(xiàn)對加法、減法、乘法運(yùn)算結(jié)果的選擇,二選一數(shù)據(jù)選擇模塊實現(xiàn)除法運(yùn)算結(jié)果和加減乘運(yùn)算結(jié)果的選擇;碼制轉(zhuǎn)換是把加減乘運(yùn)算結(jié)果的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為8421BCD碼,便于后面數(shù)碼管的顯示;顯示包含數(shù)碼管的位選、段選和LED顯示,用于展示運(yùn)算結(jié)果。
3 簡易計算器設(shè)計本設(shè)計
采用層次化的設(shè)計方法,即先設(shè)計底層電路再設(shè)計頂層電路。底層電路用Verilog HDL語言來實現(xiàn),頂層電路通過調(diào)用底層電路用原理圖方式來實現(xiàn)[3]。
3.1 底層電路設(shè)計
底層電路有11個模塊,分別是5000分頻模塊、加法模塊、減法模塊、乘法模塊、除法模塊、加減乘除選擇控制模塊、三選一數(shù)據(jù)選擇模塊、二選一數(shù)據(jù)選擇模塊、二進(jìn)制轉(zhuǎn)8421BCD碼模塊、數(shù)碼管位選模塊和數(shù)碼管段選及LED燈顯示模塊。下面對它們進(jìn)行分別介紹。
3.1.1 5000分頻模塊
5000 分頻模塊是實現(xiàn)50MHz 系統(tǒng)時鐘分頻為10KHz時鐘,用于數(shù)碼管的動態(tài)掃描[4]。圖2為5000 分頻模塊仿真波形圖,從圖2(a)可以看出,對于輸入時鐘clk50MHz,每來一個上升沿就計數(shù)一次,當(dāng)計到2499時,輸出時鐘clk10KHz進(jìn)行翻轉(zhuǎn)。也就是說計數(shù)5000次,輸出時鐘有一半是低電平有一半是高電平,實現(xiàn)了1 比1 的5000 分頻時鐘信號,如圖2(b) 所示。
3.1.2 加減乘除模塊
加減乘除模塊輸入的2個操作數(shù)為四位二進(jìn)制數(shù)據(jù),加減乘運(yùn)算輸出結(jié)果用八位二進(jìn)制數(shù)據(jù)表示,除法運(yùn)算輸出結(jié)果用12位8421BCD碼顯示。圖3為加減乘除模塊的仿真波形圖,輸入數(shù)據(jù)都設(shè)為無符號十進(jìn)制數(shù),輸出結(jié)果加法和減法設(shè)為有符號十進(jìn)制數(shù)、乘法設(shè)為無符號十進(jìn)制數(shù),除法設(shè)為十六進(jìn)制數(shù)。由圖3(a)(b)(c)可以看出,加法運(yùn)算、減法運(yùn)算、乘法運(yùn)算,運(yùn)算結(jié)果均正確。對于除法運(yùn)算,當(dāng)除數(shù)為0時,運(yùn)算結(jié)果為無窮大,結(jié)果顯示為EEE;當(dāng)除數(shù)不為0時,運(yùn)算結(jié)果保留到小數(shù)點(diǎn)后一位,例如13除以4,運(yùn)算結(jié)果為3.3,顯示值用033表示。
3.1.3 加減乘除選擇控制模塊
加減乘除選擇控制模塊通過選擇不同的獨(dú)立按鍵,使輸入的兩個操作數(shù)進(jìn)行對應(yīng)的四則運(yùn)算,在無獨(dú)立按鍵按下時,默認(rèn)輸出為加法運(yùn)算結(jié)果。圖4為加減乘除選擇控制模塊仿真波形圖,輸入信號s0、s1、s2、s3代表四個獨(dú)立按鍵,輸出信號m為加減乘除運(yùn)算控制信號,當(dāng)m 為“1000”時代表加法運(yùn)算,為“0100”時代表減法運(yùn)算,為“0010”時代表乘法運(yùn)算,為“0001”時為除法運(yùn)算。因為獨(dú)立按鍵正常情況是彈起狀態(tài),所以彈起時用高電平表示,按下用低電平表示??梢钥闯觯?dāng)s0、s1、s2、s3分別為X、1、1、1時(X 代表0或1) ,m為“1000”;當(dāng)s0、s1、s2、s3分別為1、0、1、1時,m為“0100”;當(dāng)s0、s1、s2、s3分別為1、1、0、1 時,m為“0010”;當(dāng)s0、s1、s2、s3分別為1、1、1、0時,m 為“0001”。
3.1.4 三選一數(shù)據(jù)選擇模塊
三選一數(shù)據(jù)選擇模塊是在選擇控制信號m的驅(qū)動下,對加減乘三種運(yùn)算的結(jié)果進(jìn)行選擇輸出,輸入信號有加法運(yùn)算結(jié)果he、減法運(yùn)算結(jié)果cha、乘法運(yùn)算結(jié)果chengji、選擇控制信號m;輸出信號為out,它的數(shù)值為he、cha、chengji中的一個。圖5為三選一數(shù)據(jù)選擇模塊仿真波形圖,可以看出,當(dāng)m為“1000”時,out 的數(shù)值和he相同;當(dāng)m為“0100”時,out的數(shù)值和cha 相同;當(dāng)m為“0010”時,out的數(shù)值和chengji相同。
3.1.5 二選一數(shù)據(jù)選擇模塊
二選一數(shù)據(jù)選擇模塊是在控制信號m的作用下,從二進(jìn)制轉(zhuǎn)8421BCD碼模塊輸出信號out_bcd和除法結(jié)果shang中選一個進(jìn)行輸出。輸入信號有8421BCD 碼out_bcd、除法運(yùn)算結(jié)果shang、選擇控制信號m;輸出信號為運(yùn)算結(jié)果jieguo。當(dāng)m為“0000”或“1000”或“0100”或“0010”時,jieguo為out_bcd的數(shù)值;當(dāng)m為“0001”時,jieguo為shang的數(shù)值。
3.1.6 二進(jìn)制轉(zhuǎn)8421BCD 碼模塊
二進(jìn)制轉(zhuǎn)8421BCD 碼模塊是利用二進(jìn)制數(shù)轉(zhuǎn)8421BCD碼原理[5],將四位二進(jìn)制輸入信號轉(zhuǎn)為八位BCD碼,將八位二進(jìn)制輸入信號轉(zhuǎn)為十二位BCD碼數(shù)。輸入信號有操作數(shù)a和b、加減乘運(yùn)算結(jié)果out;輸出信號有8421BCD 碼a_bcd、b_bcd 和out_bcd。圖6 為二進(jìn)制轉(zhuǎn)8421BCD碼模塊仿真波形圖,可以看出,輸入的a、b、out二進(jìn)制數(shù)據(jù)經(jīng)過轉(zhuǎn)換后得到的BCD碼正確。例如當(dāng)b為二進(jìn)制數(shù)據(jù)“1111”時,其十進(jìn)制數(shù)為15,BCD碼為“00010101”,與仿真結(jié)果一致;當(dāng)out 為二進(jìn)制數(shù)據(jù)“00110100”時,其十進(jìn)制數(shù)為52,BCD 碼為“000001010010”,與仿真結(jié)果一致。
3.1.7 數(shù)碼管位選模塊
數(shù)碼管位選模塊采用動態(tài)掃描的方式用八個數(shù)碼管來表示輸出,從左邊數(shù)起前面四個數(shù)碼管顯示操作數(shù)a和b,第五個數(shù)碼管顯示符號“=”,最后三個數(shù)碼管顯示運(yùn)算結(jié)果。輸入信號有動態(tài)掃描復(fù)位信號reset,掃描時鐘clk10KHZ,操作數(shù)a和b,8421BCD碼a_bcd、b_bcd、out_bcd,選擇控制信號m;輸出信號有位選控制信號sel和輸出數(shù)據(jù)dataout。
圖7 為數(shù)碼管位選模塊仿真波形圖,此時m 為“0100”,實現(xiàn)的是減法運(yùn)算。被減數(shù)a_bcd為十進(jìn)制數(shù)5(BCD碼為00000101) ,減數(shù)b_bcd為十進(jìn)制數(shù)3(BCD 碼為00000011) ,差out_bcd 為十進(jìn)制數(shù)2(BCD 碼為000000000010) 。理論上數(shù)碼管從左至右顯示應(yīng)為“0503=002”,即5減3等于2。因為數(shù)碼管顯示采用的是動態(tài)掃描的方式,所以每一時刻只有一個數(shù)碼管被點(diǎn)亮,例如當(dāng)sel為“10000000”時,表示最左邊的數(shù)碼管點(diǎn)亮;sel為“01000000”時,表示從左邊數(shù)起第二個數(shù)碼管點(diǎn)亮;sel為“00100000”時,表示第三個數(shù)碼管點(diǎn)亮等。
dataout為數(shù)碼管顯示的數(shù)值,可以看到,當(dāng)sel為“10000000”時,dataout 顯示的是第一個數(shù)碼管的值0;當(dāng)sel 為“01000000”時,dataout顯示的是第二個數(shù)碼管的值5;當(dāng)sel為“00100000”時,dataout顯示的是第三個數(shù)碼管的值0;當(dāng)sel 為“00010000”時,dataout顯示的是第四個數(shù)碼管的值3;當(dāng)sel為“00001000”時,dataout顯示的是第五個數(shù)碼管的值“=”(編碼用十進(jìn)制數(shù)10 表示);當(dāng)sel 為“00000100”時,dataout顯示的是第六個數(shù)碼管的值0;當(dāng)sel為“00000010”時,dataout顯示的是第七個數(shù)碼管的值0;當(dāng)sel 為“00000001”時,dataout顯示的是第八個數(shù)碼管的值2。這一仿真結(jié)果與理論數(shù)值一致。
3.1.8 數(shù)碼管段選及LED 燈顯示模塊
數(shù)碼管段選及LED燈顯示模塊中,輸入數(shù)據(jù)da?tain為數(shù)碼管顯示的數(shù)值,為了顯示除法運(yùn)算的結(jié)果(除法運(yùn)算結(jié)果帶小數(shù)點(diǎn)),輸入信號加入了數(shù)碼管位選信號sel和運(yùn)算控制信號m,輸出信號有數(shù)碼管段選信號seg和LED燈顯示信號led。
圖8為數(shù)碼管段選及LED燈顯示模塊仿真波形圖,輸入數(shù)據(jù)datain 為3,數(shù)碼管采用的是共陽極顯示,理論上顯示“3”時段選信號seg 輸出編碼為10110000,若顯示“3.”(帶小數(shù)點(diǎn))時則編碼為“00110000”。從仿真波形可以看出,當(dāng)m為加法運(yùn)算(1000) 、減法運(yùn)算(0100) 和乘法運(yùn)算(0010) 時,運(yùn)算結(jié)果都不會有小數(shù)點(diǎn),且seg輸出正確;當(dāng)m為減法運(yùn)算(0001) 時,只有倒數(shù)第二個數(shù)碼管顯示會帶小數(shù)點(diǎn),seg輸出結(jié)果與理論一致。另外,進(jìn)行加減乘除運(yùn)算時,led都有三個燈點(diǎn)亮,仿真結(jié)果與設(shè)想一致。
3.2 頂層電路設(shè)計
簡易計算器頂層電路是用原理圖設(shè)計方式進(jìn)行設(shè)計,通過調(diào)用已生成的各底層模塊元件符號,并將它們連接就可實現(xiàn)頂層電路,如圖9所示。
4 簡易計算器的硬件實現(xiàn)
本設(shè)計采用小梅哥AC101-EDA 開發(fā)板作為硬件驗證平臺,在設(shè)計好頂層電路的基礎(chǔ)上,進(jìn)行管腳鎖定,編譯并將生成的文件下載到FPGA開發(fā)版上進(jìn)行硬件驗證。硬件驗證現(xiàn)象如圖10所示,(a)、(b)、(c)、(d)分別為加減乘除運(yùn)算及其顯示結(jié)果,可以看出,顯示的運(yùn)算結(jié)果與理論數(shù)值一致,并且在進(jìn)行不同的運(yùn)算時相應(yīng)的LED燈會被點(diǎn)亮,這說明所設(shè)計的電路完全實現(xiàn)了簡易計算器的設(shè)計要求。
5 結(jié)束語
本文通過Quartus II 13.1軟件和小梅哥AC101-EDA開發(fā)板設(shè)計了一款簡易計算器。首先,通過對功能需求的分析,將設(shè)計分為六部分,包含11個底層電路模塊;然后在Quartus II 13.1軟件上通過Verilog HDL語言和原理圖相結(jié)合的方式設(shè)計了底層電路和頂層電路;最后把頂層電路下載到FPGA開發(fā)板中進(jìn)行了硬件測試,結(jié)果表明,所設(shè)計的簡易計算器能實現(xiàn)設(shè)計要求的所有功能,具有一定的實用價值。
【通聯(lián)編輯:朱寶貴】