RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的計(jì)算器設(shè)計(jì)

FPGA研究院 ? 來(lái)源:數(shù)字站 ? 2024-10-24 14:28 ? 次閱讀

以下文章來(lái)源于數(shù)字站 ,作者數(shù)字站

01概括

本文通過(guò)FPGA實(shí)現(xiàn)8位十進(jìn)制數(shù)的加、減、乘、除運(yùn)算,通過(guò)矩陣鍵盤輸入數(shù)據(jù)和運(yùn)算符,矩陣鍵盤的布局圖如下所示。該計(jì)算器可以進(jìn)行連續(xù)運(yùn)算,當(dāng)按下等號(hào)后,可以直接按數(shù)字進(jìn)行下次運(yùn)算,或者按運(yùn)算符,把上次運(yùn)算結(jié)果作為本次運(yùn)算的第一個(gè)操作數(shù)。

wKgZomcZ6VaAZjy8AAAcPdUhPdA034.jpg

圖1 矩陣鍵盤

通過(guò)clr可以清除之前輸入的所有數(shù)據(jù),在輸入運(yùn)算符時(shí),可以輸入多次,但是只有最后一次輸入的運(yùn)算符有效。計(jì)算器輸入的數(shù)字和計(jì)算結(jié)果通過(guò)8個(gè)數(shù)碼管進(jìn)行顯示。

該工程的資源消耗圖如下所示,總共消耗六百多個(gè)LUT,實(shí)現(xiàn)27位除法運(yùn)算和14位乘法運(yùn)算,以及二進(jìn)制轉(zhuǎn)BCD碼等。消耗的其余資源均不超過(guò)百分之二十。

pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg

wKgZoWcZ6VaAF0kwAAOCJ2K0a8w081.jpg

圖2 資源利用率

02頂層模塊設(shè)計(jì)

頂層模塊的信號(hào)列表如下所示:

表1 頂層模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
key_row O 4 矩陣鍵盤行輸出信號(hào)。
key_col I 4 矩陣鍵盤列輸入信號(hào),低電平有效。
sclk O 1 74HC595移位時(shí)鐘信號(hào),上升沿有效。
rclk O 1 74HC595鎖存時(shí)鐘信號(hào),上升沿有效。
ds O 1 74HC595串行數(shù)據(jù)信號(hào),在sclk下降沿更新數(shù)據(jù)。

頂層模塊只對(duì)子模塊進(jìn)行連線,框圖如下所示,總共包括7個(gè)子模塊,每個(gè)子模塊執(zhí)行不同功能。

wKgaoWcZ6YKAdbI6AAF1t2DUD6c557.jpg

圖3 頂層框圖

Key_scan模塊:對(duì)按鍵消抖,并且檢測(cè)被按下按鍵的位號(hào),按鍵編號(hào)取值范圍[0,15],key_vld為高電平表示有按鍵被按下一次,key_out表示被按下按鍵的位號(hào)。

Operation_ctrl模塊:計(jì)算器的控制和計(jì)算模塊,通過(guò)檢測(cè)被按下的按鍵,執(zhí)行相應(yīng)的功能,并且把數(shù)碼管需要顯示的數(shù)據(jù)通過(guò)operat_out信號(hào)輸出,該信號(hào)為二進(jìn)制數(shù)據(jù)。

Mult模塊:當(dāng)使能信號(hào)為高電平時(shí)開(kāi)始對(duì)輸入的數(shù)據(jù)進(jìn)行乘法運(yùn)算。乘數(shù)和被乘數(shù)均支持14位(4位十進(jìn)制數(shù)大小),最大輸出27位數(shù)據(jù)(8位十進(jìn)制最大數(shù)據(jù)的位寬)。因?yàn)橹挥?個(gè)數(shù)碼管,所以最大支持8位十進(jìn)制數(shù)據(jù)輸出。該模塊通過(guò)移位和加法器實(shí)現(xiàn)乘法,能夠運(yùn)行的頻率會(huì)更高。

Div模塊:當(dāng)使能信號(hào)為高電平時(shí)對(duì)輸入的數(shù)據(jù)進(jìn)行除法運(yùn)算,除數(shù)和被除數(shù)均支持27位,通過(guò)移位和加法器實(shí)現(xiàn)除法運(yùn)算。當(dāng)quotient_vld為高電平表示除法運(yùn)算結(jié)束。

Hex2bcd模塊:通過(guò)移位的方式實(shí)現(xiàn)二進(jìn)制轉(zhuǎn)bcd碼,輸入數(shù)據(jù)高達(dá)27位,如果使用除法和取余實(shí)現(xiàn)二進(jìn)制轉(zhuǎn)BCD碼,將消耗大量資源且時(shí)鐘運(yùn)行頻率較低。

Seg_disp:數(shù)碼管的刷新控制模塊,8個(gè)數(shù)碼共用同一組數(shù)據(jù)線,每個(gè)數(shù)碼管通過(guò)位選的方式工作,該模塊實(shí)現(xiàn)位選及數(shù)據(jù)的控制,將輸入的8個(gè)BCD碼顯示在對(duì)應(yīng)的8個(gè)數(shù)碼管上。

Hc595_drive模塊:該模塊實(shí)現(xiàn)74HC595芯片的驅(qū)動(dòng),通過(guò)三個(gè)管腳控制8個(gè)數(shù)碼管的顯示。

03矩陣鍵盤檢測(cè)模塊

本文只對(duì)模塊設(shè)計(jì)方法進(jìn)行簡(jiǎn)要概括,端口信號(hào)含義如下表所示。

表2 按鍵檢測(cè)模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
key_row O 4 矩陣鍵盤行輸出信號(hào)。
key_col I 4 矩陣鍵盤列輸入信號(hào),低電平有效。
key_out O 4 被按下按鍵的位號(hào)。
key_vld O 1 高電平表示有按鍵被按下。

