官术网_书友最值得收藏!

1.2 可編程邏輯常用設(shè)計(jì)思想和技巧

1.2.1 乒乓操作

乒乓操作實(shí)際上是利用兩個(gè)數(shù)據(jù)緩存模塊來(lái)進(jìn)行流水操作,如圖1-2所示。兩個(gè)數(shù)據(jù)緩存模塊輪流緩存數(shù)據(jù),并輪流輸出數(shù)據(jù)給后端處理,可以將它們看成一個(gè)連續(xù)處理數(shù)據(jù)的黑盒。實(shí)現(xiàn)乒乓操作的前提是輸入數(shù)據(jù)的吞吐率小于輸出數(shù)據(jù)的吞吐率,否則會(huì)造成數(shù)據(jù)覆蓋。如果輸入數(shù)據(jù)速率大于輸出數(shù)據(jù)速率,但是輸入數(shù)據(jù)有停頓,造成輸入數(shù)據(jù)的吞吐率小于輸出數(shù)據(jù)的吞吐率,就可以實(shí)現(xiàn)高速數(shù)據(jù)輸入、低速數(shù)據(jù)輸出的效果。另外,串行高速輸入和并行低速輸出的乒乓操作是在輸入數(shù)據(jù)吞吐率小于或等于輸出數(shù)據(jù)吞吐率的前提下進(jìn)行的。

圖1-2 乒乓操作

1.2.2 串并轉(zhuǎn)換

串并轉(zhuǎn)換就是把串行輸入的數(shù)據(jù)并行輸出,它有效地利用了FPGA可編程邏輯高并行性的特點(diǎn)。

1.2.3 流水操作

流水操作的實(shí)質(zhì)是時(shí)序電路處理,如圖1-3所示。只有把數(shù)據(jù)處理的各階段精確分配到時(shí)序的每一個(gè)時(shí)鐘周期,才能保證全流水處理輸入數(shù)據(jù)。這種設(shè)計(jì)方式通常會(huì)和乒乓操作及串并轉(zhuǎn)換結(jié)合起來(lái),以保證各級(jí)流水處理的輸入數(shù)據(jù)被準(zhǔn)備好,并及時(shí)輸出數(shù)據(jù)給下一級(jí)流水處理。

圖1-3 流水操作

1.2.4 異步時(shí)鐘域的數(shù)據(jù)同步

設(shè)計(jì)中經(jīng)常會(huì)碰到不同時(shí)鐘域之間的數(shù)據(jù)傳輸,處理好異步時(shí)鐘域的數(shù)據(jù)同步問(wèn)題非常重要。

1.兩種典型異步時(shí)鐘域

(1)兩個(gè)時(shí)鐘域的時(shí)鐘同頻不同相。

(2)兩個(gè)時(shí)鐘域的時(shí)鐘既不同頻也不同相。

2.異步時(shí)鐘域數(shù)據(jù)傳輸方式

對(duì)于異步時(shí)鐘域的數(shù)據(jù)傳輸(圖1-4),核心思想是建立一個(gè)緩存空間,使輸入數(shù)據(jù)的吞吐率小于或等于輸出數(shù)據(jù)的吞吐率。這個(gè)緩存空間要支持兩種時(shí)鐘的讀寫。FPGA中的異步FIFO緩存是基于讀寫信號(hào)進(jìn)行數(shù)據(jù)讀寫的,可以把輸入數(shù)據(jù)用寫信號(hào)異步寫入FIFO緩存,輸出一個(gè)半滿或者滿信號(hào)給讀出端,讀出端用讀信號(hào)讀出數(shù)據(jù)。

圖1-4 異步時(shí)鐘域的數(shù)據(jù)傳輸

另外,如果采集時(shí)鐘頻率大于輸入數(shù)據(jù)時(shí)鐘頻率,即倍頻采樣,則可能出現(xiàn)亞穩(wěn)態(tài)問(wèn)題。