通過(guò)一個(gè)狀態(tài)機(jī)采用逐行掃描的方式對(duì)按鍵進(jìn)行檢測(cè),首先初始狀態(tài)四行全部輸出低電平,檢測(cè)列輸入信號(hào)是否全部為高電平(列信號(hào)被上拉到VCC)。如果列輸入不全為高電平,則表示有按鍵被按下,則啟用一個(gè)計(jì)數(shù)器cnt,對(duì)列輸入不全為高電平的時(shí)間進(jìn)行計(jì)數(shù)。

如果時(shí)間能夠達(dá)到20MS,則認(rèn)為按鍵真的被按下。如果沒(méi)有達(dá)到20MS就檢測(cè)到列輸入全為高電平,則判定為抖動(dòng),此時(shí)將計(jì)數(shù)器清零,繼續(xù)檢測(cè)。當(dāng)確認(rèn)按鍵被按下后,狀態(tài)機(jī)跳轉(zhuǎn)到行檢測(cè),此時(shí)需要逐行輸出低電平,其余行輸出高電平,對(duì)所有行檢測(cè)一遍,從而確定出被按下按鍵的位置,輸出位號(hào)。最后狀態(tài)機(jī)跳轉(zhuǎn)到一個(gè)等待狀態(tài),直到所有按鍵被釋放后,狀態(tài)機(jī)回到空閑狀態(tài)繼續(xù)檢測(cè)。

我只對(duì)頂層模塊寫(xiě)了測(cè)試文件,所以其余模塊仿真通過(guò)modelsim添加對(duì)應(yīng)模塊信號(hào)即可,該模塊仿真結(jié)果如下圖所示。TestBench文件里面通過(guò)調(diào)用編寫(xiě)的任務(wù)實(shí)現(xiàn)按鍵按下的信號(hào)模擬,按下按鍵的前后都是模擬了抖動(dòng)的,如下圖所示。

紅框部分都是按鍵按下前的抖動(dòng),計(jì)數(shù)器shake_cnt沒(méi)有計(jì)數(shù)到最大值key_col所有位都變?yōu)楦唠娖搅耍藭r(shí)計(jì)數(shù)器就會(huì)清零重新檢測(cè),直到檢測(cè)到橙色框處,按鍵按下是俺才超過(guò)設(shè)定時(shí)間,狀態(tài)機(jī)才會(huì)跳轉(zhuǎn)。

wKgZoWcZ6YKAMQkcAAEhoFIX_X4978.jpg

圖4 抖動(dòng)檢測(cè)仿真

行掃描的細(xì)節(jié)如下所示,此時(shí)對(duì)每行進(jìn)行檢測(cè),每行掃描時(shí)間持續(xù)16個(gè)時(shí)鐘周期,通過(guò)計(jì)數(shù)器row_cnt記錄一行掃描的時(shí)間,計(jì)數(shù)器row_index記錄掃描第幾行了。當(dāng)掃描第0行時(shí),列輸入不全為高電平,表示被按下的按鍵在第0行。

列輸入值為4’hd,第一列為低電平,表示被按下按鍵在第1列,則計(jì)算出位號(hào)為1,此時(shí)key_out輸出1,key_vld拉高一個(gè)時(shí)鐘周期,表示1號(hào)按鍵被按下一次。pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg

wKgaoWcZ6YKALg8NAAECxwVuAvA891.jpg

圖5 按鍵檢測(cè)

04控制模塊

該模塊主要實(shí)現(xiàn)被按下按鍵的識(shí)別,然后進(jìn)行相應(yīng)的計(jì)算,并且輸出對(duì)應(yīng)的數(shù)據(jù)給數(shù)碼管進(jìn)行顯示,模塊端口信號(hào)如下所示:

表3 控制模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
din_key I 4 被按下按鍵位號(hào)。
din_key_vld I 1 高電平表示有按鍵被按下1次。
div_vld I 1 高電平表示除法器計(jì)算結(jié)束。
div_in I 27 除法器運(yùn)算結(jié)果。
mult_vld I 1 高電平表示乘法器計(jì)算結(jié)束。
mult_in I 27 乘法器計(jì)算結(jié)果。
div_en O 1 高電平驅(qū)動(dòng)除法器開(kāi)始工作。
mult_en O 1 高電平驅(qū)動(dòng)乘法器開(kāi)始工作。
data1 O 27 計(jì)算器的1號(hào)運(yùn)算數(shù),作為被除數(shù)/被乘數(shù)/被加數(shù)/被減數(shù)。
data2 O 27 計(jì)算器的2號(hào)運(yùn)算數(shù),作為除數(shù)/乘數(shù)/加數(shù)/減數(shù)。
dout O 27 數(shù)碼管需要顯示的二進(jìn)制數(shù)據(jù)。

該模塊的功能稍微復(fù)雜一點(diǎn),既要實(shí)現(xiàn)按鍵的識(shí)別,又要進(jìn)行加法、減法計(jì)算,還要進(jìn)行數(shù)碼管顯示數(shù)據(jù)的控制。均通過(guò)一個(gè)狀態(tài)機(jī)實(shí)現(xiàn),該狀態(tài)機(jī)的跳轉(zhuǎn)與按下的按鍵有關(guān)。

狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換圖如下所示,狀態(tài)機(jī)初始位于空閑狀態(tài)(IDLE),當(dāng)有數(shù)字按鍵被按下后,跳轉(zhuǎn)到輸入操作數(shù)1的狀態(tài)(IDTA1),在此狀態(tài)下,需要數(shù)據(jù)1,最多輸入8位十進(jìn)制數(shù)據(jù),檢測(cè)到有加減乘除運(yùn)算符按下時(shí),跳轉(zhuǎn)到運(yùn)算符輸入狀態(tài)(OPERAT),該狀態(tài)下可以輸入很多運(yùn)算符,但是只有離開(kāi)該狀態(tài)時(shí),輸入的最后一個(gè)運(yùn)算符有效。

wKgZoWcZ6YKAEJHTAAEoT713J-o439.jpg

pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg圖6 狀態(tài)轉(zhuǎn)換圖