這個(gè)問(wèn)題不能百分之百地避免,因?yàn)槿绻麆偤貌蓸拥疆惒叫盘?hào)的跳變狀態(tài),后級(jí)寄存器輸出的就是一個(gè)不確定的亞穩(wěn)態(tài)信號(hào)。這時(shí)的解決方法是采用多級(jí)寄存器連續(xù)采樣,這樣可以保證最后的輸出不是亞穩(wěn)態(tài)信號(hào),但不能完全保證后級(jí)輸出是前級(jí)輸入的正確值。要實(shí)現(xiàn)完全無(wú)錯(cuò)誤傳輸,還要增加系統(tǒng)級(jí)糾錯(cuò)機(jī)制,如圖1-5所示。

圖1-5 加入糾錯(cuò)機(jī)制的異步時(shí)鐘域的數(shù)據(jù)傳輸

1.2.5 英特爾推薦的Coding Style

采用英特爾推薦的Coding Style的好處在于代碼的可移植性和可綜合性。因?yàn)槟壳霸O(shè)計(jì)和器件都是超大規(guī)模的,所以依靠自動(dòng)仿真、手動(dòng)仿真或者設(shè)計(jì)工具的優(yōu)化來(lái)使整個(gè)設(shè)計(jì)滿足時(shí)序要求是很難的。在這種情況下,采用好的Coding Style能獲得事半功倍的效果。

1.Coding Style的含義

Coding Style是指編程風(fēng)格,好的Coding Style不依賴于具體的EDA工具和器件。也就是說(shuō),用任何一種EDA工具或者將代碼移植到任何廠家的器件中,實(shí)現(xiàn)的功能都差不多。

2.模塊層次化編程

模塊層次化編程如圖1-6所示。首先設(shè)計(jì)一個(gè)頂層模塊,頂層模塊不做具體的邏輯運(yùn)算,只實(shí)現(xiàn)外部I/O和內(nèi)部各模塊之間的連接;頂層模塊下面是第一層模塊,它們可以相互通信;第一層模塊下面的子模塊只能與本層子模塊和對(duì)應(yīng)的第一層模塊通信,不能與其他模塊下面的子模塊通信。這種結(jié)構(gòu)便于以后的維護(hù)及測(cè)試階段信號(hào)的搜索。

3.組合邏輯編程

組合邏輯設(shè)計(jì)最好采用assign直接賦值語(yǔ)句,系統(tǒng)會(huì)自動(dòng)生成組合邏輯電路(圖1-7)。如果采用always@()加敏感信號(hào)高低電平有效的賦值語(yǔ)句,當(dāng)語(yǔ)句中的條件判斷不完全時(shí),非常容易生成鎖存器,而在組合邏輯電路中生成鎖存器,不利于靜態(tài)時(shí)序分析。

圖1-6 模塊層次化編程

圖1-7 組合邏輯電路

另外,要避免用組合邏輯鏈來(lái)產(chǎn)生延時(shí)信號(hào)。圖1-8中顯示了兩種不同的邏輯門。因?yàn)槊靠頕PGA器件的邏輯門的傳輸時(shí)間不固定,所以產(chǎn)生的信號(hào)寬度不一樣,這不利于程序移植。

圖1-8 兩種不同的邏輯門

4.時(shí)鐘設(shè)計(jì)編程

時(shí)鐘設(shè)計(jì)的基本原則是外部主時(shí)鐘通過(guò)時(shí)鐘專用引腳連接到內(nèi)部PLL,再由PLL產(chǎn)生各種時(shí)鐘去驅(qū)動(dòng)全局時(shí)鐘網(wǎng)絡(luò),如圖1-9所示。如果PLL資源有限,需要的時(shí)鐘又太多,可以考慮用計(jì)數(shù)器生成時(shí)鐘。但是,盡量不要用組合邏輯的延時(shí)來(lái)產(chǎn)生時(shí)鐘,因?yàn)檫@樣會(huì)產(chǎn)生毛刺。

圖1-9 時(shí)鐘設(shè)計(jì)

另外,在FPGA內(nèi)部不要使用門控時(shí)鐘和時(shí)鐘切換等操作,這樣也會(huì)產(chǎn)生毛刺。如果有嚴(yán)格的功耗要求,建議選擇低功耗的器件。