在輸入運(yùn)算符的狀態(tài)下,如果檢測(cè)到數(shù)字按鍵被按下,則跳轉(zhuǎn)到輸入數(shù)字的狀態(tài)(IDTA2),也就是輸入第2個(gè)操作數(shù),該狀態(tài)最多輸入8位十進(jìn)制數(shù)據(jù),否則會(huì)溢出。

在該狀態(tài)下,如果檢測(cè)到等號(hào)被按下,則跳轉(zhuǎn)到計(jì)算結(jié)果的狀態(tài)(RESULT),該狀態(tài)會(huì)根據(jù)輸入的運(yùn)算符,對(duì)輸入的數(shù)據(jù)進(jìn)行相應(yīng)運(yùn)算,運(yùn)算符為乘法或除法時(shí),將乘法器使能或除法器使能信號(hào)拉高一個(gè)時(shí)鐘,讓乘法器或除法器模塊工作,當(dāng)乘法器或者除法器計(jì)算結(jié)束時(shí),更新計(jì)算結(jié)果。

在該狀態(tài)下,如果檢測(cè)到數(shù)字按鍵被按下,則跳轉(zhuǎn)到輸入數(shù)據(jù)1狀態(tài),進(jìn)行下次運(yùn)算。如果檢測(cè)到運(yùn)算符按鍵被按下,說(shuō)明用戶進(jìn)行連續(xù)運(yùn)算,則將本次運(yùn)算結(jié)果賦值給操作數(shù)1,狀態(tài)機(jī)跳轉(zhuǎn)到輸入運(yùn)算符狀態(tài),繼續(xù)下次運(yùn)算。

所有狀態(tài),只要清零按鍵被按下,狀態(tài)機(jī)回到空閑狀態(tài)。

再說(shuō)模塊輸出信號(hào)dout,當(dāng)狀態(tài)機(jī)處于IDTA1狀態(tài)時(shí),數(shù)碼管需要顯示輸入的數(shù)據(jù)1,則dout等于data1數(shù)值。當(dāng)狀態(tài)機(jī)處于IDATA2狀態(tài)時(shí),需要顯示輸入的數(shù)據(jù)2,則dout等于data2數(shù)值。當(dāng)狀態(tài)機(jī)處于運(yùn)算結(jié)果狀態(tài)時(shí),則dout根據(jù)運(yùn)算符不同,進(jìn)行相應(yīng)運(yùn)算,輸出不同數(shù)值。

該模塊內(nèi)部還包括一些數(shù)字信號(hào)、運(yùn)算符檢測(cè)、信號(hào)對(duì)齊、輸入數(shù)據(jù)的變化等等,這些不做細(xì)講,可以通過(guò)源代碼自行閱讀,源代碼均有注釋,閱讀應(yīng)該沒(méi)有難度。

對(duì)該模塊進(jìn)行總體仿真,在TestBench文件中依次按下這些按鍵,先實(shí)現(xiàn)26+290,然后再減82。pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg

wKgaoWcZ6YKAZu-uAAJTo_eT5Tc866.jpg

圖7 仿真按下按鍵

仿真結(jié)果如下所示,dout是數(shù)碼管需要顯示的數(shù)據(jù),din_key是按鍵消抖模塊檢測(cè)被按下的按鍵,通過(guò)位號(hào)譯碼,首先輸入26,數(shù)碼管現(xiàn)需要先顯示2,然后顯示26,3號(hào)按鍵代表加號(hào),然后輸入290作為第二運(yùn)算數(shù),14號(hào)按鍵是等號(hào),計(jì)算結(jié)果316。然后7號(hào)按鍵是減號(hào),之后dout的值賦值給data1,然后輸入82,完成316-82的運(yùn)算,最后數(shù)碼管顯示234。

wKgZoWcZ6YKAGHG3AADxt55glqA076.jpg

圖8 加減法仿真

連續(xù)乘法運(yùn)算仿真,如圖所示,上次運(yùn)算結(jié)果為234,然后按下乘號(hào)(11號(hào)按鍵),將上次運(yùn)算結(jié)果賦值給data1,然后輸入乘數(shù)為13,按下等號(hào)后,mult_en拉高,使能乘法器模塊,乘法器計(jì)算結(jié)束(mult_vld為高),輸出運(yùn)算結(jié)果3042。

wKgZoWcZ6YKAVLpNAADdr3hxsMs359.jpg

圖9 乘法仿真

連續(xù)除法運(yùn)算仿真,如圖所示,生詞運(yùn)算結(jié)果為3042,然后按下除號(hào)(15號(hào)按鍵),將上次運(yùn)算結(jié)果賦值給data1,然后輸入除數(shù)為71,按下等號(hào)后,div_en拉高,使能除法器模塊,除法器計(jì)算結(jié)束(div_vld為高),輸出運(yùn)算結(jié)果42。

wKgaoWcZ6YKAe-wHAACmItbVVrk438.jpg

圖10 除法仿真

05乘法器模塊

由于篇幅原因,本文不對(duì)乘法器的具體實(shí)現(xiàn)做講解。端口信號(hào)列表如下所示:

表4 乘法器模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
start I 1 開(kāi)始計(jì)算,高電平有效。
multiplicand I 14 被乘數(shù)輸入。
multiplier I 14 乘數(shù)輸入。
product O 27 乘積輸出。
product_vld O 1 乘積有效指示信號(hào)。
rdy O 1 高電平表示模塊空閑,可以進(jìn)行運(yùn)算。

由于人使用計(jì)算器的頻率較低,所以沒(méi)有使用rdy信號(hào),沒(méi)有影響。

乘法器模塊仿真如下所示,start為高電平時(shí),被乘數(shù)為234,乘數(shù)為13,通過(guò)幾個(gè)時(shí)鐘周期后,product_v ld拉高,表示計(jì)算結(jié)束,輸出乘積為3042。仿真正常,這個(gè)模塊輸出延遲與乘數(shù)的值有關(guān),最多不會(huì)超過(guò)乘數(shù)位寬那么多個(gè)時(shí)鐘周期,最少1個(gè)時(shí)鐘周期。