5.全局復(fù)位編程

全局同步或異步復(fù)位信號(hào)一般由全局時(shí)鐘網(wǎng)絡(luò)驅(qū)動(dòng)。

6.狀態(tài)機(jī)編程

狀態(tài)機(jī)可以將復(fù)雜的時(shí)序控制和狀態(tài)跳轉(zhuǎn)簡(jiǎn)單圖形化。狀態(tài)機(jī)編程應(yīng)注意以下幾點(diǎn)。

1)狀態(tài)機(jī)的編碼方式

狀態(tài)機(jī)的編碼方式有binary、gray-code和one-hot,編碼方式直接決定譯碼的復(fù)雜度和速度。binary和gray-code使用的碼位少,占用的寄存器資源少,但是譯碼的復(fù)雜度高;one-hot占用的寄存器資源多,但是譯碼的復(fù)雜度低,速度快。一般來(lái)說(shuō),小型狀態(tài)機(jī)使用binary和gray-code編碼,大型狀態(tài)機(jī)使用one-hot編碼。

2)編程方式

狀態(tài)機(jī)編程有三種方式:第一種是把所有的狀態(tài)跳轉(zhuǎn),以及跳轉(zhuǎn)條件判斷和狀態(tài)機(jī)輸入/輸出寫在一個(gè)always塊中;第二種是將狀態(tài)跳轉(zhuǎn)寫在一個(gè)always塊中,將跳轉(zhuǎn)條件判斷和狀態(tài)機(jī)輸入/輸出寫在另一個(gè)always塊中;第三種是把狀態(tài)跳轉(zhuǎn)、跳轉(zhuǎn)條件判斷、狀態(tài)機(jī)輸入/輸出分別寫在一個(gè)always塊中,示例代碼如下。

為了便于以后維護(hù),可采用第二種或者第三種編程方式。如果要避免產(chǎn)生鎖存器,或者需要同時(shí)確定當(dāng)前狀態(tài)、當(dāng)前狀態(tài)前后狀態(tài)、狀態(tài)跳轉(zhuǎn)判斷條件及其對(duì)輸入/輸出的影響,則建議采用第一種編程方式,這樣更容易掌握各種狀態(tài)的具體情況,而且目前的開發(fā)軟件能自動(dòng)識(shí)別狀態(tài)機(jī)的代碼,綜合出正確的邏輯。

3)狀態(tài)機(jī)的初始狀態(tài)和默認(rèn)跳轉(zhuǎn)狀態(tài)

每個(gè)狀態(tài)機(jī)要有一個(gè)初始狀態(tài),通常采用異步復(fù)位信號(hào);每個(gè)狀態(tài)機(jī)還要有一個(gè)默認(rèn)跳轉(zhuǎn)狀態(tài)。

4)狀態(tài)機(jī)的輸出默認(rèn)狀態(tài)

狀態(tài)機(jī)必須有一個(gè)輸出默認(rèn)狀態(tài),以防生成鎖存器。

7.三態(tài)信號(hào)編程

三態(tài)信號(hào)一般用于將頂層模塊連接到PAD上面的I/O,這種I/O通常通過(guò)軟件用可編程I/O模塊來(lái)實(shí)現(xiàn)。因此,建議在頂層模塊中實(shí)現(xiàn)三態(tài)信號(hào)。三態(tài)信號(hào)編程示例如下。

主站蜘蛛池模板: 改则县| 睢宁县| 固始县| 兰溪市| 泾川县| 土默特右旗| 特克斯县| 休宁县| 将乐县| 南漳县| 自贡市| 兴业县| 林芝县| 莫力| 平定县| 河间市| 文安县| 秦皇岛市| 西乌珠穆沁旗| 西和县| 巴南区| 宜都市| 莱阳市| 阿巴嘎旗| 鹤庆县| 清镇市| 云阳县| 仙游县| 兰西县| 中阳县| 日喀则市| 萍乡市| 山东省| 邯郸市| 民权县| 瑞金市| 阳山县| 太仓市| 龙门县| 疏附县| 高安市|