wKgaoWcZ6YKAEJm-AAEF5T1otbg683.jpg

pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg圖11 乘法器仿真

06除法器模塊

由于篇幅原因,本文不對(duì)除法器的具體實(shí)現(xiàn)做講解。端口信號(hào)列表如下所示:

表5 除法器模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
start I 1 開(kāi)始計(jì)算,高電平有效。
dividend I 27 被除數(shù)輸入。
divisor I 27 除數(shù)輸入。
quotient O 27 商輸出。
remainder O 27 余數(shù)輸出。
quotient_vld O 1 商和余數(shù)除數(shù)有效指示信號(hào)。
ready O 1 高電平表示模塊空閑,可以進(jìn)行運(yùn)算。
error O 1 輸入除數(shù)為0。

該模塊沒(méi)有使用余數(shù)、error、ready信號(hào),對(duì)應(yīng)仿真結(jié)果如下圖所示。開(kāi)始信號(hào)有效時(shí),被除數(shù)為3042,除數(shù)為71,經(jīng)過(guò)幾個(gè)時(shí)鐘周期后,quobient_vld拉高,表示除法計(jì)算結(jié)束,計(jì)算商為42,余數(shù)為60,經(jīng)過(guò)驗(yàn)算后沒(méi)有問(wèn)題。

wKgZoWcZ6YKANWN-AAHY6pG6Wuo673.jpg

圖12 除法器仿真

07二進(jìn)制轉(zhuǎn)BCD模塊

該模塊輸入27位二進(jìn)制數(shù)據(jù),輸出32位BCD碼,如果直接使用除法和取余操作,將消耗大量邏輯資源,并且時(shí)鐘頻率還不能提高。

所以就采用移位和加法的算法來(lái)實(shí)現(xiàn)轉(zhuǎn)換,本文不對(duì)該模塊具體實(shí)現(xiàn)方式進(jìn)行講解,設(shè)計(jì)的時(shí)候考慮了參數(shù)化,直接修改輸入?yún)?shù)位寬即可實(shí)現(xiàn)任意位寬的轉(zhuǎn)換,端口列表如下:

表6 二進(jìn)制轉(zhuǎn)BCD碼模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
din I 27 二進(jìn)制輸入數(shù)據(jù)。
din_vld I 27 二進(jìn)制輸入數(shù)據(jù)有效指示信號(hào)。
dout O 36 轉(zhuǎn)換后BCD碼
dout_vld O 1 轉(zhuǎn)換后的BCD碼有效指示信號(hào)。

該模塊的din_vld恒為高電平,需要對(duì)前文提到模塊稍作修改,修改后的代碼如下所示:

module hex2bcd #(
    parameter   IN_DATA_W       =           27              ,//輸入數(shù)據(jù)位寬;
    parameter   OUT_DATA_W      =           clogb2({{IN_DATA_W}{1'b1}})//自動(dòng)計(jì)算輸出數(shù)據(jù)對(duì)應(yīng)的十進(jìn)制位數(shù);
)(
    input                                   clk             ,//系統(tǒng)時(shí)鐘;
    input                                   rst_n           ,//系統(tǒng)復(fù)位,低電平有效;


    input       [IN_DATA_W-1:0]             din             ,//輸入二進(jìn)制數(shù)據(jù);
    input                                   din_vld         ,//輸入數(shù)據(jù)有效指示信號(hào),高電平有效;


    output reg  [4*OUT_DATA_W-1:0]          dout            ,//輸出8421BCD碼;
    output reg                              dout_vld         //輸出數(shù)據(jù)有效指示信號(hào),高電平有效;
    );


    localparam  CNT_W           =           clogb(IN_DATA_W-3);//根據(jù)輸入數(shù)據(jù)的位寬自動(dòng)計(jì)算需要移動(dòng)的輪數(shù);
    //localparam  OUT_DATA_W      =           clogb2({{IN_DATA_W}{1'b1}});//自動(dòng)計(jì)算輸出數(shù)據(jù)對(duì)應(yīng)的十進(jìn)制位數(shù);


    reg         [IN_DATA_W-1:0]             din_ff0     ;
    reg                                     flag        ;
    reg         [CNT_W-1:0]                 cnt         ;
    reg         [IN_DATA_W+OUT_DATA_W*4-1:0]data_shift  ;
    reg                                     end_cnt_ff0 ;


    wire        [OUT_DATA_W*4-1:0]          data_compare;
    wire                                    add_cnt     ;
    wire                                    end_cnt     ;


    function integer clogb2(input integer depth);
        begin
            if(depth==0)
                clogb2 = 1;
            else if(depth!=0)
                for(clogb2=0;depth>0;clogb2=clogb2+1)
                    depth=depth/10;
        end
    endfunction


     //自動(dòng)計(jì)算位寬
    function integer clogb(input integer depth);begin
        if(depth==0)
            clogb = 1;
        else if(depth!=0)
            for(clogb=0;depth>0;clogb=clogb+1)
                depth=depth>>1;
    end
    endfunction
    
    //當(dāng)輸入數(shù)據(jù)有效并且此時(shí)該模塊空閑時(shí)保存輸入數(shù)據(jù),否則不保存輸入數(shù)據(jù),這樣可以保證本次轉(zhuǎn)換數(shù)據(jù)完全正確;
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            din_ff0 <= 0;
        end
        else if(din_vld)begin
            din_ff0 <= din;
        end
    end


    //標(biāo)志信號(hào)flag,當(dāng)輸入數(shù)據(jù)有效時(shí)拉高,當(dāng)計(jì)數(shù)器計(jì)數(shù)完成時(shí)清零;
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            flag <= 1'b0;
        end
        else if(din_vld)begin
            flag <= 1'b1;
        end
        else if(end_cnt)begin
            flag <= 1'b0;
        end
    end


    //移位計(jì)數(shù)器,每次轉(zhuǎn)換需要移動(dòng)IN_DATA_W-2次,初始值為0,加一條件flag信號(hào)有效,結(jié)束條件是計(jì)數(shù)到IN_DATA_W-2次;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt <= 0;
        end
        else if(add_cnt)begin
            if(end_cnt)
                cnt <= 0;
            else
                cnt <= cnt + 1;
        end
    end


    assign add_cnt = flag;       
    assign end_cnt = add_cnt && cnt == IN_DATA_W-3;


    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            data_shift <= 0;
        end
        else if(add_cnt)begin
            if(cnt==0)begin//初始時(shí)將輸入數(shù)據(jù)左移三位保存;
                data_shift <= {{{OUT_DATA_W-3}{1'b0}},din_ff0,3'b0};
            end
            else begin//計(jì)數(shù)器加一條件有效時(shí),將移位寄存器數(shù)據(jù)左移一位;
                data_shift <= {data_compare[OUT_DATA_W*4-2:0],data_shift[IN_DATA_W-1:0],1'b0};
            end
        end
    end


    //移位后大于等于5之后加3;
    generate
        genvar bit_num;
                for(bit_num = 0 ; bit_num < OUT_DATA_W ; bit_num = bit_num + 1)begin : DATA
                    assign data_compare[4*bit_num+3 : 4*bit_num] = data_shift[IN_DATA_W+4*bit_num+3 : IN_DATA_W+4*bit_num] + (data_shift[IN_DATA_W+4*bit_num+3 : IN_DATA_W+4*bit_num]>=5 ? 4'd3 : 4'd0);
        end
    endgenerate


    //將計(jì)數(shù)器延遲一拍,用于生成輸出信號(hào);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            end_cnt_ff0 <= 1'b0;
        end
        else begin
            end_cnt_ff0 <= end_cnt;
        end
    end


    //通過(guò)計(jì)數(shù)器結(jié)束條件產(chǎn)生輸出信號(hào);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            dout <= 0;
        end
        else if(end_cnt_ff0)begin
            dout <= data_shift[IN_DATA_W+OUT_DATA_W*4-1 : IN_DATA_W];
        end
    end


    //通過(guò)計(jì)數(shù)器結(jié)束條件生成輸出有效指示信號(hào);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            dout_vld <= 1'b0;
        end
        else begin
            dout_vld <= end_cnt_ff0;
        end
    end


    endmodule

該模塊的端口仿真如下圖所示,輸入數(shù)據(jù)按照十進(jìn)制顯示,輸出數(shù)據(jù)按照十六進(jìn)制數(shù)據(jù)顯示,輸入數(shù)據(jù)為17’d29時(shí),輸出數(shù)據(jù)為36’h000000029,轉(zhuǎn)換完成。

wKgZomcZ6eGANUCDAADFHfAl4as264.jpg

圖13 二進(jìn)制轉(zhuǎn)BCD碼仿真

08數(shù)碼管刷新模塊

該模塊用的也比較多了,8個(gè)數(shù)碼管共用同一組數(shù)據(jù)線,那么這組數(shù)據(jù)線就只能通過(guò)時(shí)分復(fù)用的方式傳遞數(shù)據(jù)。

對(duì)應(yīng)的端口列表如下所示:

表7 數(shù)碼管刷新模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
din I 32 需要顯示的32位BCD碼
segment O 8 數(shù)碼管的數(shù)據(jù)線
seg_sel O 8 數(shù)碼管位選信號(hào)
dout_vld O 1 數(shù)碼管刷新指示信號(hào)

該模塊后面還有一個(gè)74HC595驅(qū)動(dòng)模塊,所以需要固定一段時(shí)間產(chǎn)生數(shù)據(jù)和位選信號(hào),一般數(shù)碼管刷新時(shí)間采用20us,所以每隔20us產(chǎn)生一個(gè)刷新信號(hào),輸出對(duì)應(yīng)數(shù)碼管數(shù)據(jù)和位選信號(hào)給74HC595模塊的驅(qū)動(dòng),再生成相應(yīng)輸出。

修改后的代碼如下所示:

module seg_disp #(
    parameter       TCLK                    =   20      ,//系統(tǒng)時(shí)鐘周期,單位ns。
    parameter       TIME_20US               =   20_000  ,//數(shù)碼管刷新時(shí)間,默認(rèn)20us。
    parameter       SEG_NUM                 =   8        //需要顯示的數(shù)碼管個(gè)數(shù)。
)(
    //輸入信號(hào)定義
    input                                       clk     ,//系統(tǒng)時(shí)鐘,50MHz。
    input                                       rst_n   ,//系統(tǒng)復(fù)位,低電平有效。


    input           [(SEG_NUM * 4) - 1  :0]     din     ,//需要數(shù)碼管顯示的BCD碼數(shù)碼;
    //輸出信號(hào)定義
    output reg      [7 : 0]                     segment ,//數(shù)碼管的數(shù)據(jù)線;
    output reg      [SEG_NUM - 1 : 0]           seg_sel ,//數(shù)碼管的位選信號(hào);
    output reg                                  dout_vld //為高電平時(shí),表示段選和位選信號(hào)有效;
);
    //參數(shù)定義
    localparam      TIME                    =   TIME_20US/TCLK  ;
    localparam      TIME_W                  =   clogb2(TIME-1)  ;//計(jì)算數(shù)碼管掃描時(shí)間的時(shí)鐘數(shù)據(jù)位寬;
    localparam      SEG_W                   =   clogb2(SEG_NUM) ;
    localparam      ZERO                    =   8'h3F  ; //8'hC0;前面的數(shù)據(jù)是共陰數(shù)碼管使用的,后面數(shù)據(jù)是共陽(yáng)數(shù)碼管使用的;
    localparam      ONE                     =   8'h06  ; //8'hF9;
    localparam      TWO                     =   8'h5B  ; //8'hA4;
    localparam      THREE                   =   8'h4F  ; //8'hB0;
    localparam      FOUR                    =   8'h66  ; //8'h99;
    localparam      FIVE                    =   8'h6D  ; //8'h92;
    localparam      SIX                     =   8'h7D  ; //8'h82;
    localparam      SEVEN                   =   8'h07  ; //8'hF8;
    localparam      EIGHT                   =   8'h7F  ; //8'h80;
    localparam      NINE                    =   8'h6F  ; //8'h90;
    localparam      ERR                     =   8'h77  ; //8'h86;


    //中間信號(hào)定義
    reg             [3 : 0]                     sel_result  ;
    reg             [SEG_W - 1 : 0]             sel         ;
    reg             [SEG_W - 1 : 0]             sel_ff0     ;
    reg             [TIME_W - 1 : 0]            cnt_20us    ;
    reg                                         add_sel_r   ;//


    wire                                        end_cnt_20us;
    wire                                        add_sel     ;
    wire                                        end_sel     ;


    //自動(dòng)計(jì)算位寬的函數(shù);
    function integer clogb2(input integer depth);
        begin
            if(depth==0)
                clogb2=1;
            else if(depth!=0)
                for(clogb2=0; depth>0;clogb2=clogb2+1)
                    depth=depth>>1;
        end
    endfunction


    //20us計(jì)數(shù)器,用于對(duì)一個(gè)數(shù)碼管點(diǎn)亮的持續(xù)時(shí)間進(jìn)行計(jì)數(shù),計(jì)數(shù)器初始值為0,對(duì)
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin//計(jì)數(shù)器初始值為0;
            cnt_20us <= 0;
        end
        else if(end_cnt_20us)begin//當(dāng)計(jì)數(shù)器計(jì)數(shù)到20us時(shí),表示一個(gè)數(shù)碼管已經(jīng)被點(diǎn)亮20US了,將計(jì)數(shù)器清零;
            cnt_20us <= 0;
        end
        else begin//否則,計(jì)數(shù)器加一;
            cnt_20us <= cnt_20us + 1'b1;
        end
    end


    //計(jì)數(shù)器結(jié)束條件,當(dāng)計(jì)數(shù)器計(jì)數(shù)到TIME-1時(shí)表示20US已經(jīng)到了,將計(jì)數(shù)器清零;
    assign end_cnt_20us = cnt_20us == TIME - 1;


    //計(jì)數(shù)器sel,用于計(jì)數(shù)此時(shí)點(diǎn)亮的時(shí)第幾個(gè)數(shù)碼管,上電復(fù)位時(shí)點(diǎn)亮第零個(gè)數(shù)碼管,所以初始值為0,之后當(dāng)計(jì)數(shù)器cnt_20us計(jì)數(shù)結(jié)束時(shí),表示一個(gè)數(shù)碼管點(diǎn)亮?xí)r間已經(jīng)到了,此時(shí)計(jì)數(shù)器sel加一,表示該點(diǎn)亮下一個(gè)計(jì)數(shù)器了,當(dāng)點(diǎn)亮SEG_NUM-1個(gè)計(jì)數(shù)器完成(end_sel有效)時(shí)表示數(shù)碼管都被點(diǎn)亮了一次,此時(shí)計(jì)數(shù)器sel清零,又從第一個(gè)數(shù)碼管開(kāi)始點(diǎn)亮;
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始值為0;
            sel <= 0;
        end
        else if(add_sel) begin
            if(end_sel)//當(dāng)計(jì)數(shù)器sel計(jì)數(shù)結(jié)束時(shí),計(jì)數(shù)器清零;
                sel <= 0;
            else
                sel <= sel + 1;
        end
    end
    assign add_sel = end_cnt_20us;//計(jì)數(shù)器sel的加一條件是,計(jì)數(shù)器cnt_20us計(jì)數(shù)器結(jié)束;
    assign end_sel = add_sel && sel == SEG_NUM - 1;//計(jì)數(shù)器sel計(jì)數(shù)到SEL_NUM-1時(shí),計(jì)數(shù)器sel清零;


    //sel_result信號(hào)是當(dāng)前被點(diǎn)亮數(shù)碼管需要顯示的數(shù)據(jù),根據(jù)計(jì)數(shù)器sel的值確定此時(shí)應(yīng)該將輸入信號(hào)的哪幾位數(shù)據(jù)譯碼輸出給數(shù)碼管進(jìn)行顯示;
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始值為0;
            sel_result <= 4'd0;
        end
        else if(add_sel)begin//取輸入信號(hào)din[4*sel+3 : 4*sel]信號(hào)給譯碼部分進(jìn)行譯碼,之后輸出給數(shù)碼管數(shù)據(jù)信號(hào)驅(qū)動(dòng)數(shù)碼管顯示該數(shù)據(jù);
            sel_result <= din[4*sel+3 -: 4];//{din[4*sel+3],din[4*sel+2],din[4*sel+1],din[4*sel]};
        end
    end


    //譯碼器部分,將sel_result十進(jìn)制信號(hào)譯碼成數(shù)碼管顯示該數(shù)字對(duì)應(yīng)的八位數(shù)據(jù)信號(hào);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始上電時(shí),所有數(shù)碼管顯示數(shù)據(jù)0;
            segment <= ZERO;
        end
        else if(add_sel_r)begin
            case(sel_result)//將sel_result譯碼成對(duì)應(yīng)的segment數(shù)據(jù),segment數(shù)據(jù)驅(qū)動(dòng)數(shù)碼管才能顯示sel_result代表的數(shù)字;
                0: segment <= ZERO ;//想要數(shù)碼管顯示0,就要給數(shù)碼管數(shù)據(jù)信號(hào)segment輸入ZERO數(shù)據(jù),其余類似;
                1: segment <= ONE  ;
                2: segment <= TWO  ;
                3: segment <= THREE;
                4: segment <= FOUR ;
                5: segment <= FIVE ;
                6: segment <= SIX  ;
                7: segment <= SEVEN;
                8: segment <= EIGHT;
                9: segment <= NINE ;
                default: segment <= ERR;
            endcase
        end
    end


    //為了與段選動(dòng)態(tài)掃描,保持同步,此時(shí)位選應(yīng)該打一拍再賦給位選信號(hào) seg_sel
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            sel_ff0 <= 0;
        end
        else if(add_sel)begin
            sel_ff0 <= sel;
        end
    end


    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始值為0,全部數(shù)碼管被點(diǎn)亮;
            seg_sel <= {{SEG_NUM}{1'b0}};
        end
        else if(add_sel_r)begin//將1右移sel_ff0位之后取反,seg_sel的第sel_ff0輸出低電平,對(duì)應(yīng)的第sel_ff0個(gè)數(shù)碼管被點(diǎn)亮了,其余位輸出高電平,對(duì)應(yīng)的數(shù)碼管熄滅;
            seg_sel <= ~({1'b1,{{SEG_NUM-1}{1'b0}}} >> sel_ff0);//~(6'h1<

該模塊仿真比較簡(jiǎn)單,如下圖所示,需要顯示的數(shù)據(jù)為32’h00000234,由于底板上位選最低位對(duì)應(yīng)的是最左邊的數(shù)碼管,第1個(gè)十進(jìn)制數(shù)需要與位選的最高位對(duì)齊,第8個(gè)十進(jìn)制數(shù)需要與位選的最低位對(duì)齊,仿真結(jié)果如下所示。

位選信號(hào)為8’h7f是,此時(shí)數(shù)據(jù)段應(yīng)該輸出8’h66,數(shù)碼管顯示4這個(gè)數(shù)字。pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg

wKgZomcZ6f2AeJLoAAEvpxhHFbI888.jpg

圖14 數(shù)碼管刷新模塊仿真

0974H595模塊驅(qū)動(dòng)

數(shù)碼管的驅(qū)動(dòng)電路如下所示,通過(guò)兩片74HC595驅(qū)動(dòng)8個(gè)數(shù)碼管,由于篇幅問(wèn)題,本文只對(duì)該模塊進(jìn)行仿真。

wKgaomcZ6f2ABqaxAAEszmgy4-g132.jpg

圖15 數(shù)碼管驅(qū)動(dòng)電路

信號(hào)端口列表如下所示。

表8 74HC595驅(qū)動(dòng)模塊信號(hào)列表

信號(hào)名 I/O 位寬 含義
clk I 1 系統(tǒng)時(shí)鐘頻率,默認(rèn)12MHz。
rst_n I 1 系統(tǒng)復(fù)位信號(hào),低電平有效。
segment I 8 數(shù)碼管的數(shù)據(jù)線
seg_sel I 8 數(shù)碼管位選信號(hào)
dout_vld I 1 數(shù)碼管刷新指示信號(hào)
ds O 1 74hc595芯片串行數(shù)據(jù)。
sclk O 1 74hc595芯片移位寄存器時(shí)鐘信號(hào)。
rclk O 1 74hc595芯片鎖存器時(shí)鐘信號(hào)。

該模塊整體仿真結(jié)果如下所示:

wKgZomcZ6f2AW56-AAF7ZBRUCSw162.jpg

圖16 整體仿真

該模塊細(xì)節(jié)仿真如下所示:

wKgaomcZ6f2APlj9AAE7G9eo_vU058.jpg

圖17 細(xì)節(jié)仿真

10上板實(shí)測(cè)

上述仿真了各個(gè)模塊,下文在開(kāi)發(fā)板上對(duì)這個(gè)工程進(jìn)行實(shí)測(cè)。

首先驗(yàn)證正常的加減乘除運(yùn)算,如下視頻所示,每次運(yùn)算后使用清除按鍵清零運(yùn)算結(jié)果,然后開(kāi)始下次運(yùn)算。

下面是進(jìn)行連續(xù)運(yùn)算的演示,使用該計(jì)算器實(shí)現(xiàn)以下運(yùn)算((3320 + 2551) - 771) * 7 / 9,得到計(jì)算結(jié)果為3966,與真實(shí)結(jié)果一致。

同時(shí)在輸入運(yùn)算符時(shí),如果運(yùn)算符輸入錯(cuò)誤,則可以再次輸入運(yùn)算符,以最后輸入的運(yùn)算符為準(zhǔn),之后輸入第二個(gè)操作數(shù),與一般的計(jì)算器機(jī)制一致。

來(lái)源:本文轉(zhuǎn)載自數(shù)字站公眾號(hào)

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602978
  • 矩陣鍵盤
    +關(guān)注

    關(guān)注

    7

    文章

    206

    瀏覽量

    31454
  • 計(jì)算器
    +關(guān)注

    關(guān)注

    16

    文章

    437

    瀏覽量

    37327
  • 運(yùn)算符
    +關(guān)注

    關(guān)注

    0

    文章

    172

    瀏覽量

    11079

原文標(biāo)題:基于FPGA的計(jì)算器

文章出處:【微信號(hào):FPGA研究院,微信公眾號(hào):FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA設(shè)計(jì)的計(jì)算器

    FPGA模擬設(shè)計(jì)的計(jì)算器
    發(fā)表于 05-04 20:27

    基于FPGA計(jì)算器設(shè)計(jì):矩陣鍵盤模塊(含程序)

    做了一個(gè)計(jì)算器的實(shí)驗(yàn),目前可以正負(fù)實(shí)現(xiàn)數(shù)的加減乘除,以及定點(diǎn)小數(shù)的加減乘除,精度不高還在進(jìn)一步完善,今天先把矩陣鍵盤掃描的模塊總結(jié)一下,明天繼續(xù)優(yōu)化。這是一個(gè)大概的模塊劃分和數(shù)據(jù)流向圖,我們首先要
    發(fā)表于 08-09 17:46

    至芯科技昭哥帶你學(xué)FPGAFPGA_100天之旅_計(jì)算器設(shè)計(jì)

    本文屬于本人原創(chuàng),和大家一起學(xué)習(xí)FPGA,交流FPGA,希望大家多多支持。來(lái)源:至芯科技昭哥帶你學(xué)FPGAFPGA_100天之旅_計(jì)算器設(shè)
    發(fā)表于 10-18 11:25

    FPGA模擬設(shè)計(jì)的計(jì)算器

    計(jì)算器代碼不能實(shí)現(xiàn)一個(gè)功能: 3和7是不能同時(shí)按的, 也就是不能夠?qū)崿F(xiàn)3+7和3-7等功能 可以自己試試看吧。。。 全部資料下載: fpga計(jì)算器.rar
    發(fā)表于 07-03 13:16

    8位二進(jìn)制轉(zhuǎn)化個(gè)位,十位,百位的進(jìn)程程序一直出錯(cuò)

    我在做基于FPGA計(jì)算器設(shè)計(jì)時(shí),用Quartus Ⅱ 13.1寫(xiě)的程序,但寫(xiě)完8位二進(jìn)制轉(zhuǎn)化個(gè)位,十位,百位的進(jìn)程程序后,編譯時(shí),在ctrview:PROCESS(c,clk)BEGIN這一
    發(fā)表于 11-30 09:58

    基于FPGA計(jì)算器設(shè)計(jì)程序出錯(cuò)

    我在做基于FPGA計(jì)算器設(shè)計(jì)時(shí),用Quartus Ⅱ 13.1寫(xiě)的程序,但寫(xiě)完8位二進(jìn)制轉(zhuǎn)化個(gè)位,十位,百位的進(jìn)程程序后,編譯時(shí),在ctrview:PROCESS(c,clk)BEGIN這一
    發(fā)表于 12-04 08:16

    FPGA計(jì)算器(矩陣按鍵,LCD1602)

    本帖最后由 溫家輝 于 2019-9-23 09:05 編輯 用FPGA實(shí)現(xiàn)了加減乘除,4*4矩陣按鍵作為輸入,LCD1602顯示,代碼寫(xiě)了一個(gè)多星期,終于完成了所有功能,開(kāi)心,,,,注意,矩陣按鍵需要設(shè)置上拉電阻
    發(fā)表于 09-23 09:03

    【工程源碼】基于FPGA計(jì)算器

    本文和設(shè)計(jì)代碼由FPGA愛(ài)好者小梅哥編寫(xiě),未經(jīng)作者許可,本文僅允許網(wǎng)絡(luò)論壇復(fù)制轉(zhuǎn)載,且轉(zhuǎn)載時(shí)請(qǐng)標(biāo)明原作者。
    發(fā)表于 02-20 14:10

    如何實(shí)現(xiàn)基于FPGA的電子計(jì)算器設(shè)計(jì)

    今天給大俠帶來(lái)基于FPGA的電子計(jì)算器設(shè)計(jì),由于篇幅較長(zhǎng),分三篇。今天帶來(lái)第二篇,中篇,話不多說(shuō),上貨。導(dǎo)讀本篇介紹了一個(gè)簡(jiǎn)單計(jì)算器的設(shè)計(jì),基于 FPGA 硬件描述語(yǔ)言 Verilog
    發(fā)表于 11-11 08:31

    基于FPGA計(jì)算器設(shè)計(jì)

    發(fā)表于 03-21 16:52 ?36次下載

    基于FPGA計(jì)算器設(shè)計(jì)(源碼)

    這是一個(gè)基于FPGA設(shè)計(jì)的四則運(yùn)算簡(jiǎn)易計(jì)算器。可以實(shí)現(xiàn)定點(diǎn)小數(shù)運(yùn)算和負(fù)數(shù)運(yùn)算。
    發(fā)表于 08-23 16:23 ?31次下載

    FPGA設(shè)計(jì)計(jì)算器

    計(jì)算器是設(shè)計(jì)中經(jīng)常用到的一個(gè)操作軟件,設(shè)計(jì)和學(xué)習(xí)計(jì)算器使我們親密的聯(lián)系所學(xué)的各模塊, 對(duì)我們的學(xué)習(xí)有很大的幫助和提升。希望大家來(lái)學(xué)習(xí)
    的頭像 發(fā)表于 09-15 08:48 ?9376次閱讀
    用<b class='flag-5'>FPGA</b>設(shè)計(jì)<b class='flag-5'>計(jì)算器</b>

    基于FPGA的電子計(jì)算器設(shè)計(jì)(中)

    今天給大俠帶來(lái)基于FPGA的電子計(jì)算器設(shè)計(jì),由于篇幅較長(zhǎng),分三篇。今天帶來(lái)第二篇,中篇,話不多說(shuō),上貨。導(dǎo)讀本篇介紹了一個(gè)簡(jiǎn)單計(jì)算器的設(shè)計(jì),基于 FPGA 硬件描述語(yǔ)言 Verilog
    發(fā)表于 11-06 17:36 ?17次下載
    基于<b class='flag-5'>FPGA</b>的電子<b class='flag-5'>計(jì)算器</b>設(shè)計(jì)(中)

    基于FPGA的電子計(jì)算器設(shè)計(jì)

    在國(guó)外,電子計(jì)算器在集成電路發(fā)明后,只用短短幾年時(shí)間就完成了技術(shù)飛躍,經(jīng)過(guò)激烈的市場(chǎng)競(jìng)爭(zhēng),現(xiàn)在的計(jì)算器技術(shù)己經(jīng)相當(dāng)成熟。
    的頭像 發(fā)表于 02-13 09:11 ?5460次閱讀

    基于FPGA的披薩切片角度計(jì)算器

    電子發(fā)燒友網(wǎng)站提供《基于FPGA的披薩切片角度計(jì)算器.zip》資料免費(fèi)下載
    發(fā)表于 06-16 11:47 ?0次下載
    基于<b class='flag-5'>FPGA</b>的披薩切片角度<b class='flag-5'>計(jì)算器</b>
    RM新时代网站-首页