標(biāo)題: FPGA-愛FPGA,愛生活 [打印本頁]
作者: 51黑黑黑 時(shí)間: 2016-2-23 03:27
標(biāo)題: FPGA-愛FPGA,愛生活
在公司里的幾個(gè)月,做的項(xiàng)目其實(shí)不多,但是收獲還是有一些,我覺得收獲最大的是
設(shè)計(jì)理念的改變,這也是我這段時(shí)間最想總結(jié)的,我會(huì)在后面逐漸闡述。
1 時(shí)序是設(shè)計(jì)出來的
我的boss有在華為及峻龍工作的背景,自然就給我們講了一些華為及altera做邏輯
的一些東西,而我們的項(xiàng)目規(guī)范,也基本上是按華為的那一套去做。在工作這幾個(gè)月中
,給我感觸最深的是華為的那句話:時(shí)序是設(shè)計(jì)出來的,不是仿出來的,更不是湊出來
的。
在我們公司,每一個(gè)項(xiàng)目都有很嚴(yán)格的評審,只有評審?fù)ㄟ^了,才能做下一步的工
作。以做邏輯為例,并不是一上來就開始寫代碼,而是要先寫總體設(shè)計(jì)方案和邏輯詳細(xì)
設(shè)計(jì)方案,要等這些方案評審?fù)ㄟ^,認(rèn)為可行了,才能進(jìn)行編碼,一般來說這部分工作
所占的時(shí)間要遠(yuǎn)大于編碼的時(shí)間。
總體方案主要是涉及模塊劃分,一級模塊和二級模塊的接口信號和時(shí)序(我們要求
把接口信號的時(shí)序波形描述出來)以及將來如何測試設(shè)計(jì)。在這一級方案中,要保證在
今后的設(shè)計(jì)中時(shí)序要收斂到一級模塊(最后是在二級模塊中)。什么意思呢?我們在做
詳細(xì)設(shè)計(jì)的時(shí)候,對于一些信號的時(shí)序肯定會(huì)做一些調(diào)整的,但是這種時(shí)序的調(diào)整最多
只能波及到本一級模塊,而不能影響到整個(gè)設(shè)計(jì)。記得以前在學(xué)校做設(shè)計(jì)的時(shí)候,由于
不懂得設(shè)計(jì)時(shí)序,經(jīng)常因?yàn)橛幸惶幮盘柕臅r(shí)序不滿足,結(jié)果不得不將其它模塊信號的時(shí)
序也改一下,搞得人很郁悶。
在邏輯詳細(xì)設(shè)計(jì)方案這一級的時(shí)候,我們已經(jīng)將各級模塊的接口時(shí)序都設(shè)計(jì)出來了
,各級模塊內(nèi)部是怎么實(shí)現(xiàn)的也基本上確定下來了。
由于做到這一點(diǎn),在編碼的時(shí)候自然就很快了,最重要的是這樣做后可以讓設(shè)計(jì)會(huì)
一直處于可控的狀態(tài),不會(huì)因?yàn)槟骋惶幍腻e(cuò)誤引起整個(gè)設(shè)計(jì)從頭進(jìn)行。
2規(guī)范很重要
工作過的朋友肯定知道,公司里是很強(qiáng)調(diào)規(guī)范的,特別是對于大的設(shè)計(jì)(無論軟件軟件
還是硬件),不按照規(guī)范走幾乎是不可實(shí)現(xiàn)的。邏輯設(shè)計(jì)也是這樣:如果不按規(guī)范做的
話,過一個(gè)月后調(diào)試時(shí)發(fā)現(xiàn)有錯(cuò),回頭再看自己寫的代碼,估計(jì)很多信號功能都忘了,
更不要說檢錯(cuò)了;如果一個(gè)項(xiàng)目做了一半一個(gè)人走了,接班的估計(jì)得從頭開始設(shè)計(jì);如
果需要在原來的版本基礎(chǔ)上增加新功能,很可能也得從頭來過,很難做到設(shè)計(jì)的可重用
性。
在邏輯方面,我覺得比較重要的規(guī)范有這些:
1.設(shè)計(jì)必須文檔化。要將設(shè)計(jì)思路,詳細(xì)實(shí)現(xiàn)等寫入文檔,然后經(jīng)過嚴(yán)格評審?fù)ㄟ^
后才能進(jìn)行下一步的工作。這樣做乍看起來很花時(shí)間,但是從整個(gè)項(xiàng)目過程來看,絕對
要比一上來就寫代碼要節(jié)約時(shí)間,且這種做法可以使項(xiàng)目處于可控、可實(shí)現(xiàn)的狀態(tài)。
2.代碼規(guī)范。
a.設(shè)計(jì)要參數(shù)化。比如一開始的設(shè)計(jì)時(shí)鐘周期是30ns,復(fù)位周期是5個(gè)時(shí)鐘周期,我
們可以這么寫:
parameter CLK_PERIOD = 30;
parameter RST_MUL_TIME = 5;
parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;
...
rst_n = 1'b0;
# RST_TIME rst_n = 1'b1;
...
# CLK_PERIOD/2 clk <= ~clk;
如果在另一個(gè)設(shè)計(jì)中的時(shí)鐘是40ns,復(fù)位周期不變,我們只需對CLK_PERIOD進(jìn)行重
新例化就行了,從而使得代碼更加易于重用。
b.信號命名要規(guī)范化。
1) 信號名一律小寫,參數(shù)用大寫。
2) 對于低電平有效的信號結(jié)尾要用_n標(biāo)記,如rst_n。
3) 端口信號排列要統(tǒng)一,一個(gè)信號只占一行,最好按輸入輸出及從哪個(gè)模塊來到哪
個(gè)模塊去的關(guān)系排列,這樣在后期仿真驗(yàn)證驗(yàn)證找錯(cuò)時(shí)后 方便很多。如:
module a(
//input
clk,
rst_n, //globle signal
wren,
rden,
avalon_din, //related to avalon bus
sdi, //related to serial port input
//output
data_ready,
avalon_dout, //related to avalon bus
...
);
4) 一個(gè)模塊盡量只用一個(gè)時(shí)鐘,這里的一個(gè)模塊是指一個(gè)module或者是一個(gè)en
tity。在多時(shí)鐘域的設(shè)計(jì)中涉及到跨時(shí)鐘域的設(shè)計(jì)中最好有專門一個(gè)模塊做時(shí)鐘域的隔
離。這樣做可以讓綜合器綜合出更優(yōu)的結(jié)果。
5) 盡量在底層模塊上做邏輯,在高層盡量做例化,頂層模塊只能做例化,禁止
出現(xiàn)任何膠連邏輯(glue logic),哪怕僅僅是對某個(gè)信號取反。理由同上。
6) 在FPGAFPGA的設(shè)計(jì)上禁止用純組合邏輯產(chǎn)生latch,帶D觸發(fā)器的latch的是允許的
,比如配置寄存器就是這種類型。
7) 一般來說,進(jìn)入FPGA的信號必須先同步,以提高系統(tǒng)工作頻率(板級)。
8) 所有模塊的輸出都要寄存器化,以提高工作頻率,這對設(shè)計(jì)做到時(shí)序收斂也
是極有好處的。
9) 除非是低功耗設(shè)計(jì),不然不要用門控時(shí)鐘--這會(huì)增加設(shè)計(jì)的不穩(wěn)定性,在要
用到門控時(shí)鐘的地方,也要將門控信號用時(shí)鐘的下降沿 打一拍再輸出與時(shí)鐘相與。
clk_gate_en -------- ----
-----------------|D Q |------------------| \ gate_clk
_out
| | ---------| )--------
-
------o|> | | | /
clk | -------- | ----
------------------------------------
10)禁止用計(jì)數(shù)器分頻后的信號做其它模塊的時(shí)鐘,而要用改成時(shí)鐘使能的方式
,否則這種時(shí)鐘滿天飛的方式對設(shè)計(jì)的可靠性極為不利,也大大增加了靜態(tài)時(shí)序分析的
復(fù)雜性。如FPGA的輸入時(shí)鐘是25M的,現(xiàn)在系統(tǒng)內(nèi)部要通過RS232與PC通信,要以rs232_
1xclk的速率發(fā)送數(shù)據(jù)。
不要這樣做:
always (posedge rs232_1xclk or negedge rst_n)
begin
...
end
而要這樣做:
always (posedge clk_25m or negedge rst_n)
begin
...
else if ( rs232_1xclk == 1'b1 )
...
end
11)狀態(tài)機(jī)要寫成3段式的(這是最標(biāo)準(zhǔn)的寫法),即
...
always @(posedge clk or negedge rst_n)
...
current_state <= next_state;
...
always @ (current_state ...)
...
case(current_state)
...
s1:
if ...
next_state = s2;
...
...
always @(posedge clk or negedge rst_n)
...
else
a <= 1'b0;
c <= 1'b0;
c <= 1'b0; //賦默認(rèn)值
case(current_state)
s1:
a <= 1'b0; //由于上面賦了默認(rèn)值,這里就不用再對b
、c賦值了
s2:
b <= 1'b1;
s3:
c <= 1'b1;
default:
...
...
3.ALTERA參考設(shè)計(jì)準(zhǔn)則
1) Ensure Clock, Preset, and Clear configurations are free of glitch
es.
2) Never use Clocks consisting of more than one level of combinatori
al logic.
3) Carefully calculate setup times and hold times for multi-Clock sy
stems.
4) Synchronize signals between flipflops in multi-Clock systems when
the setup and hold time requirements cannot be met.
5) Ensure that Preset and Clear signals do not contain race conditio
ns.
6) Ensure that no other internal race conditions exist.
7) Register all glitch-sensitive outputs.
8) Synchronize all asynchronous inputs.
9) Never rely on delay chains for pin-to-pin or internal delays.
10)Do not rely on Power-On Reset. Use a master Reset pin to clear al
l flipflops.
11)Remove any stuck states from state machines or synchronous logic.
其它方面的規(guī)范一時(shí)沒有想到,想到了再寫,也歡迎大家補(bǔ)充。
3/如何提高電路工作頻率
對于設(shè)計(jì)者來說,我們當(dāng)然希望我們設(shè)計(jì)的電路的工作頻率(在這里如無特別說明
,工作頻率指FPGA片內(nèi)的工作頻率)盡量高。我們也經(jīng)常聽說用資源換速度,用流水的
方式可以提高工作頻率,這確實(shí)是一個(gè)很重要的方法,今天我想進(jìn)一步去分析該如何提
高電路的工作頻率。
我們先來分析下是什么影響了電路的工作頻率。
我們電路的工作頻率主要與寄存器到寄存器之間的信號傳播時(shí)延及clock skew有關(guān)
。在FPGA內(nèi)部如果時(shí)鐘走長線的話,clock skew很小,基本上可以忽略, 在這里為了簡
單起見,我們只考慮信號的傳播時(shí)延的因素。
信號的傳播時(shí)延包括寄存器的開關(guān)時(shí)延、走線時(shí)延、經(jīng)過組合邏輯的時(shí)延(這樣劃
分或許不是很準(zhǔn)確,不過對分析問題來說應(yīng)該是沒有可以的),要提高電路的工作頻率
,我們就要在這三個(gè)時(shí)延中做文章,使其盡可能的小。
我們先來看開關(guān)時(shí)延,這個(gè)時(shí)延是由器件物理特性決定的,我們沒有辦法去改變,
所以我們只能通過改變走線方式和減少組合邏輯的方法來提高工作頻率。
1.通過改變走線的方式減少時(shí)延。
以altera的器件為例,我們在quartus里面的timing closure floorplan可以看到有
很多條條塊塊,我們可以將條條塊塊按行和按列分,每一個(gè)條塊代表1個(gè)LAB,每個(gè)LAB里
有8個(gè)或者是10個(gè)LE。它們的走線時(shí)延的關(guān)系如下:同一個(gè)LAB中(最快) < 同列或者同
行 < 不同行且不同列。
我們通過給綜合器加適當(dāng)?shù)募s束(不可貪心,一般以加5%裕量較為合適,比如電路
工作在100Mhz,則加約束加到105Mhz就可以了,貪心效果反而不好,且極大增加綜合時(shí)
間)可以將相關(guān)的邏輯在布線時(shí)盡量布的靠近一點(diǎn),從而減少走線的時(shí)延。(注:約束
的實(shí)現(xiàn)不完全是通過改進(jìn)布局布線方式去提高工作頻率,還有其它的改進(jìn)措施)
2.通過減少組合邏輯的減少時(shí)延。
上面我們講了可以通過加約束來提高工作頻率,但是我們在做設(shè)計(jì)之初可萬萬不可
將提高工作頻率的美好愿望寄托在加約束上,我們要通過合理的設(shè)計(jì)去避免出現(xiàn)大的組
合邏輯,從而提高電路的工作頻率,這才能增強(qiáng)設(shè)計(jì)的可移植性,才可以使得我們的設(shè)
計(jì)在移植到另一同等速度級別的芯片時(shí)還能使用。
我們知道,目前大部分FPGA都基于4輸入LUT的,如果一個(gè)輸出對應(yīng)的判斷條件大于
四輸入的話就要由多個(gè)LUT級聯(lián)才能完成,這樣就引入一級組合邏輯時(shí)延,我們要減少組
合邏輯,無非就是要輸入條件盡可能的少,,這樣就可以級聯(lián)的LUT更少,從而減少了組
合邏輯引起的時(shí)延。
我們平時(shí)聽說的流水就是一種通過切割大的組合邏輯(在其中插入一級或多級D觸發(fā)
器,從而使寄存器與寄存器之間的組合邏輯減少)來提高工作頻率的方法。比如一個(gè)32
位的計(jì)數(shù)器,該計(jì)數(shù)器的進(jìn)位鏈很長,必然會(huì)降低工作頻率,我們可以將其分割成4位和
8位的計(jì)數(shù),每當(dāng)4位的計(jì)數(shù)器計(jì)到15后觸發(fā)一次8位的計(jì)數(shù)器,這樣就實(shí)現(xiàn)了計(jì)數(shù)器的切
割,也提高了工作頻率。
在狀態(tài)機(jī)中,一般也要將大的計(jì)數(shù)器移到狀態(tài)機(jī)外,因?yàn)橛?jì)數(shù)器這東西一般是經(jīng)常
是大于4輸入的,如果再和其它條件一起做為狀態(tài)的跳變判據(jù)的話,必然會(huì)增加LUT的級
聯(lián),從而增大組合邏輯。以一個(gè)6輸入的計(jì)數(shù)器為例,我們原希望當(dāng)計(jì)數(shù)器計(jì)到111100后
狀態(tài)跳變,現(xiàn)在我們將計(jì)數(shù)器放到狀態(tài)機(jī)外,當(dāng)計(jì)數(shù)器計(jì)到111011后產(chǎn)生個(gè)enable信號
去觸發(fā)狀態(tài)跳變,這樣就將組合邏輯減少了。
上面說的都是可以通過流水的方式切割組合邏輯的情況,但是有些情況下我們是很
難去切割組合邏輯的,在這些情況下我們又該怎么做呢?
狀態(tài)機(jī)就是這么一個(gè)例子,我們不能通過往狀態(tài)譯碼組合邏輯中加入流水。如果我
們的設(shè)計(jì)中有一個(gè)幾十個(gè)狀態(tài)的狀態(tài)機(jī),它的狀態(tài)譯碼邏輯將非常之巨大,毫無疑問,
這極有可能是設(shè)計(jì)中的關(guān)鍵路徑。那我們該怎么做呢?還是老思路,減少組合邏輯。我
們可以對狀態(tài)的輸出進(jìn)行分析,對它們進(jìn)行重新分類,并根據(jù)這個(gè)重新定義成一組組小
狀態(tài)機(jī),通過對輸入進(jìn)行選擇(case語句)并去觸發(fā)相應(yīng)的小狀態(tài)機(jī),從而實(shí)現(xiàn)了將大的
狀態(tài)機(jī)切割成小的狀態(tài)機(jī)。在ATA6的規(guī)范中(硬盤的標(biāo)準(zhǔn)),輸入的命令大概有20十種
,每一個(gè)命令又對應(yīng)很多種狀態(tài),如果用一個(gè)大的狀態(tài)機(jī)(狀態(tài)套狀態(tài))去做那是不可
想象的,我們可以通過case語句去對命令進(jìn)行譯碼,并觸發(fā)相應(yīng)的狀態(tài)機(jī),這樣做下來
這一個(gè)模塊的頻率就可以跑得比較高了。
總結(jié):提高工作頻率的本質(zhì)就是要減少寄存器到寄存器的時(shí)延,最有效的方法就是
避免出現(xiàn)大的組合邏輯,也就是要盡量去滿足四輸入的條件,減少LUT級聯(lián)的數(shù)量。我們
可以通過加約束、流水、切割狀態(tài)的方法提高工作頻率。
4/ 做邏輯的難點(diǎn)在于系統(tǒng)結(jié)構(gòu)設(shè)計(jì)和仿真驗(yàn)證
剛?cè)ス镜臅r(shí)候BOSS就和我講,做邏輯的難點(diǎn)不在于RTL級代碼的設(shè)計(jì),而在于系統(tǒng)
結(jié)構(gòu)設(shè)計(jì)和仿真驗(yàn)證方面。目前國內(nèi)對可綜合的設(shè)計(jì)強(qiáng)調(diào)的比較多,而對系統(tǒng)結(jié)構(gòu)設(shè)計(jì)
和仿真驗(yàn)證方面似乎還沒有什么資料,這或許也從一個(gè)側(cè)面反映了國內(nèi)目前的設(shè)計(jì)水平
還比較低下吧。
以前在學(xué)校的時(shí)候,總是覺得將RTL級代碼做好就行了,仿真驗(yàn)證只是形式而已,所
以對HDL的行為描述方面的語法不屑一顧,對testbench也一直不愿意去學(xué)--因?yàn)橛X得畫
波形圖方便;對于系統(tǒng)結(jié)構(gòu)設(shè)計(jì)更是一點(diǎn)都不懂了。
到了公司接觸了些東西才發(fā)現(xiàn)完全不是這樣。
其實(shí)在國外,花在仿真驗(yàn)證上的時(shí)間和人力大概是花在RTL級代碼上的兩倍,現(xiàn)在仿
真驗(yàn)證才是百萬門級芯片設(shè)計(jì)的關(guān)鍵路徑。仿真驗(yàn)證的難點(diǎn)主要在于怎么建模才能完全
和準(zhǔn)確地去驗(yàn)證設(shè)計(jì)的正確性(主要是提高代碼覆蓋),在這過程中,驗(yàn)證速度也是很
重要的。
驗(yàn)證說白了也就是怎么產(chǎn)生足夠覆蓋率的激勵(lì)源,然后怎么去檢測錯(cuò)誤。我個(gè)人認(rèn)
為,在仿真驗(yàn)證中,最基本就是要做到驗(yàn)證的自動(dòng)化。這也是為什么我們要寫testbenc
h的原因。在我現(xiàn)在的一個(gè)設(shè)計(jì)中,每次跑仿真都要一個(gè)小時(shí)左右(這其實(shí)算小設(shè)計(jì))。
由于畫波形圖無法做到驗(yàn)證自動(dòng)化,如果用通過畫波形圖來仿真的話,一是畫波形會(huì)畫
死(特別是對于算法復(fù)雜的、輸入呈統(tǒng)計(jì)分布的設(shè)計(jì)),二是看波形圖要看死,三是檢
錯(cuò)率幾乎為零。
那么怎么做到自動(dòng)化呢?我個(gè)人的水平還很有限,只能簡單地談下BFM(bus funct
ion model,總線功能模型)。
以做一個(gè)MAC的core為例(背板是PCI總線),那么我們需要一個(gè)MAC_BFM和PCI_BFM
及PCI_BM(PCI behavior model)。MAC_BFM的主要功能是產(chǎn)生以太網(wǎng)幀(激勵(lì)源),隨
機(jī)的長度和幀頭,內(nèi)容也是隨機(jī)的,在發(fā)送的同時(shí)也將其復(fù)制一份到PCI_BM中;PCI_BFM
的功能則是仿PCI總線的行為,比如被測收到了一個(gè)正確幀后會(huì)向PCI總線發(fā)送一個(gè)
請求,PCI_BFM則會(huì)去響應(yīng)它,并將數(shù)據(jù)收進(jìn)來;PCI_BM的主要功能是將MAC_BFM發(fā)送出
來的東西與PCI_BFM接收到的東西做比較,由于它具有了MAC_BFM的發(fā)送信息和PCI_BFM的
接收信息,只要設(shè)計(jì)合理,它總是可以自動(dòng)地、完全地去測試被測是否工作正常,
從而實(shí)現(xiàn)自動(dòng)檢測。
華為在仿真驗(yàn)證方面估計(jì)在國內(nèi)來說是做的比較好的,他們已建立起了比較好的驗(yàn)
證平臺,大部分與通信有關(guān)的BFM都做好了,聽我朋友說,現(xiàn)在他們只需要將被測放
在測試平臺中,并配置好參數(shù),就可以自動(dòng)地檢測被測功能的正確與否。
在功能仿真做完后,由于我們做在是FPGA的設(shè)計(jì),在設(shè)計(jì)時(shí)已經(jīng)基本保證RTL級代碼
在綜合結(jié)果和功能仿真結(jié)果的一致性,只要綜合布局布線后的靜態(tài)時(shí)序報(bào)告沒有違反時(shí)
序約束的警告,就可以下到板子上去調(diào)試了。事實(shí)上,在華為中興,他們做FPGA的設(shè)計(jì)
時(shí)也是不做時(shí)序仿真的,因?yàn)樽鰰r(shí)序仿真很花時(shí)間,且效果也不見得比看靜態(tài)時(shí)序分析
報(bào)告好。
當(dāng)然了,如果是ASICASIC的設(shè)計(jì)話,它們的仿真驗(yàn)證的工作量要大一些,在涉及到多時(shí)
鐘域的設(shè)計(jì)時(shí),一般還是做后仿的。不過在做后仿之前,也一般會(huì)先用形式驗(yàn)證工具和
通過靜態(tài)時(shí)序分序報(bào)告去查看有沒有違反設(shè)計(jì)要求的地方,這樣做了之后,后仿的工作
量可以小很多。
在HDL語言HDL語言方面,國內(nèi)語言很多人都在爭論VHDLVHDL和verilogverilog哪個(gè)好,其實(shí)我個(gè)人認(rèn)為
這并沒有多大的意義,外面的大公司基本上都是用verilog在做RTL級的代碼,所以還是
建議大家盡量學(xué)verilog。在仿真方面,由于VHDL在行為級建模方面弱于verilog,用VH
DL做仿真模型的很少,當(dāng)然也不是說verilog就好,其實(shí)verilog在復(fù)雜的行為級建模方
面的能力也是有限的,比如目前它還不支持?jǐn)?shù)組。在一些復(fù)雜的算法設(shè)計(jì)中,需要高級
語言做抽象才能描述出行為級模型。在國外,仿真建模很多都是用System C和E語言,用
verilog的都算是很落后的了,國內(nèi)華為的驗(yàn)證平臺好像是用System C寫。
在系統(tǒng)結(jié)構(gòu)設(shè)計(jì)方面,由于我做的設(shè)計(jì)還不夠大,還談不上什么經(jīng)驗(yàn),只是覺得必
須要具備一些計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)的知識才行。劃分的首要依據(jù)是功能,之后是選擇合適的
總線結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)和處理器架構(gòu),通過系統(tǒng)結(jié)構(gòu)劃分要使各部分功能模塊清晰,易于
實(shí)現(xiàn)。這一部分我想過段時(shí)間有一點(diǎn)體會(huì)了再和大家分享,就先不誤導(dǎo)大家了。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(fù)(0)
發(fā)表于 2010/4/18 16:20:21
淺淡邏輯設(shè)計(jì)的學(xué)習(xí) 學(xué)習(xí)邏輯設(shè)計(jì)首先要有項(xiàng)目掛靠,如果你覺得未來一段時(shí)間你都不可能有的話,接下來的內(nèi)容你就沒有必要再看了,花的時(shí)間再多也只能學(xué)到皮毛--很多細(xì)節(jié)的問題光寫代碼是發(fā)現(xiàn)不到的。而且要真正入門,最好要多做幾個(gè)項(xiàng)目(這三年大大小小的項(xiàng)目我做有七八個(gè)),總線型的和數(shù)字信號處理型的最好都要接觸一些,因?yàn)檫@兩個(gè)方向的邏輯設(shè)計(jì)差異比較大:前者主要是控制型的,會(huì)涉及到狀態(tài)機(jī)等控制邏輯;后者主要是計(jì)算型的,難點(diǎn)主要在對符號、浮點(diǎn)數(shù)轉(zhuǎn)定點(diǎn)數(shù)、位寬等方面的處理上。第二要有好的師父。這里說的好的師父并不是指畫原理圖畫了幾十年的老師傅,而是指曾在專業(yè)IC公司做過一段時(shí)間的人,好的專業(yè)IC公司可以接觸國內(nèi)外最新的設(shè)計(jì)思想,在他們的幫助下,起點(diǎn)就可以比其他人高不少,更重要的是你可以學(xué)習(xí)邏輯設(shè)計(jì)思想性的東西!如果你的師傅經(jīng)常跟你說畫原理圖的好處,你還是重新找過師父算了--用原理圖設(shè)計(jì)是一種很落后的方式,即使他們可能會(huì)說可以系統(tǒng)級設(shè)計(jì)(專業(yè)的IC設(shè)計(jì)公司系統(tǒng)級設(shè)計(jì)絕對是由方案保證的,而不會(huì)靠原理圖這鬼東西)更為清淅。第三要看一些好的資料。RTL級的書中《硬件描述語言》、先鋒寫的那幾本書都還可以,還有不得不提的是cliff的一些上有)Writting Testbenches》,提高可以看下snug(Synopsys的用戶論壇,里面的文章基本上反映了業(yè)界的領(lǐng)先水平)的paper;系統(tǒng)級的可以看看《片上系統(tǒng)-可重用性設(shè)計(jì)方法學(xué)》。第四要自己多總結(jié),多動(dòng)腦筋。邏輯設(shè)計(jì)的東西其實(shí)本質(zhì)上的東西并不多:把RTL級的常用的D觸發(fā)器、計(jì)數(shù)器、移位寄存器、狀態(tài)機(jī)、多路選擇器等基本的電路標(biāo)準(zhǔn)化、固定化;先做方案再寫代碼;設(shè)計(jì)時(shí)序;知道約束原理及怎么加約束;劃分模塊時(shí)知道怎么做到時(shí)序收斂;做驗(yàn)證的時(shí)候熟悉相應(yīng)語言的行為級描述(這個(gè)肯定比RTL級好學(xué)多了)然后就是理解testbench的結(jié)構(gòu)化設(shè)計(jì)。把這些東西的本質(zhì)都搞清楚了做個(gè)合格的邏輯工程師應(yīng)該是綽綽有余了,呵呵。在接下來的部分我主要就第四點(diǎn)隨便說點(diǎn)自己的經(jīng)驗(yàn),說的不好還請大家批評指正。
入門前
剛才開始接觸邏輯設(shè)計(jì)很多人會(huì)覺得很簡單:因?yàn)関erilog的語法不多,半天就可以把書看完了。但是很快許多人就發(fā)現(xiàn)這個(gè)想法是錯(cuò)誤的,他們經(jīng)常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環(huán)寫的一個(gè)計(jì)數(shù)器都不認(rèn)識!相信上一段的經(jīng)歷大部分人都曾有,原因是做邏輯設(shè)計(jì)的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。在這個(gè)過程中首先要明白的是軟件設(shè)計(jì)和邏輯設(shè)計(jì)的不同,并理解什么是硬件意識。軟件代碼的執(zhí)行是一個(gè)順序的過程,編繹以后的機(jī)器碼放在存儲(chǔ)器里,等著CPU一條一條的取指并執(zhí)行;因此軟件設(shè)計(jì)中經(jīng)常會(huì)帶有順序處理的思維。而邏輯設(shè)計(jì)則不同,我們設(shè)計(jì)的是數(shù)字電路,它是由很多很多的與非門及D觸發(fā)器構(gòu)成的,上電之后所有與非門和D觸發(fā)器都同時(shí)工作,不會(huì)因?yàn)锳觸發(fā)器的代碼描述在B觸發(fā)器之前A觸發(fā)器就是先工作,事實(shí)上,RTL級代碼的代碼先后順序在綜合成網(wǎng)表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯(lián)關(guān)系描述;因此邏輯設(shè)計(jì)需要的是一種并發(fā)的思維,我們也需要用并發(fā)的思維去考慮電路的設(shè)計(jì)。當(dāng)然,我們設(shè)計(jì)的電路功能一般都有先后順序的關(guān)系,如果這種順序不能通過代碼的先后順序來實(shí)現(xiàn),那么要怎么完成這一功能呢?在邏輯設(shè)計(jì)中,我們所說的先后順序都是基于時(shí)間軸來實(shí)現(xiàn):它的承載體就是時(shí)序邏輯,也就是那些觸發(fā)器。硬件意識的東西網(wǎng)上談?wù)摰囊呀?jīng)很多,這里就不再多說了。其次就是要熟悉基本電路的設(shè)計(jì)。基本的電路不是很多,也就是D觸發(fā)器、計(jì)數(shù)器、移位寄存器、狀態(tài)機(jī)、多路選擇器、譯碼器等幾種,所有復(fù)雜的電路都可由這些基本的電路構(gòu)成。高手水平高的體現(xiàn)并不是他能寫出一些很奇特的電路,相反,水平高是體現(xiàn)在他們總能將復(fù)雜的電路用這些很樸素的基本電路去描述。甚至,你會(huì)發(fā)現(xiàn)他們的代碼基本上是由if...else、case這些語句構(gòu)成的,樸素的讓你覺得奇怪。我認(rèn)為,初學(xué)者在入門的時(shí)候,對于基本電路的設(shè)計(jì)應(yīng)該固定化、標(biāo)準(zhǔn)化,每種電路該用什么樣的代碼描述,應(yīng)該要固定、統(tǒng)一,盡量少一些花哨的東西。說來這里我舉個(gè)例子。以前有幾個(gè)朋友因?yàn)榉抡嬗袉栴}請我?guī)兔φ覇栴}。他們的代碼寫的很亂,出現(xiàn)了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標(biāo)準(zhǔn)的電路重新寫下代碼。結(jié)果過了半天,他們就和我說問題不見了。所以,高手們喜歡用簡單的代碼是有道理的,電路的標(biāo)準(zhǔn)化和規(guī)范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時(shí)候回家多睡回覺,呵呵。總之,簡單的、樸素的就是最好的。最后是代碼的規(guī)范化。代碼規(guī)范主要是代碼書寫、命名等規(guī)范。比如不能用TAB鍵空格、低電平有效信號命名時(shí)加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網(wǎng)上也很多,這里只是強(qiáng)烈建議大家要嚴(yán)格遵守,像華為等公司如果代碼不規(guī)范的話肯定是要打回去重寫的。
入門
結(jié)合一兩個(gè)小項(xiàng)目把上面所說的事情都做好后,差不多就可以進(jìn)入入門的階段了(要求稍微嚴(yán)格了一點(diǎn)點(diǎn),呵呵)。入門階段要學(xué)的有:設(shè)計(jì)時(shí)序;理解約束的原理及如何加約束。先談?wù)勗O(shè)計(jì)時(shí)序。設(shè)計(jì)時(shí)序是進(jìn)行邏輯設(shè)計(jì)的基本要求:時(shí)序是設(shè)計(jì)出來的,不是仿出來的,更不是湊出來的。很多人在做邏輯設(shè)計(jì)時(shí)喜歡一上來就狂寫代碼,寫到一半后發(fā)現(xiàn)信號間的時(shí)序出問題了,只好推倒重來;好不容易反復(fù)了幾次之后,通過仿真軟件看了下,差不多要對了,于是再湊一下時(shí)序,竟然對了!但這個(gè)做法除了設(shè)計(jì)周期長外,代碼的質(zhì)量也難以保證,往往存在很多冗余的邏輯,甚至有一些隱藏著較深的bug。為什么會(huì)出現(xiàn)上面的問題呢?因?yàn)槲覀冊O(shè)計(jì)的是數(shù)字邏輯,而信號之間的邏輯關(guān)系往往是比較復(fù)雜的,在內(nèi)部信號很多的情況下,僅憑拍下腦袋就寫代碼肯定是不能理清楚它們之前的復(fù)雜的關(guān)系,所以出錯(cuò)在所難免。正確的做法是我們要先對整個(gè)設(shè)計(jì)有一些規(guī)劃--時(shí)時(shí)刻刻都要有設(shè)計(jì)時(shí)序的思想。設(shè)計(jì)時(shí)序最重要的是做好方案,這里說的方案絕不是只是擺幾個(gè)框圖在那里。我們在做設(shè)計(jì)的時(shí)候需要做總體設(shè)計(jì)方案、邏輯詳細(xì)設(shè)計(jì)方案。這兩種方案包括了很多東西,邏輯總體方案主要是一級模塊的劃分及接口時(shí)序的定義,而邏輯詳細(xì)方案就是代碼的文字及圖形描述!對于入門者來說,接觸的比較多的是邏輯詳細(xì)設(shè)計(jì)方案。在這一級別的方案中,我們是要求的是至少要做到模塊內(nèi)部所有關(guān)鍵信號的時(shí)序都要先設(shè)計(jì)好,這里講的設(shè)計(jì)時(shí)序主要就是畫波形圖,在一個(gè)操作周期內(nèi)每個(gè)信號在每一個(gè)時(shí)鐘周期該是什么樣子就畫成什么樣子。附圖(時(shí)序圖)是我曾設(shè)計(jì)的一個(gè)模塊的主要信號時(shí)序:aes_cnt信號控制著w_fifo_rden、aes_ready等信號,是該模塊的關(guān)鍵信號,通過將它們之間的時(shí)序關(guān)系通過時(shí)序圖反應(yīng)出來,寫代碼時(shí)就可以做到胸有成竹,減少出現(xiàn)邏輯混亂的情況。聽起來似乎很簡單,但是執(zhí)行起來卻不容易,因?yàn)楫嫴ㄐ螆D是一件很煩鎖的事(有一次一個(gè)模塊因?yàn)椴僮鞅容^多我畫了8張時(shí)序圖)。但是請相信我,如果不這樣做,因?yàn)闀r(shí)序關(guān)系沒有處理好引起設(shè)計(jì)多次迭代所花的時(shí)間遠(yuǎn)多于畫波形圖的時(shí)間。時(shí)序設(shè)計(jì)好之后,模塊內(nèi)部各個(gè)信號之間的關(guān)系就理得差不多了,之后就是將它翻譯成代碼了,這個(gè)過程以體力勞動(dòng)為主,我就不多說了。補(bǔ)充一下,畫波形圖推薦用TimingDesigner這個(gè)軟件,如果有更好的,請告訴我,我也不喜歡。另一個(gè)就是約束。這里的約束是針對綜合軟件和布局布線軟件而言的。為什么會(huì)有約束這個(gè)東西出現(xiàn)呢?主要原因是EDA軟件比較笨,難以明白我們的心思,如果我們不把更詳細(xì)的信息告訴它的話它就干不好活,比如需要將輸出寄存器放的與輸出管腳近一點(diǎn),如果不加約束,EDA軟件可能布通之后就不管了,導(dǎo)致Tco狂大,一點(diǎn)也不善解人意。所以我們需要約束這個(gè)東西,告訴EDA軟件要怎么干活,工程驗(yàn)收的標(biāo)準(zhǔn)又是什么。在加約束之前,我們首先要定義一些術(shù)語好告訴EDA軟件我們想干什么,這些術(shù)語便是Fmax、Tsu、Tco等等這些東西。這些東西的含義這里就不多說了,網(wǎng)上的討論已經(jīng)很多了。有了術(shù)語,還要有一種通信方式與EDA軟件通信,腳本語言充當(dāng)了這一角色。不過現(xiàn)在像quartus這類軟件做的比較智能化了,提供了圖形化界面,但是這背后支撐的還是些腳本語言,大家可以用UltraEdit打加*.qsf文件去看看我們加的約束用腳本語言是怎么寫的。
在加了約束之后,EDA工具就可以更好地按照我們的意愿去干活了,比較我們加了Fmax的約束,它就會(huì)盡可能地將關(guān)鍵路徑放的靠近一些,以提高電路工作頻率。當(dāng)然,這是有代價(jià)的,尋找路徑是需要時(shí)間的,要求越苛刻,時(shí)間花的越多,因此加約束的原則的適用就行。如果約束加的過高,就相當(dāng)于讓EDA工具去做一件不可能完成的事,找更短的路徑的時(shí)候說不定找著找著就掉下懸崖了,效果反而更差。雖然有約束這個(gè)好東西,不過提醒一下,在項(xiàng)目之前千萬對它抱有太多的幻想,把希望寄托在別人的身上并不是每一次都很可靠的,出了問題還是要麻煩自己,加約束只能做一些錦上添花的事情。所以,我們在做方案的時(shí)候就需要對關(guān)鍵路徑進(jìn)行預(yù)估,要通過設(shè)計(jì)而不是約束解決這些問題。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(fù)(0)
發(fā)表于 2010/4/18 16:20:21
ASIC與FPGA的區(qū)別(轉(zhuǎn)) ASIC:application specific integrated circuit專用集成電路,它是面向?qū)iT用途的電路。它可以分為全定制,定制,半定制,可編程ASIC。
FPGA:field programmble gate array一種可編程的ASIC,現(xiàn)在已重ASIC的概念中分化出來。
各自的特點(diǎn)為:
ASIC特性
?嵌入式設(shè)計(jì)
?產(chǎn)量大
?可以不涉及布局布線工作
?ASIC可以支持高速和高度復(fù)雜的門級設(shè)計(jì)
?需要與ASIC廠商密切合作
FPGA特性:
?FPGA主要用作樣片試制
?若用于市場需求比較少量的設(shè)計(jì),一般不超過一千片
?FPGA等于簡單ASIC
?減少庫存與設(shè)計(jì)錯(cuò)誤的危險(xiǎn)性
?資金投入少
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/18 16:20:21
同步復(fù)位和異步復(fù)位的比較 一、特點(diǎn):
同步復(fù)位:顧名思義,同步復(fù)位就是指復(fù)位信號只有在時(shí)鐘上升沿到來時(shí),才能有效。否則,無法完成對系統(tǒng)的復(fù)位工作。用描述如下:
always @ (posedge clk) begin
if (!Rst_n)
...
end
異步復(fù)位:它是指無論時(shí)鐘沿是否到來,只要復(fù)位信號有效,就對系統(tǒng)進(jìn)行復(fù)位。用Verilog描述如下:
always @ (posedge clk or negedge Rst_n) begin
if (!Rst_n)
...
end
二、各自的優(yōu)缺點(diǎn):
1、總的來說,同步復(fù)位的優(yōu)點(diǎn)大概有3條:
a、有利于仿真器的仿真。
b、可以使所設(shè)計(jì)的系統(tǒng)成為100%的同步時(shí)序電路,這便大大有利于時(shí)序分析,而且綜合出來的fmax一般較高。
c、因?yàn)樗挥性跁r(shí)鐘有效電平到來時(shí)才有效,所以可以濾除高于時(shí)鐘頻率的毛刺。他的缺點(diǎn)也有不少,主要有以下幾條:
a、復(fù)位信號的有效時(shí)長必須大于時(shí)鐘周期,才能真正被系統(tǒng)識別并完成復(fù)位任務(wù)。同時(shí)還要考慮,諸如:clk skew,組合邏輯路徑延時(shí),復(fù)位延時(shí)等因素。
b、由于大多數(shù)的邏輯器件的目標(biāo)庫內(nèi)的DFF都只有異步復(fù)位端口,所以,倘若采用同步復(fù)位的話,綜合器就會(huì)在寄存器的數(shù)據(jù)輸入端口插入組合邏輯,這樣就會(huì)耗費(fèi)較多的邏輯資源。
2、對于異步復(fù)位來說,他的優(yōu)點(diǎn)也有三條,都是相對應(yīng)的
a、大多數(shù)目標(biāo)器件庫的dff都有異步復(fù)位端口,因此采用異步復(fù)位可以節(jié)省資源。
b、設(shè)計(jì)相對簡單。
c、異步復(fù)位信號識別方便,而且可以很方便的使用的全局復(fù)位端口GSR。
缺點(diǎn):
a、在復(fù)位信號釋放(release)的時(shí)候容易出現(xiàn)問題。具體就是說:倘若復(fù)位釋放時(shí)恰恰在時(shí)鐘有效沿附近,就很容易使寄存器輸出出現(xiàn)亞穩(wěn)態(tài),從而導(dǎo)致亞穩(wěn)態(tài)。
b、復(fù)位信號容易受到毛刺的影響。
三、總結(jié):
所以說,一般都推薦使用異步復(fù)位,同步釋放的方式,而且復(fù)位信號低電平有效。這樣就可以兩全其美了。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/18 16:20:21
Quartus警告分析 1.Found clock-sensitive change during active clock edge at time
<time> on register "<name>"
原因:vector source file中時(shí)鐘敏感信號(如:數(shù)據(jù),允許端,清零,同步加
載等)在時(shí)鐘的邊緣同時(shí)變化。而時(shí)鐘敏感信號是不能在時(shí)鐘邊沿變化的。其后
果為導(dǎo)致結(jié)果不正確。
措施:編輯vector source file
2.Verilog HDL assignment warning at <location>: truncated
with size <number> to match size of target (<number>
原因:在HDL設(shè)計(jì)中對目標(biāo)的位數(shù)進(jìn)行了設(shè)定,如:reg[4:0] a;而默認(rèn)為32位,
將位數(shù)裁定到合適的大小
措施:如果結(jié)果正確,無須加以修正,如果不想看到這個(gè)警告,可以改變設(shè)定的位數(shù)
3.All reachable assignments to data_out(10) assign '0', register
removed by optimization
原因:經(jīng)過綜合器優(yōu)化后,輸出端口已經(jīng)不起作用了
4.Following 9 pins have nothing, GND, or VCC driving datain port --
changes to this connectivity may change fitting results
原因:第9腳,空或接地或接上了電源
措施:有時(shí)候定義了輸出端口,但輸出端直接賦‘0’,便會(huì)被接地,賦‘1’接電源。
如果你的設(shè)計(jì)中這些端口就是這樣用的,那便可以不理會(huì)這些warning
5.Found pins ing as undefined clocks and/or memory enables
原因:是你作為時(shí)鐘的PIN沒有約束信息。可以對相應(yīng)的PIN做一下設(shè)定就行了。
主要是指你的某些管腳在電路當(dāng)中起到了時(shí)鐘管腳的作用,比如flip-flop的clk
管腳,而此管腳沒有時(shí)鐘約束,因此QuartusII把“clk”作為未定義的時(shí)鐘。
措施:如果clk不是時(shí)鐘,可以加“not clock”的約束;如果是,可以在clock
setting當(dāng)中加入;在某些對時(shí)鐘要求不很高的情況下,可以忽略此警告或在這
里修改:Assignments>Timing analysis settings...>Individual
clocks...>...
6.Timing characteristics of device EPM570T144C5 are preliminary
原因:因?yàn)镸AXII 是比較新的元件在 QuartusII 中的時(shí)序并不是正式版的,要
等 Service Pack
措施:只影響 Quartus 的 Waveform
7.Warning: Clock latency analysis for PLL offsets is supported for the
current device family, but is not enabled
措施:將setting中的timing Requirements&Option-->More Timing
Setting-->setting-->Enable Clock Latency中的on改成OFF
8.Found clock high time violation at 14.8 ns on register
"|counter|lpm_counter:count1_rtl_0|dffs[11]"
原因:違反了steup/hold時(shí)間,應(yīng)該是后仿真,看看波形設(shè)置是否和時(shí)鐘沿符
合steup/hold時(shí)間
措施:在中間加個(gè)寄存器可能可以解決問題
9.warning: circuit may not operate.detected 46 non-operational
paths clocked by clock clk44 with clock skew larger than data delay
原因:時(shí)鐘抖動(dòng)大于數(shù)據(jù)延時(shí),當(dāng)時(shí)鐘很快,而if等類的層次過多就會(huì)出現(xiàn)這種問
題,但這個(gè)問題多是在器件的最高頻率中才會(huì)出現(xiàn)
措施:setting-->timing Requirements&Options-->Default required
fmax 改小一些,如改到50MHZ
10.Design contains <number> input pin(s) that do not drive logic
原因:輸入引腳沒有驅(qū)動(dòng)邏輯(驅(qū)動(dòng)其他引腳),所有的輸入引腳需要有輸入邏輯
措施:如果這種情況是故意的,無須理會(huì),如果非故意,輸入邏輯驅(qū)動(dòng).
11.Warning:Found clock high time violation at 8.9ns on node
'TEST3.CLK'
原因:FF中輸入的PLS的保持時(shí)間過短
措施:在FF中設(shè)置較高的時(shí)鐘頻率
12.Warning: Found 10 node(s) in clock paths which may be acting as
ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in
clock skew
原因:如果你用的 CPLD 只有一組全局時(shí)鐘時(shí),用全局時(shí)鐘分頻產(chǎn)生的另一個(gè)時(shí)
鐘在布線中當(dāng)作信號處理,不能保證低的時(shí)鐘歪斜(SKEW)。會(huì)造成在這個(gè)時(shí)鐘
上工作的時(shí)序電路不可靠,甚至每次布線產(chǎn)生的問題都不一樣。
措施:如果用有兩組以上全局時(shí)鐘的 FPGA 芯片,可以把第二個(gè)全局時(shí)鐘作為另
一個(gè)時(shí)鐘用,可以解決這個(gè)問題。
13.Critical Warning: Timing requirements were not met. See Report
window for details.
原因:時(shí)序要求未滿足,
措施:雙擊Compilation Report-->Time Analyzer-->紅色部分(如clock
setup:'clk'等)-->左鍵單擊list path,查看fmax的SLACK REPORT再根據(jù)
提示解決,有可能是程序的算法問題
14.Can't achieve minimum setup and hold requirement <text> along
<number> path(s). See Report window for details.
原因:時(shí)序分析發(fā)現(xiàn)一定數(shù)量的路徑違背了最小的建立和保持時(shí)間,與時(shí)鐘歪斜
有關(guān),一般是由于多時(shí)鐘引起的
措施:利用Compilation Report-->Time Analyzer-->紅色部分(如clock
hold:'clk'等),在slack中觀察是hold time為負(fù)值還是setup time 為負(fù)值,
然后在:Assignment-->Assignment Editor-->To中增加時(shí)鐘名(from
node finder),Assignment Name中增加
和多時(shí)鐘有關(guān)的Multicycle 和Multicycle Hold選項(xiàng),如hold time為負(fù),可
使Multicycle hold的值>multicycle,如設(shè)為2和1。
15: Can't analyze file -- file E://quartusii/*/*.v is missing
原因:試圖編譯一個(gè)不存在的文件,該文件可能被改名或者刪除了
措施:不管他,沒什么影響
16.Warning: Can't find signal in vector source file for input pin
|whole|clk10m
原因:因?yàn)槟愕牟ㄐ畏抡嫖募?vector source file )中并沒有把所有的輸入
信號(input pin)加進(jìn)去,對于每一個(gè)輸入都需要有激勵(lì)源的
17.Error: Can't name logic scfifo0 of instance "inst" --
has same name as current design file
原因:模塊的名字和project的名字重名了
措施:把兩個(gè)名字之一改一下,一般改模塊的名字
18.Warning: Using design file lpm_fifo0.v, which is not specified as a
design file for the current project, but contains definitions for 1 design
units and 1 entities in project Info: Found entity 1: lpm_fifo0
原因:模塊不是在本項(xiàng)目生成的,而是直接copy了別的項(xiàng)目的原理圖和源程序
而生成的,而不是用QUARTUS將文件添加進(jìn)本項(xiàng)目
措施:無須理會(huì),不影響使用
19.Timing characteristics of device <name> are preliminary
原因:目前版本的QuartusII只對該器件提供初步的時(shí)序特征分析
措施:如果堅(jiān)持用目前的器件,無須理會(huì)該警告。關(guān)于進(jìn)一步的時(shí)序特征分析會(huì)
在后續(xù)版本的Quartus得到完善。
20.Timing Analysis does not support the analysis of latches as
synchronous elements for the currently selected device family
原因:用analyze_latches_as_synchronous_elements setting可以讓
Quaruts II來分析同步鎖存,但目前的器件不支持這個(gè)特性
措施:無須理會(huì)。時(shí)序分析可能將鎖存器分析成回路。但并不一定分析正確。其
后果可能會(huì)導(dǎo)致顯示提醒用戶:改變設(shè)計(jì)來消除鎖 存器
21.Warning:Found xx output pins without output pin load capacitance
assignment(網(wǎng)友:gucheng82提供)
原因:沒有給輸出管教指定負(fù)載電容
措施:該功能用于估算TCO和功耗,可以不理會(huì),也可以在Assignment Editor
中為相應(yīng)的輸出管腳指定負(fù)載電容,以消除警告
22.Warning: Found 6 node(s) in clock paths which may be acting as
ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in
clock skew
原因:使用了行波時(shí)鐘或門控時(shí)鐘,把觸發(fā)器的輸出當(dāng)時(shí)鐘用就會(huì)報(bào)行波時(shí)鐘,
將組合邏輯的輸出當(dāng)時(shí)鐘用就會(huì)報(bào)門控時(shí)鐘
措施:不要把觸發(fā)器的輸出當(dāng)時(shí)鐘,不要將組合邏輯的輸出當(dāng)時(shí)鐘,如果本身如
此設(shè)計(jì),則無須理會(huì)該警告
23.Warning (10268): Verilog HDL information at lcd7106.v(63):
Always Construct contains both blocking and non-blocking
assignments
原因: 一個(gè)always模塊中同時(shí)有阻塞和非阻塞的賦值
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/18 16:20:21
NIOS II中用到的C_C++函數(shù) IO操作函數(shù)
函數(shù)原型:IORD(BASE, REGNUM)
輸入?yún)?shù):BASE為寄存器的基地址,REGNUM為寄存器的偏移量
函數(shù)說明:從基地址為BASE的設(shè)備中讀取寄存器中偏移量為REGNUM的單元里面的值。寄存器的值在地址總線的范圍之內(nèi)。
返回值: -
函數(shù)原型:IOWR(BASE, REGNUM, DATA)
輸入?yún)?shù):BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數(shù)據(jù)
函數(shù)說明:往偏移量為REGNUM寄存器中寫入數(shù)據(jù)。寄存器的值在地址總線的范圍之內(nèi)。
返回值: -
函數(shù)原型:IORD_32DIRECT(BASE, OFFSET)
輸入?yún)?shù):BASE為寄存器的基地址,OFFSET為寄存器的的偏移量
函數(shù)說明:從地址位置為BASE+OFFSET的寄存器中直接讀取32Bit的數(shù)據(jù)
返回值: -
函數(shù)原型:IORD_16DIRECT(BASE, OFFSET)
輸入?yún)?shù):BASE為寄存器的基地址,OFFSET為寄存器的的偏移量
函數(shù)說明:從地址位置為BASE+OFFSET的寄存器中直接讀取16Bit的數(shù)據(jù)
返回值: -
函數(shù)原型:IORD_8DIRECT(BASE, OFFSET)
輸入?yún)?shù):BASE為寄存器的基地址,OFFSET為寄存器的的偏移量
函數(shù)說明:從地址位置為BASE+OFFSET的寄存器中直接讀取8Bit的數(shù)據(jù)
返回值: -
函數(shù)原型:IOWR_32DIRECT(BASE, OFFSET, DATA)
輸入?yún)?shù):BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數(shù)據(jù)
函數(shù)說明:往地址位置為BASE+OFFSET的寄存器中直接寫入32Bit的數(shù)據(jù)
返回值: -
函數(shù)原型:IOWR_16DIRECT(BASE, OFFSET, DATA)
輸入?yún)?shù):BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數(shù)據(jù)
函數(shù)說明:往地址位置為BASE+OFFSET的寄存器中直接寫入16Bit的數(shù)據(jù)
返回值: -
函數(shù)原型:IOWR_8DIRECT(BASE, OFFSET, DATA)
輸入?yún)?shù):BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數(shù)據(jù)
函數(shù)說明:往地址位置為BASE+OFFSET的寄存器中直接寫入8Bit的數(shù)據(jù)
返回值: -
Dma:
函數(shù)原型:int alt_dma_rxchan_close (alt_dma_rxchan rxchan)
輸入?yún)?shù):rxchan為接收信道
函數(shù)說明:函數(shù) alt_dma_rxchan_close ()通知系統(tǒng):應(yīng)用程序已經(jīng)完成DMA
接收信道rxchan,目前執(zhí)行是成功的
返回值: 成功返回為0,反之為-1
函數(shù)原型:alt_dma_rxchan_depth(alt_dma_rxchan dma)
輸入?yún)?shù):dma
函數(shù)說明:函數(shù)alt_dma_rxchan_depth ()返回傳送到特別DMA的最大數(shù)量(深度)的接收請求
返回值: DMA的最大數(shù)量
函數(shù)原型:int alt_dma_rxchan_ioctl (alt_dma_rxchan dma, int req, void* arg)
輸入?yún)?shù):dma直接存儲(chǔ)器名, req為請求操作的列舉, arg由請求決定
函數(shù)說明:通過DMA接收信道執(zhí)行設(shè)備的具體I/O操作
返回值: 成功返回請求具體值,反之返回為負(fù)數(shù)
請求類型
請求類型 請求類型說明
ALT_DMA_SET_MODE_8 傳輸以8Bit為單位的數(shù)據(jù),arg值忽略
ALT_DMA_SET_MODE_16 傳輸以16Bit為單位的數(shù)據(jù),arg值忽略
ALT_DMA_SET_MODE_32 傳輸以32Bit為單位的數(shù)據(jù),arg值忽略
ALT_DMA_SET_MODE_64 傳輸以64Bit為單位的數(shù)據(jù),arg值忽略
ALT_DMA_SET_MODE_128 傳輸以128Bit為單位的數(shù)據(jù),arg值忽略
ALT_DMA_TX_ONLY_ON (1) 軟件控制下只能發(fā)送
ALT_DMA_TX_ONLY_OFF (1) 自定義模式,軟件控制下可以接收,發(fā)送
ALT_DMA_RX_ONLY_ON (1) 軟件控制下只能接收
ALT_DMA_RX_ONLY_OFF (1) 自定義模式,軟件控制下可以接收,發(fā)送
函數(shù)原型:alt_dma_rxchan alt_dma_rxchan_open (const char* name)
輸入?yún)?shù):name為常數(shù)字符指針,如/dev/dma_0
函數(shù)說明:為DMA接收信道獲得一個(gè)alt_dma_rxchan描述符
返回值: 成功返回非0,反之返回為0
函數(shù)原型:int alt_dma_rxchan_prepare (alt_dma_rxchan dma, void* data,
alt_u32 length, alt_rxchan_done * done, void* handle)
輸入?yún)?shù):dma使用的信道;data接收數(shù)據(jù)位置的指針;length最大的接收數(shù)據(jù)長度;done一旦數(shù)據(jù)被接收,調(diào)用返回函數(shù);handle,非透明值傳到done
函數(shù)說明:發(fā)送一個(gè)接收請求到DMA接收信道,
返回值: 成功返回0,反之返回為負(fù)數(shù)
函數(shù)原型:int alt_dma_rxchan_reg (alt_dma_rxchan_dev * dev)
輸入?yún)?shù):dev接收信道設(shè)備名
函數(shù)說明:給系統(tǒng)寄存DMA接收信道
返回值: 成功返回0,反之返回為負(fù)數(shù)
函數(shù)原型:int alt_dma_txchan_close (alt_dma_txchan txchan)
輸入?yún)?shù):txchan發(fā)送信道名
函數(shù)說明:通知系統(tǒng):應(yīng)用程序已經(jīng)完成DMA發(fā)送信道txchan
返回值: 成功返回0,反之返回為負(fù)數(shù)
函數(shù)原型:int alt_dma_txchan_ioctl (alt_dma_txchan dma, int req, void* arg)
輸入?yún)?shù):dma直接存儲(chǔ)器名;req為請求操作的列舉;arg請求的額外參數(shù),由請求決定
函數(shù)說明:通過DMA發(fā)送信道執(zhí)行設(shè)備的具體I/O操作
返回值: 成功返回請求具體值,反之返回為負(fù)數(shù)
函數(shù)原型:alt_dma_txchan alt_dma_txchan_open (const char* name)
輸入?yún)?shù):name為常數(shù)字符指針,如/dev/dma_0
函數(shù)說明:為DMA發(fā)送信道獲得一個(gè)alt_dma_rxchan描述符
返回值: 成功返回非0,反之返回為0
函數(shù)原型:int alt_dma_txchan_reg (alt_dma_txchan_dev* dev)
輸入?yún)?shù):dev接收信道設(shè)備名
函數(shù)說明:給系統(tǒng)寄存DMA發(fā)送信道
返回值: 成功返回0,反之返回為負(fù)數(shù)
函數(shù)原型:int alt_dma_txchan_send (alt_dma_txchan dma, const void* from,
alt_u32 length, alt_txchan_done* done, void* handle)
輸入?yún)?shù):dma使用的信道;data接收數(shù)據(jù)位置的指針;length最大的接收數(shù)據(jù)長度;done一旦數(shù)據(jù)被接收,調(diào)用返回函數(shù);handle,非透明值傳到done
函數(shù)說明:發(fā)送一個(gè)發(fā)送請求到DMA發(fā)送信道,
返回值: 發(fā)送成功返回0,反之返回為負(fù)數(shù)
函數(shù)原型:nt alt_dma_txchan_space (alt_dma_txchan dma)
輸入?yún)?shù):dma 直接存儲(chǔ)器名
函數(shù)說明:返回被傳送到具體DMA發(fā)送信道的發(fā)送請求數(shù)目
返回值: 返回發(fā)送請求數(shù)目
Flash
函數(shù)原型:int alt_erase_flash_block(alt_flash_fd* fd, int offset, int length)
輸入?yún)?shù):fd為具體的flash設(shè)備;offset擦除的flash模塊的偏移量;length擦除的flash模塊的長度
函數(shù)說明:擦除單獨(dú)的一個(gè)flash模塊
返回值: 發(fā)送成功返回0,反之返回為負(fù)數(shù)
函數(shù)原型:void alt_flash_close_dev(alt_flash_fd * fd)
輸入?yún)?shù):fd為具體的flash設(shè)備
函數(shù)說明:關(guān)閉flash設(shè)備
返回值: -
函數(shù)原型:alt_flash_fd * alt_flash_open_dev(const char* name)
輸入?yún)?shù):
函數(shù)說明:打開flash設(shè)備。一旦打開,函數(shù)alt_write_flash()用來寫入,函數(shù)alt_read_flash()用來讀取數(shù)據(jù),或者使用函數(shù)alt_get_flash_info(), alt_erase_flash_block(), alt_write_flash_block(),控制單個(gè)模塊
返回值: 失敗返回0,成功其他值
函數(shù)原型:int alt_get_flash_info(alt_flash_fd* fd, flash_region ** info,
int* number_of_regions)
輸入?yún)?shù):fd flash設(shè)備;info指向flash_region結(jié)構(gòu)體的指針;number_of_regions
函數(shù)說明:得到擦除flash區(qū)域的細(xì)節(jié)
返回值: 發(fā)送成功返回0,反之返回為負(fù)數(shù)
函數(shù)原型:int alt_read_flash(alt_flash_fd* fd, int offset, void* dest_addr, int length)
輸入?yún)?shù):dest_addr目標(biāo)地址指針
函數(shù)說明:從flash偏移量為offset字節(jié)開始讀取數(shù)據(jù),寫入到目標(biāo)地址dest_addr中
返回值: 成功返回0,反之為非0
函數(shù)原型:int alt_write_flash(alt_flash_fd* fd, int offset, const void* src_addr,
int length)
輸入?yún)?shù):src_addr源地址;fd,flash設(shè)備;offset 偏移量;length字節(jié)長度
函數(shù)說明:寫數(shù)據(jù)到flsah中,要寫的數(shù)據(jù)在源地址src_addr中
返回值: 成功返回0,反之為非0
函數(shù)原型:int alt_write_flash_block(alt_flash_fd* fd, int block_offset, int data_offset,
const void *data, int length)
輸入?yún)?shù):fd;data_offset起始寫數(shù)據(jù)的偏移量;length為要寫數(shù)據(jù)的長度
函數(shù)說明:寫入到一個(gè)已擦除的flash模塊
返回值: 成功返回0,反之為非0
Irq
函數(shù)原型:alt_irq_context alt_irq_disable_all (void)
輸入?yún)?shù):void
函數(shù)說明:禁止所有中斷
返回值: 傳遞的值作為隨后的函數(shù)調(diào)用的輸入?yún)?shù)
函數(shù)原型:void alt_irq_enable_all (alt_irq_context context)
輸入?yún)?shù):先前調(diào)用函數(shù)alt_irq_disable_all (void)的返回值,
函數(shù)說明:啟動(dòng)所有中斷
返回值: -
函數(shù)原型:int alt_irq_enabled (void)
輸入?yún)?shù):void
函數(shù)說明:啟動(dòng)中斷
返回值: 禁止中斷返回0,反之為非0
函數(shù)原型:int alt_irq_register (alt_u32 id, void* context, void (*isr)(void*, alt_u32))
輸入?yún)?shù):id,32位無符號數(shù),中斷使能;context和id是isr的兩個(gè)輸入?yún)?shù);中斷激活時(shí)調(diào)用isr
函數(shù)說明:寄存一個(gè)isr
返回值: 成功返回0,反之為非0
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/18 16:04:46
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(fù)(0)
發(fā)表于 2010/4/18 16:04:46
學(xué)好NiosII必須具備的條件- - 經(jīng)過1年多的學(xué)習(xí)和實(shí)踐,我總結(jié)了下面幾條要學(xué)好niosII所需要具備的條件:
1.良好的英文閱讀能力:因?yàn)樗械膎ios的權(quán)威資料都是來自與下面的altera的官方網(wǎng)站
2.C語言的基礎(chǔ)以及部分匯編基礎(chǔ)
3.最基本的單片機(jī)的硬件基礎(chǔ)
4.一個(gè)nios的參考開發(fā)板,最好是來自于altera公司
5.一定的QuartusII的基礎(chǔ)
6.一定的調(diào)試能力: NiosII IDE是基于eclipse架構(gòu)的,該IDE具備非常強(qiáng)大的調(diào)試能力
比如:
breakpoint
watchpoint
register view
memory view
variable view
trace==
7.添加一點(diǎn),要想學(xué)好Nios,最好能帶著項(xiàng)目學(xué)習(xí)
給大家一個(gè)強(qiáng)烈的建議:
要想學(xué)好Nios,調(diào)試能力是非常重要的
通過調(diào)試,你可以逐漸的了解nios的整個(gè)軟件架構(gòu),比如它是如何處理中斷的,又是如何處理bootloader的,等等
還有NiosII IDE里面有非常多的屬性設(shè)置,基本上每個(gè)設(shè)置都有它的作用,等你了解了所有設(shè)置的功能,也就差不多算半個(gè)高手了^_^
還有很重要的一點(diǎn)就是如何尋找?guī)椭?
1. Altera的官方網(wǎng)站有一個(gè)mysupport,在那里可以提交service request, 不過只支持英文
2. Altera的官方網(wǎng)站有Find Answer的功能,輸入問題的關(guān)鍵字,可能就可以直接得到答案
3. Nios的官方論壇, ,這是個(gè)英文網(wǎng)站,里面很多斑竹都是Nios的開發(fā)者
4. 咱們這個(gè)EDA論壇也不賴
5. Altera的FAE
6. 其實(shí)我用到的最多的幫助是Altera的nios資料,在里面幾乎可以找到所有的答案^_^
下面補(bǔ)充一下如何查找資料:
1.
在Nios的安裝目錄下,有個(gè)document文件夾C:\altera\kits\nios2_51\documents
該文件夾下有個(gè)index.htm文件
如果大家仔細(xì)認(rèn)真的研究一下這個(gè)文件,一定可以從中得到非常多的收獲,
以后碰上問題的話基本上都可以從這個(gè)網(wǎng)頁開始自己尋找答案
2.
還有一個(gè)很重要的幫助途徑
Click NiosII IDE->Help->Help Contents
此時(shí)會(huì)彈出一個(gè)Help的網(wǎng)頁,該網(wǎng)頁支持搜索功能,你可以在里面輸入你所要查找的關(guān)鍵字,就可以得到相關(guān)內(nèi)容.
比如你想知道如何在NiosII IDE里面創(chuàng)建自己的庫文件,那么你就可以查找managed library的關(guān)鍵字^_^
差點(diǎn)忘了一個(gè)非常重要的學(xué)習(xí)資源了,就是altera提供的視頻教程:
在這個(gè)網(wǎng)址有個(gè)課程列表,其中很大一部分的視頻教程是免費(fèi)的,內(nèi)容非常豐富^_^
這里是關(guān)于niosII的一些視頻demo,對初學(xué)者非常有幫助^_^
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(1) | 回復(fù)(0)
發(fā)表于 2010/4/18 15:58:59
FPGA開發(fā)板各存儲(chǔ)器之間的聯(lián)系 在FPGA開發(fā)板上都有幾種不同的存儲(chǔ)器,比如SDRAM,F(xiàn)LASH,EPCS,還有內(nèi)部onchip memory,這幾種存儲(chǔ)器間是如何通信或者構(gòu)建一個(gè)系統(tǒng)
該如何搭配他們呢,不少人都問到這個(gè)問題。在這里我做個(gè)總結(jié)以方便初學(xué)者的學(xué)習(xí)。
首先看看在sopc builder中reset address和nios IDE中System Library中的program memory(.text)、read-only data memory(.rodata)等
這幾個(gè)地址的關(guān)系和作用
根據(jù)altera 的文檔解釋如下:
.text :代碼執(zhí)行區(qū)
.rodata:只讀數(shù)據(jù)區(qū),存放靜態(tài)全局變量
.rwdata:可讀寫數(shù)據(jù)區(qū),存放可讀寫變量和指針變量
.bss:未初始化變量區(qū)
.text-the actual executable code
.rodata-where read only data used in the execution of the code
.rwdata-where read/write variables and pointers are stored
heap-where dynamically allocated memory is located
stack-where function call parameters and other temporary data
SOPC builder 在Nios II more "cpu_0" setting 標(biāo)簽中的
reset address決定了flash programmer 的下載存儲(chǔ)器(一般是選EPCS controller 或者CFI flash),并且決定了程序從此處開始啟動(dòng)。exception address指定的是異常處理地址。當(dāng)然,程序在運(yùn)行前所有的數(shù)據(jù)都是存放在flash(EPCS或者CFI FLASH)中如果你設(shè)計(jì)的系統(tǒng)reset address與其它地址的設(shè)置不相同,比如reset address 和exceprion address,reset address 和IDE中的program memory(.text)設(shè)成不同的存儲(chǔ)器,那么系統(tǒng)從reset address啟動(dòng)時(shí)都會(huì)從flash中把相關(guān)數(shù)據(jù)自動(dòng)下載到相應(yīng)的地址或者初始化相應(yīng)地址。
通過上面的認(rèn)識,我們就比較清楚了各存儲(chǔ)器間可進(jìn)行哪些搭配了,reset address的選擇可選EPCS controllor 或者CFI flash;program memory(.text)可選擇onchip memory,SDRAM,CFI flash等。如果reset address為EPCS則在使用flash progrrammer時(shí)程序是下載到EPCS芯片中。如果reset address選擇CFI flash,則flash progrrammer時(shí)程序是下載到CFI flash芯片中。
需要注意的是這里有個(gè)特殊情況。例如在開發(fā)板上經(jīng)常有這么一個(gè)簡單的系統(tǒng),CPU+onchip memory+LED_PIO,reset address選擇onchip memory;感覺整個(gè)系統(tǒng)都沒有用到flash。而且onchip memory在系統(tǒng)斷電后數(shù)據(jù)就會(huì)消失,那么程序代碼是存在哪,系統(tǒng)是如何從onchip memory啟動(dòng)聽呢?先來看看onchip memory模塊的描述信息:在onchip_memory.v中有這么一段the_altsyncram.init_file = "onchip_memory.hex",很明顯onchip memory的初始數(shù)據(jù)來自"onchip_memory.hex",而"onchip_memory.hex"是在Nios IDE的System Library中存儲(chǔ)器有選擇onchip_memory(至少有一項(xiàng)是選擇onchip_memory,如果都不選,就不會(huì)生成)時(shí),在build結(jié)束的時(shí)候生成的。于是當(dāng)我們把System Library中存儲(chǔ)器的選擇都選擇onchip_memory時(shí),在IDE中build結(jié)束后所有的程序代碼都生成在"onchip_memory.hex"中,再在QII中全編譯一次時(shí),系統(tǒng)通過onchip_memory.v調(diào)用"onchip_memory.hex"從而把所有的程序代碼以及配制信息都生成在POF和SOF文件中,使用QII的programmer直接下載到EPCS芯片或者FPGA芯片內(nèi)程序都會(huì)立即執(zhí)行。因?yàn)檫@里的特殊性就有很多網(wǎng)友詢問了,reset address 選擇onchip memory,而IDE中把代碼區(qū)都選擇SDRAM調(diào)試的時(shí)候程序正常運(yùn)行,再在QII全編譯后下載POF文件就運(yùn)行不了呢?問題就是出在這了,在這里可以總結(jié)出一點(diǎn),要讓程序在onchip memory之外的存儲(chǔ)器中運(yùn)行,那么reset address就必然選EPCS 或者CFI flash,并且要通過flash programmer把程序下載到flash中。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/18 15:58:59
關(guān)于建立時(shí)間、保持時(shí)間的討論 時(shí)鐘周期為T,觸發(fā)器D1的時(shí)鐘沿到來到觸發(fā)器Q變化的時(shí)間Tco(CLK--Q)最大為T1max,最小為T1min,邏輯組合電路的延遲時(shí)間最大為T2max,最小為T2min,問觸發(fā)器D2的建立時(shí)間和保持時(shí)間。
maxbird: D2的保持時(shí)間就是時(shí)鐘沿到來之后,D2的數(shù)據(jù)輸入端要保持?jǐn)?shù)據(jù)不變的時(shí)間,這個(gè)時(shí)間是由D1和D2之間的組合邏輯時(shí)延決定的。例如:假設(shè)D1和D2之間的組合邏輯時(shí)延為2ns,時(shí)鐘周期為10ns,這意味著在時(shí)鐘沿來到后,D1輸出的新數(shù)據(jù)要過2ns才會(huì)到達(dá)D2的數(shù)據(jù)輸入端,那么在這2ns內(nèi),D2的數(shù)據(jù)輸入端保持的還是上一次的舊數(shù)據(jù),其值不會(huì)立即更新,假設(shè)D2的最小保持時(shí)間為3ns,這意味時(shí)鐘沿到來后,D2的數(shù)據(jù)輸入端的值在3ns內(nèi)不能有變化,回到問題的關(guān)鍵,由于D1在時(shí)鐘沿到來后的輸出結(jié)果,經(jīng)過2ns的組合邏輯延時(shí)便到達(dá)了D2的輸入端,而D2要求在時(shí)鐘沿到來后的3ns內(nèi)其輸入端的值不能改變,這樣D2的保持時(shí)間就得不到滿足,所以D2的保持時(shí)間必須小于等于2ns。 至于說T2min為0時(shí)的情況,其實(shí)T2min是永遠(yuǎn)不能為0的,即使是一根導(dǎo)線其時(shí)延也是不可能為0的,這就是為什么移位寄存器的兩個(gè)觸發(fā)器之間連的只是一根導(dǎo)線,導(dǎo)線后端觸發(fā)器的保持時(shí)間卻還是可以滿足的原因,其實(shí)移位寄存器中觸發(fā)器的保持時(shí)間可以看成是小于等于其間導(dǎo)線的時(shí)延。
建立時(shí)間:觸發(fā)器在時(shí)鐘沿來到前,其數(shù)據(jù)輸入端的數(shù)據(jù)必須保持不變的時(shí)間;保持時(shí)間:觸發(fā)器在時(shí)鐘沿來到后,其數(shù)據(jù)輸入端的數(shù)據(jù)必須保持不變的時(shí)間。如下圖:
因?yàn)橛|發(fā)器內(nèi)部數(shù)據(jù)的形成是需要一定的時(shí)間的,如果不滿足建立和保持時(shí)間,觸發(fā)器將進(jìn)入亞穩(wěn)態(tài),進(jìn)入亞穩(wěn)態(tài)后觸發(fā)器的輸出將不穩(wěn)定,在0和1之間變化,這時(shí)需要經(jīng)過一個(gè)恢復(fù)時(shí)間,其輸出才能穩(wěn)定,但穩(wěn)定后的值并不一定是你的輸入值。這就是為什么要用兩級觸發(fā)器來同步異步輸入信號。這樣做可以防止由于異步輸入信號對于本級時(shí)鐘可能不滿足建立保持時(shí)間而使本級觸發(fā)器產(chǎn)生的亞穩(wěn)態(tài)傳播到后面邏輯中,導(dǎo)致亞穩(wěn)態(tài)的傳播。兩級觸發(fā)器可防止亞穩(wěn)態(tài)傳播的原理:假設(shè)第一級觸發(fā)器的輸入不滿足其建立保持時(shí)間,它在第一個(gè)脈沖沿到來后輸出的數(shù)據(jù)就為亞穩(wěn)態(tài),那么在下一個(gè)脈沖沿到來之前,其輸出的亞穩(wěn)態(tài)數(shù)據(jù)在一段恢復(fù)時(shí)間后必須穩(wěn)定下來,而且穩(wěn)定的數(shù)據(jù)必須滿足第二級觸發(fā)器的建立時(shí)間,如果都滿足了,在下一個(gè)脈沖沿到來時(shí),第二級觸發(fā)器將不會(huì)出現(xiàn)亞穩(wěn)態(tài),因?yàn)槠漭斎攵说臄?shù)據(jù)滿足其建立保持時(shí)間。同步器有效的條件:第一級觸發(fā)器進(jìn)入亞穩(wěn)態(tài)后的恢復(fù)時(shí)間 + 第二級觸發(fā)器的建立時(shí)間 < = 時(shí)鐘周期。 (編者注:maxbird在該部分詳細(xì)說明了建立時(shí)間和保持時(shí)間的概念,以及如果不滿足二者可能導(dǎo)致的亞穩(wěn)態(tài)的傳播。注意這里說的建立時(shí)間和保持時(shí)間都是針對時(shí)鐘而言的,在進(jìn)行時(shí)序約束時(shí)所指的就是這種,而很多網(wǎng)友以前學(xué)習(xí)的建立時(shí)間保持時(shí)間的概念是針對信號而言的,所指的對象不同,分析出來的結(jié)論完全相反,一定注意不要混淆。)
lh1688: 不考慮CLOCK SKEW情況下。D2的建立時(shí)間要求:Tco1+T1(logic delay)+Tsetup2 < Tc(CLOCK 周期) 。那么 Tsetup2 < Tc(CLOCK 周期) -(Tco1+T1)。這個(gè)應(yīng)該比較容易理解。相對的保持時(shí)間實(shí)際就是 路徑的總延時(shí) (Tco1+T1)。 保持時(shí)間 Thold2 < (Tco1+T1)。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(fù)(0)
發(fā)表于 2010/4/17 17:16:54
QuartusII警告信息大解析(zz) ********************************************************************
在II下進(jìn)行編譯和仿真的時(shí)候,會(huì)出現(xiàn)一堆warning,有的可以忽略,有的卻需要注意,雖然按F1可以了解關(guān)于該警告的幫助,但有時(shí)候幫助解釋的仍然不清楚,大家群策群力,把自己知道和了解的一些關(guān)于警告的問題都說出來討論一下,免得后來的人走彎路.
下面是我收集整理的一些,有些是自己的經(jīng)驗(yàn),有些是網(wǎng)友的,希望能給大家一點(diǎn)幫助,如有不對的地方,請指正,如果覺得好,請版主給點(diǎn)威望吧,謝謝
1.Found clock-sensitive change during activeclockedge at time <time> on register "<name>"
原因:vector sourcefile中時(shí)鐘敏感信號(如:數(shù)據(jù),允許端,清零,同步加載等)在時(shí)鐘的邊緣同時(shí)變化。而時(shí)鐘敏感信號是
不能在時(shí)鐘邊沿變化的。其后果為導(dǎo)致結(jié)果不正確。
措施:編輯vector source file
2. assignment warning at <location>: truncated value with size <number> to match size of target (<number>
原因:在HDL設(shè)計(jì)中對目標(biāo)的位數(shù)進(jìn)行了設(shè)定,如:reg[4:0] a;而默認(rèn)為32位,將位數(shù)裁定到合適的大小
措施:如果結(jié)果正確,無須加以修正,如果不想看到這個(gè)警告,可以改變設(shè)定的位數(shù)
3.All reachable assignments to data_out(10) assign '0', register removed by optimization
原因:經(jīng)過綜合器優(yōu)化后,輸出端口已經(jīng)不起作用了
4.Following 9 pins have nothing, GND, or VCC driving datain port -- changes to this connectivity may change fitting results
原因:第9腳,空或接地或接上了電源
措施:有時(shí)候定義了輸出端口,但輸出端直接賦‘0’,便會(huì)被接地,賦‘1’接電源。如果你的設(shè)計(jì)中這些端口就是這樣用的,那便可以不理會(huì)這些warning
5.Found pins functioning as undefined clocks and/or memory enables
原因:是你作為時(shí)鐘的PIN沒有約束信息。可以對相應(yīng)的PIN做一下設(shè)定就行了。主要是指你的某些管腳在電路當(dāng)中起到了時(shí)鐘管腳的
作用,比如flip-flop的clk管腳,而此管腳沒有時(shí)鐘約束,因此QuartusII把“clk”作為未定義的時(shí)鐘。
措施:如果clk不是時(shí)鐘,可以加“not clock”的約束;如果是,可以在clock setting當(dāng)中加入;在某些對時(shí)鐘要求不很高的情況下,可以忽略此警告或在這里修改:Assignments>Timing analysis settings...>Individualclocks...>...
注意在Applies to node中只用選擇時(shí)鐘引腳一項(xiàng)即可,required fmax一般比所要求頻率高5%即可,無須太緊或太松。
6.Timing characteristics of device EPM570T144C5 are preliminary
原因:因?yàn)镸AXII 是比較新的元件在 QuartusII 中的時(shí)序並不是正式版的,要等 Service Pack
措施:只影響 Quartus 的 Waveform.
7.Warning: Clock latency analysis for PLL offsets is supported for the current device family, but is not enabled
措施:將setting中的timing Requirements&Option-->More Timing Setting-->setting-->Enable Clock Latency中的on改成OFF
8.Found clock high time violation at 14.8 ns on register "|counter|lpm_counter:count1_rtl_0|dffs[11]"
原因:違反了steup/hold時(shí)間,應(yīng)該是后仿真,看看波形設(shè)置是否和時(shí)鐘沿符合steup/hold時(shí)間
措施:在中間加個(gè)寄存器可能可以解決問題
9.warning: circuit may not operate.detected 46 non-operational paths clocked by clock clk44 with clockskewlarger than data delay
原因:時(shí)鐘抖動(dòng)大于數(shù)據(jù)延時(shí),當(dāng)時(shí)鐘很快,而if等類的層次過多就會(huì)出現(xiàn)這種問題,但這個(gè)問題多是在器件的最高頻率中才會(huì)出現(xiàn)
措施:setting-->timing Requirements&Options-->Default required fmax 改小一些,如改到50MHZ
10.Designcontains <number> input pin(s) that do not drive logic
原因:輸入引腳沒有驅(qū)動(dòng)邏輯(驅(qū)動(dòng)其他引腳),所有的輸入引腳需要有輸入邏輯
措施:如果這種情況是故意的,無須理會(huì),如果非故意,輸入邏輯驅(qū)動(dòng).
12.Warning: Found 10 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew
原因:如果你用的 只有一組全局時(shí)鐘時(shí),用全局時(shí)鐘分頻產(chǎn)生的另一個(gè)時(shí)鐘在布線中當(dāng)作信號處理,不能保證低的時(shí)鐘歪斜(SKEW)。會(huì)造成在這個(gè)時(shí)鐘上工作的時(shí)序電路不可靠,甚至每次布線產(chǎn)生的問題都不一樣。
措施:如果用有兩組以上全局時(shí)鐘的 [url=][url=][/url][/url]芯片,可以把第二個(gè)全局時(shí)鐘作為另一個(gè)時(shí)鐘用,可以解決這個(gè)問題。
13.Critical Warning: Timing requirements were not met. See Report window for details.
原因:時(shí)序要求未滿足,
措施:雙擊Compilation Report-->Time Analyzer-->紅色部分(如clock setup:'clk'等)-->左鍵單擊list path,查看fmax的SLACK REPORT再根據(jù)提示解決,有可能是程序的算法問題或fmax設(shè)置問題
14.Warning: Can't find signal in vector source file for input pin |whole|clk10m
原因:這個(gè)時(shí)因?yàn)槟愕牟ㄐ畏抡嫖募?vector source file )中并沒有把所有的輸入信號(input pin)加進(jìn)去, 對于每一個(gè)輸入都需要有激勵(lì)源的
15.Can't achieve minimum setup and hold requirement <text> along <number> path(s). See Report window for details.
原因:時(shí)序分析發(fā)現(xiàn)一定數(shù)量的路徑違背了最小的建立和保持時(shí)間,與時(shí)鐘歪斜有關(guān),一般是由于多時(shí)鐘引起的
措施:利用Compilation Report-->Time Analyzer-->紅色部分(如clock hold:'clk'等),在slack中觀察是hold time為負(fù)值還是setup time 為負(fù)值,然后在:Assignment-->Assignment Editor-->To中增加時(shí)鐘名(fromnode finder),Assignment Name中增加和多時(shí)鐘有關(guān)的Multicycle 和Multicycle Hold選項(xiàng),如hold time為負(fù),可使Multicycle hold的值>multicycle,如設(shè)為2和1。
16: Can't analyze file -- file E://quartusii/*/*.v is missing
原因:試圖編譯一個(gè)不存在的文件,該文件可能被改名或者刪除了
措施:不管他,沒什么影響
17.Warning: Can't find signal in vector source file for input pin |whole|clk10m
原因:因?yàn)槟愕牟ㄐ畏抡嫖募?vector source file )中并沒有把所有的輸入信號(input pin)加進(jìn)去, 對于每一個(gè)輸入都需要有激勵(lì)源的
18.Error: Can't name logic function scfifo0 of instance "inst" -- function has same name as current design file
原因:模塊的名字和project的名字重名了
措施:把兩個(gè)名字之一改一下,一般改模塊的名字
19.Warning: Using design file lpm_fifo0.v, which is not specified as a design file for the current project, but contains definitions for 1 design units and 1 entities in project Info: Found entity 1: lpm_fifo0
原因:模塊不是在本項(xiàng)目生成的,而是直接copy了別的項(xiàng)目的原理圖和源程序而生成的,而不是用QUARTUS將文件添加進(jìn)本項(xiàng)目
措施:無須理會(huì),不影響使用
20.Timing characteristics of device <name> are preliminary
原因:目前版本的QuartusII只對該器件提供初步的時(shí)序特征分析
措施:如果堅(jiān)持用目前的器件,無須理會(huì)該警告。關(guān)于進(jìn)一步的時(shí)序特征分析會(huì)在后續(xù)版本的Quartus得到完善。
21.Timing Analysis does not support the analysis of latches as synchronous elements for the currently selected device family
原因:用analyze_latches_as_synchronous_elements setting可以讓Quaruts II來分析同步鎖存,但目前的器件不支持這個(gè)特性
措施:無須理會(huì)。時(shí)序分析可能將鎖存器分析成回路。但并不一定分析正確。其后果可能會(huì)導(dǎo)致顯示提醒用戶:改變設(shè)計(jì)來消除鎖存器,但實(shí)際其實(shí)無關(guān)緊要
22.Warning:Found xx output pins without output pin load capacitance assignment
原因:沒有給輸出管教指定負(fù)載電容
解決方法:該功能用于估算TCO和功耗,可以不理會(huì),也可以在Assignment Editor中為相應(yīng)的輸出管腳指定負(fù)載電容,以消除警告
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/17 16:52:58
一些關(guān)于微電子方面的筆試題(有答案) 專用集成電路,它是面向?qū)iT用途的電路,專門為一個(gè)用戶設(shè)計(jì)和制造的。根據(jù)一個(gè)用戶的特定要求,能以低研制成本,短、交貨周期供貨的全定制,半定制集成電路。與門陣列等其它ASIC(Application Specific IC)相比,它們又具有設(shè)計(jì)開發(fā)周期短、設(shè)計(jì)制造成本低、開發(fā)工具先進(jìn)、標(biāo)準(zhǔn)產(chǎn)品無需測試、質(zhì)量穩(wěn)定以及可實(shí)時(shí)在線檢驗(yàn)等優(yōu)點(diǎn)
建立時(shí)間是指觸發(fā)器的時(shí)鐘信號上升沿到來以前,數(shù)據(jù)穩(wěn)定不變的時(shí)間。輸入信號應(yīng)提前時(shí)鐘上升沿(如上升沿有效)T時(shí)間到達(dá)芯片,這個(gè)T就是建立時(shí)間如不滿足setup time,這個(gè)數(shù)據(jù)就不能被這一時(shí)鐘打入觸發(fā)器,只有在下一個(gè)時(shí)鐘上升沿,數(shù)據(jù)才能被打入觸發(fā)器。保持時(shí)間是指觸發(fā)器的時(shí)鐘信號上升沿到來以后,數(shù)據(jù)穩(wěn)定不變的時(shí)間。如果hold time不夠,數(shù)據(jù)同樣不能被打入觸發(fā)器。
建立時(shí)間是指在時(shí)鐘邊沿前,數(shù)據(jù)信號需要保持不變的時(shí)間。保持時(shí)間是指時(shí)鐘跳變邊沿后數(shù)據(jù)信號需要保持不變的時(shí)間。如果不滿足建立和保持時(shí)間的話,那么DFF將不能正確地采樣到數(shù)據(jù),將會(huì)出現(xiàn)metastability(亞穩(wěn)態(tài))的情況。如果數(shù)據(jù)信號在時(shí)鐘沿觸發(fā)前后持續(xù)的時(shí)間均超過建立和保持時(shí)間,那么超過量就分別被稱為建立時(shí)間裕量和保持時(shí)間裕量。
在組合邏輯中,由于門的輸入信號通路中經(jīng)過了不同的延時(shí),導(dǎo)致到達(dá)該門的時(shí)間不一致叫競爭。產(chǎn)生毛刺叫冒險(xiǎn)。如果布爾式中有相反的信號則可能產(chǎn)生競爭和冒險(xiǎn)現(xiàn)象。解決方法:一是添加布爾式的消去項(xiàng),二是在芯片外部加電容。
列舉幾種集成電路典型工藝。工藝上常提到0.25,0.18指的是什么?(仕蘭微面試題目)制造工藝:我們經(jīng)常說的0.18微米、0.13微米制程,就是指制造工藝了。制造工藝直接關(guān)系到cpu的電氣性能。而0.18微米、0.13微米這個(gè)尺度就是指的是cpu核心中線路的寬度。線寬越小,cpu的功耗和發(fā)熱量就越低,并可以工作在更高的頻率上了。所以以前0.18微米的cpu最高的頻率比較低,用0.13微米制造工藝的cpu會(huì)比0.18微米的制造工藝的發(fā)熱量低都是這個(gè)道理了。
集成電路前段設(shè)計(jì)流程,寫出相關(guān)的工具。(揚(yáng)智電子筆試)
1.)代碼輸入(
語言輸入工具:SUMMIT VISUALHDL
MENTOR RENIOR
圖形輸入: composer(cadence);
viewlogic (viewdraw)
2.)電路仿真(circuit simulation)
將vhd代碼進(jìn)行先前邏輯仿真,驗(yàn)證功能描述是否正確
數(shù)字電路仿真工具:
Verolog: CADENCE Verolig-XL
SYNOPSYS VCS
MENTOR Modle-sim
VHDL : CADENCE NC-vhdl
SYNOPSYS VSS
MENTOR Modle-sim
模擬電路仿真工具:
***ANTI HSpice pspice,spectre micro microwave: eesoft : hp
3.)邏輯綜合(邏輯綜合工具可以將設(shè)計(jì)思想vhd代碼轉(zhuǎn)化成對應(yīng)一定工藝手段的門級電路;將初級仿真中所沒有考慮的門沿(gates delay)反標(biāo)到生成的門級網(wǎng)表中,返回電路仿真階段進(jìn)行再仿真。最終仿真結(jié)果生成的網(wǎng)表稱為物理網(wǎng)表。
7、解釋setup和hold time violation,畫圖說明,并說明解決辦法。(威盛VIA 2003.11.06上海筆試試題)
Setup/hold time是測試芯片對輸入信號和時(shí)鐘信號之間的時(shí)間要求。建立時(shí)間是指觸發(fā)器的時(shí)鐘信號上升沿到來以前,數(shù)據(jù)穩(wěn)定不變的時(shí)間。輸入信號應(yīng)提前時(shí)鐘上升沿(如上升沿有效)T時(shí)間到達(dá)芯片,這個(gè)T就是建立時(shí)間-Setup time.如不滿足setup time,這個(gè)數(shù)據(jù)就不能被這一時(shí)鐘打入觸發(fā)器,只有在下一個(gè)時(shí)鐘上升沿,數(shù)據(jù)才能被打入觸發(fā)器。保持時(shí)間是指觸發(fā)器的時(shí)鐘信號上升沿到來以后,數(shù)據(jù)穩(wěn)定不變的時(shí)間。如果hold time不夠,數(shù)據(jù)同樣不能被打入觸發(fā)器。
建立時(shí)間(Setup Time)和保持時(shí)間(Hold time)。建立時(shí)間是指在時(shí)鐘邊沿前,數(shù)據(jù)信號需要保持不變的時(shí)間。保持時(shí)間是指時(shí)鐘跳變邊沿后數(shù)據(jù)信號需要保持不變的時(shí)間。如果不滿足建立和保持時(shí)間的話,那么DFF將不能正確地采樣到數(shù)據(jù),將會(huì)出現(xiàn)metastability的情況。如果數(shù)據(jù)信號在時(shí)鐘沿觸發(fā)前后持續(xù)的時(shí)間均超過建立和保持時(shí)間,那么超過量就分別被稱為建立時(shí)間裕量和保持時(shí)間裕量。
在組合邏輯中,由于門的輸入信號通路中經(jīng)過了不同的延時(shí),導(dǎo)致到達(dá)該門的時(shí)間不一致叫競爭。產(chǎn)生毛刺叫冒險(xiǎn)。如果布爾式中有相反的信號則可能產(chǎn)生競爭和冒險(xiǎn)現(xiàn)象。解決方法:一是添加布爾式的消去項(xiàng),二是在芯片外部加電容。
亞穩(wěn)態(tài)是指觸發(fā)器無法在某個(gè)規(guī)定時(shí)間段內(nèi)達(dá)到一個(gè)可確認(rèn)的狀態(tài)。當(dāng)一個(gè)觸發(fā)器進(jìn)入亞穩(wěn)態(tài)時(shí),既無法預(yù)測該單元的輸出電平,也無法預(yù)測何時(shí)輸出才能穩(wěn)定在某個(gè)正確的電平上。在這個(gè)穩(wěn)定期間,觸發(fā)器輸出一些中間級電平,或者可能處于振蕩狀態(tài),并且這種無用的輸出電平可以沿信號通道上的各個(gè)觸發(fā)器級聯(lián)式傳播下去。
同步復(fù)位在時(shí)鐘沿采復(fù)位信號,完成復(fù)位動(dòng)作。異步復(fù)位不管時(shí)鐘,只要復(fù)位信號滿足條件,就完成復(fù)位動(dòng)作。異步復(fù)位對復(fù)位信號要求比較高,不能有毛刺,如果其與時(shí)鐘關(guān)系不確定,也可能出現(xiàn)亞穩(wěn)態(tài)。
不同的時(shí)鐘域之間信號通信時(shí)需要進(jìn)行同步處理,這樣可以防止新時(shí)鐘域中第一級觸發(fā)器的亞穩(wěn)態(tài)信號對下級邏輯造成影響,其中對于單個(gè)控制信號可以用兩級同步器,如電平、邊沿檢測和脈沖,對
跨時(shí)域的信號要經(jīng)過同步器同步,防止亞穩(wěn)態(tài)傳播。例如:時(shí)鐘域1中的一個(gè)信號,要送到時(shí)鐘域2,那么在這個(gè)信號送到時(shí)鐘域2之前,要先經(jīng)過時(shí)鐘域2的同步器同步后,才能進(jìn)入時(shí)鐘域2。這個(gè)同步器就是兩級d觸發(fā)器,其時(shí)鐘為時(shí)鐘域2的時(shí)鐘。這樣做是怕時(shí)鐘域1中的這個(gè)信號,可能不滿足時(shí)鐘域2中觸發(fā)器的建立保持時(shí)間,而產(chǎn)生亞穩(wěn)態(tài),因?yàn)樗鼈冎g沒有必然關(guān)系,是異步的。這樣做只能防止亞穩(wěn)態(tài)傳播,但不能保證采進(jìn)來的數(shù)據(jù)的正確性。所以通常只同步很少位數(shù)的信號。比如控制信號,或地址。當(dāng)同步的是地址時(shí),一般該地址應(yīng)采用格雷碼,因?yàn)楦窭状a每次只變一位,相當(dāng)于每次只有一個(gè)同步器在起作用,這樣可以降低出錯(cuò)概率,象異步FIFO的設(shè)計(jì)中,比較讀寫地址的大小時(shí),就是用這種方法。 如果兩個(gè)時(shí)鐘域之間傳送大量的數(shù)據(jù),可以用異步FIFO來解決問題。
10、給了reg的setup,hold時(shí)間,求中間組合邏輯的delay范圍。(飛利浦-大唐筆試)
Delay < period - setup
11、時(shí)鐘周期為T,觸發(fā)器D1的寄存器到輸出時(shí)間最大為T1max,最小為T1min。組合邏輯電路最大延遲為T2max,最小為T2min。問,觸發(fā)器D2的建立時(shí)間T3和保持時(shí)間應(yīng)滿足什么條件。(華為)
12、說說靜態(tài)、動(dòng)態(tài)時(shí)序模擬的優(yōu)缺點(diǎn)。(威盛VIA 2003.11.06上海筆試試題)
靜態(tài)時(shí)序分析是采用窮盡分析方法來提取出整個(gè)電路存在的所有時(shí)序路徑,計(jì)算信號在這些路徑上的傳播延時(shí),檢查信號的建立和保持時(shí)間是否滿足時(shí)序要求,通過對最大路徑延時(shí)和最小路徑延時(shí)的分析,找出違背時(shí)序約束的錯(cuò)誤。它不需要輸入向量就能窮盡所有的路徑,且運(yùn)行速度很快、占用內(nèi)存較少,不僅可以對芯片設(shè)計(jì)進(jìn)行全面的時(shí)序功能檢查,而且還可利用時(shí)序分析的結(jié)果來優(yōu)化設(shè)計(jì),因此靜態(tài)時(shí)序分析已經(jīng)越來越多地被用到數(shù)字集成的驗(yàn)證中。
動(dòng)態(tài)時(shí)序模擬就是通常的仿真,因?yàn)椴豢赡墚a(chǎn)生完備的測試向量,覆蓋門級網(wǎng)表中的每一條路徑。因此在動(dòng)態(tài)時(shí)序分析中,無法暴露一些路徑上可能存在的時(shí)序問題;
同步電路:存儲(chǔ)電路中所有觸發(fā)器的時(shí)鐘輸入端都接同一個(gè)時(shí)鐘脈沖源,因而所有觸發(fā)器的狀態(tài)的變化都與所加的時(shí)鐘脈沖信號同步。
異步電路:電路沒有統(tǒng)一的時(shí)鐘,有些觸發(fā)器的時(shí)鐘輸入端與時(shí)鐘脈沖源相連,這有這些觸發(fā)器的狀態(tài)變化與時(shí)鐘脈沖同步,而其他的觸發(fā)器的狀態(tài)變化不與時(shí)鐘脈沖同步。
什么是NMOS、PMOS、CMOS?什么是增強(qiáng)型、耗盡型?什么是PNP、NPN?他們有什么差
別?
MOS場效應(yīng)管即金屬-氧化物-半導(dǎo)體型場效應(yīng)管,英文縮寫為MOSFET(Metal-Oxide-Semiconductor Field-Effect-Transistor),屬于絕緣柵型。其主要特點(diǎn)是在金屬柵極與溝道之間有一層二氧化硅絕緣層,因此具有很高的輸入電阻(最高可達(dá)1015Ω)。它也分N溝道管和P溝道管,符號如圖1所示。通常是將襯底(基板)與源極S接在一起。根據(jù)導(dǎo)電方式的不同,MOSFET又分增強(qiáng)型、耗盡型。所謂增強(qiáng)型是指:當(dāng)VGS=0時(shí)管子是呈截止?fàn)顟B(tài),加上正確的VGS后,多數(shù)載流子被吸引到柵極,從而“增強(qiáng)”了該區(qū)域的載流子,形成導(dǎo)電溝道。耗盡型則是指,當(dāng)VGS=0時(shí)即形成溝道,加上正確的VGS時(shí),能使多數(shù)載流子流出溝道,因而“耗盡”了載流子,使管子轉(zhuǎn)向截止。
PNP與NPN的區(qū)別在表面上是以PN結(jié)的方向來定義的,實(shí)際上是以三極管的結(jié)構(gòu)材料來區(qū)分的。PNP是兩邊的棒料是鎵,中間的是硅。鎵是第三主族的元素,其核外為三個(gè)電子,硅是第四主族的元素,其核外有四個(gè)電子,這樣在兩個(gè)PN的方向上的順序是P-N-N的關(guān)系;相反NPN是兩邊的材料是硅,中間的是鎵,形成的PN結(jié)順序?yàn)镹-P-N的關(guān)系。
順便說明:P的意思是在PN結(jié)上缺少電子,以空穴為主導(dǎo)電的材料,也叫P型材料;N的意思是在PN結(jié)上有多余的電子,以電子為主導(dǎo)電的材料,也叫N型材料。
根據(jù)不同分頻系數(shù)設(shè)置適當(dāng)?shù)挠?jì)數(shù)器周期,每個(gè)計(jì)數(shù)值對應(yīng)輸入時(shí)鐘信號fi的一個(gè)周期,讓q0只在fi的上升沿及適當(dāng)?shù)挠?jì)數(shù)范圍內(nèi)產(chǎn)生高電平,最后將q0和q1進(jìn)行邏輯或操作,進(jìn)而得到所需的分頻信號fo。q1的作用是在奇數(shù)分頻中補(bǔ)足下降沿處半個(gè)時(shí)鐘周期,使其等占空比,以及在半整數(shù)分頻中,在時(shí)鐘下降沿處產(chǎn)生分頻信號的上升沿,以實(shí)現(xiàn)半整數(shù)分頻。
下面介紹如何確定計(jì)數(shù)器周期以及q0、q1產(chǎn)生高電平輸出時(shí)各自的計(jì)數(shù)范圍。為敘述方便,現(xiàn)規(guī)定如下標(biāo)記:分頻系數(shù)為divide(MAX downto 0),其中MAX是分頻數(shù)對應(yīng)二進(jìn)制數(shù)的最高位,對于半整數(shù)分頻,最低位即第0位為小數(shù)位;q 0_count和q1_count分別為q0和q1產(chǎn)生高電平的計(jì)數(shù)范圍,并記divide(MAX downto 1)為a,divide(MAX downto 2)為b,divide(MAX downto 0)-1為c。
計(jì)數(shù)器周期都為0到c。等占空比的偶數(shù)分頻很容易實(shí)現(xiàn),在此不加敘述。對奇數(shù)分頻,只需當(dāng)q0_count<a時(shí)q0輸出高電平,當(dāng)q1_count=a-1時(shí)q1輸出一個(gè)周期的高電平,其他情況下q0和q1都為低電平,然后把q0和q1邏輯或,所得的輸出fo就是所需的基數(shù)分頻時(shí)鐘信號。
計(jì)數(shù)器周期為0到c。如果整數(shù)部分是偶數(shù),只需當(dāng)q0_count<b時(shí)q0輸出高電平,當(dāng)b≤q1_count<a+b時(shí)q1輸出高電平,其他情況下,q0和q1都為低電平;如果整數(shù)部分是奇數(shù),只需當(dāng)q0_coun≤b時(shí)q0輸出高電平,當(dāng)b≤q1_count≤a+b輸出高電平,其他情況下q0和q1都為低電平,然后把q0和q1邏輯或所得輸出f0即所需的半整數(shù)分頻時(shí)鐘信號。
1、latch由電平觸發(fā),非同步控制。在使能信號有效時(shí)latch相當(dāng)于通路,在使能信號無效時(shí)latch保持輸出狀態(tài)。DFF由時(shí)鐘沿觸發(fā),同步控制。
2、latch容易產(chǎn)生毛刺(glitch),DFF則不易產(chǎn)生毛刺。
3、如果使用門電路來搭建latch和DFF,則latch消耗的門資源比DFF要少,這是latch比DFF優(yōu)越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因?yàn)镕PGA中沒有標(biāo)準(zhǔn)的latch單元,但有DFF單元,一個(gè)LATCH需要多個(gè)LE才能實(shí)現(xiàn)。
一般的設(shè)計(jì)規(guī)則是:在絕大多數(shù)設(shè)計(jì)中避免產(chǎn)生latch。它會(huì)讓您設(shè)計(jì)的時(shí)序完蛋,并且它的隱蔽性很強(qiáng),非老手不能查出。latch最大的危害在于不能過濾毛刺。這對于下一級電路是極其危險(xiǎn)的。所以,只要能用D觸發(fā)器的地方,就不用latch。
有些地方?jīng)]有時(shí)鐘,也只能用latch了。比如現(xiàn)在用一個(gè)clk接到latch的使能端(假設(shè)是高電平使能),這樣需要的setup時(shí)間,就是數(shù)據(jù)在時(shí)鐘的下降沿之前需要的時(shí)間,但是如果是一個(gè)DFF,那么setup時(shí)間就是在時(shí)鐘的上升沿需要的時(shí)間。這就說明如果數(shù)據(jù)晚于控制信號的情況下,只能用latch,這種情況就是,前面所提到的latch timing borrow。基本上相當(dāng)于借了一個(gè)高電平時(shí)間。也就是說,latch借的時(shí)間也是有限的。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/17 16:27:13
LVDS技術(shù)原理和設(shè)計(jì)簡 作者:南京中興通訊研究所(210002) 張 健 南京郵電學(xué)院(210003) 吳曉冰 來源:《電子技術(shù)應(yīng)用》
LVDS技術(shù)原理和設(shè)計(jì)簡介
--------------------------------------------------------------------------------
摘 要: 介紹了LVDS(低電壓差分信號)技術(shù)的原理和應(yīng)用,并討論了在單板和系統(tǒng)設(shè)計(jì)中應(yīng)用LVDS時(shí)的布線技巧。
1 LVDS介紹
LVDS(Low Voltage Differential Signaling)是一種低擺幅的差分信號技術(shù),它使得信號能在差分PCB線對或平衡電纜上以幾百M(fèi)bps的速率傳輸,其低壓幅和低電流驅(qū)動(dòng)輸出實(shí)現(xiàn)了低噪聲和低功耗。
幾十年來,5V供電的使用簡化了不同技術(shù)和廠商邏輯電路之間的接口。然而,隨著集成電路的發(fā)展和對更高數(shù)據(jù)速率的要求,低壓供電成為急需。降低供電電壓不僅減少了高密度集成電路的功率消耗,而且減少了芯片內(nèi)部的散熱,有助于提高集成度。
減少供電電壓和邏輯電壓擺幅的一個(gè)極好例子是低壓差分信號(LVDS)。LVDS物理接口使用1.2V偏置提供400mV擺幅的信號(使用差分信號的原因是噪聲以共模的方式在一對差分線上耦合出現(xiàn),并在接收器中相減從而可消除噪聲)。LVDS驅(qū)動(dòng)和接收器不依賴于特定的供電電壓,因此它很容易遷移到低壓供電的系統(tǒng)中去,而性能不變。作為比較,ECL和PECL技術(shù)依賴于供電電壓,ECL要求負(fù)的供電電壓,PECL參考正的供電電壓總線上電壓值(Vcc)而定。而GLVDS是一種發(fā)展中的標(biāo)準(zhǔn)尚未確定的新技術(shù),使用500mV的供電電壓可提供250mV 的信號擺幅。不同低壓邏輯信號的差分電壓擺幅示于圖1。
LVDS在兩個(gè)標(biāo)準(zhǔn)中定義。IEEE P1596.3(1996年3月通過),主要面向SCI(Scalable Coherent Interface),定義了LVDS的電特性,還定義了SCI協(xié)議中包交換時(shí)的編碼;ANSI/EIA/EIA-644(1995年11月通過),主要定義了LVDS的電特性,并建議了655Mbps的最大速率和1.823Gbps的無失真媒質(zhì)上的理論極限速率。在兩個(gè)標(biāo)準(zhǔn)中都指定了與物理媒質(zhì)無關(guān)的特性,這意味著只要媒質(zhì)在指定的噪聲邊緣和歪斜容忍范圍內(nèi)發(fā)送信號到接收器,接口都能正常工作。 LVDS具有許多優(yōu)點(diǎn):①終端適配容易;②功耗低;③具有fail-safe特性確保可靠性;④低成本;⑤高速傳送。這些特性使得LVDS在計(jì)算機(jī)、通信設(shè)備、消費(fèi)電子等方面得到了廣泛應(yīng)用。
圖2給出了典型的LVDS接口,這是一種單工方式,必要時(shí)也可使用半雙工、多點(diǎn)配置方式,但一般在噪聲較小、距離較短的情況下才適用。每個(gè)點(diǎn)到點(diǎn)連接的差分對由一個(gè)驅(qū)動(dòng)器、互連器和接收器組成。驅(qū)動(dòng)器和接收器主要完成TTL信號和LVDS信號之間的轉(zhuǎn)換。互連器包含電纜、PCB上差分導(dǎo)線對以及匹配電阻。LVDS驅(qū)動(dòng)器由一個(gè)驅(qū)動(dòng)差分線對的電流源組成通常電流為3.5mA),LVDS接收器具有很高的輸入阻抗,因此驅(qū)動(dòng)器輸出的電流大部分都流過100Ω的匹配電阻,并在接收器的輸入端產(chǎn)生大約350mA 的電壓。當(dāng)驅(qū)動(dòng)器翻轉(zhuǎn)時(shí),它改變流經(jīng)電阻的電流方向,因此產(chǎn)生有效的邏輯″1″和邏輯″0″狀態(tài)。低擺幅驅(qū)動(dòng)信號實(shí)現(xiàn)了高速操作并減小了功率消耗,差分信號提供了適當(dāng)噪聲邊緣和功率消耗大幅減少的低壓擺幅。功率的大幅降低允許在單個(gè)集成電路上集成多個(gè)接口驅(qū)動(dòng)器和接收器。這提高了PCB板的效能,減少了成本。
不管使用的LVDS傳輸媒質(zhì)是PCB線對還是電纜,都必須采取措施防止信號在媒質(zhì)終端發(fā)生反射,同時(shí)減少電磁干擾。LVDS要求使用一個(gè)與媒質(zhì)相匹配的終端電阻(100±20Ω),該電阻終止了環(huán)流信號,應(yīng)該將它盡可能靠近接收器輸入端放置。LVDS驅(qū)動(dòng)器能以超過155.5Mbps的速度驅(qū)動(dòng)雙絞線對,距離超過10m。對速度的實(shí)際限制是:①送到驅(qū)動(dòng)器的TTL數(shù)據(jù)的速度;②媒質(zhì)的帶寬性能。通常在驅(qū)動(dòng)器側(cè)使用復(fù)用器、在接收器側(cè)使用解復(fù)用器來實(shí)現(xiàn)多個(gè)TTL信道和一個(gè)LVDS信道的復(fù)用轉(zhuǎn)換,以提高信號速率,降低功耗。并減少傳輸媒質(zhì)和接口數(shù),降低設(shè)備復(fù)雜性。
LVDS接收器可以承受至少±1V的驅(qū)動(dòng)器與接收器之間的地的電壓變化。由于LVDS驅(qū)動(dòng)器典型的偏置電壓為+1.2V,地的電壓變化、驅(qū)動(dòng)器偏置電壓以及輕度耦合到的噪聲之和,在接收器的輸入端相對于接收器的地是共模電壓。這個(gè)共模范圍是:+0.2V~+2.2V。建議接收器的輸入電壓范圍為:0V~+2.4V。
2 LVDS系統(tǒng)的設(shè)計(jì)
LVDS系統(tǒng)的設(shè)計(jì)要求設(shè)計(jì)者應(yīng)具備超高速單板設(shè)計(jì)的經(jīng)驗(yàn)并了解差分信號的理論。設(shè)計(jì)高速差分板并不很困難,下面將簡要介紹一下各注意點(diǎn)。
2.1 PCB板
(A)至少使用4層PCB板(從頂層到底層):LVDS信號層、地層、電源層、TTL信號層;
(B)使TTL信號和LVDS信號相互隔離,否則TTL可能會(huì)耦合到LVDS線上,最好將TTL和LVDS信號放在由電源/地層隔離的不同層上;
(C)使LVDS驅(qū)動(dòng)器和接收器盡可能地靠近連接器的LVDS端;
(D)使用分布式的多個(gè)電容來旁路LVDS設(shè)備,表面貼電容靠近電源/地層管腳放置;
(E)電源層和地層應(yīng)使用粗線,不要使用50Ω布線規(guī)則;
(F)保持PCB地線層返回路徑寬而短;
(G)應(yīng)該使用利用地層返回銅線(gu9ound return wire)的電纜連接兩個(gè)系統(tǒng)的地層;
(H) 使用多過孔(至少兩個(gè))連接到電源層(線)和地層(線),表面貼電容可以直接焊接到過孔焊盤以減少線頭。
2.2 板上導(dǎo)線
(A) 微波傳輸線(microstrip)和帶狀線(stripline)都有較好性能;
(B) 微波傳輸線的優(yōu)點(diǎn):一般有更高的差分阻抗、不需要額外的過孔;
(C) 帶狀線在信號間提供了更好的屏蔽。
2.3 差分線
(A)使用與傳輸媒質(zhì)的差分阻抗和終端電阻相匹配的受控阻抗線,并且使差分線對離開集成芯片后立刻盡可能地相互靠近(距離小于10mm),這樣能減少反射并能確保耦合到的噪聲為共模噪聲;
(B)使差分線對的長度相互匹配以減少信號扭曲,防止引起信號間的相位差而導(dǎo)致電磁輻射;
(C)不要僅僅依賴自動(dòng)布線功能,而應(yīng)仔細(xì)修改以實(shí)現(xiàn)差分阻抗匹配并實(shí)現(xiàn)差分線的隔離;
(D)盡量減少過孔和其它會(huì)引起線路不連續(xù)性的因素;
(E)避免將導(dǎo)致阻值不連續(xù)性的90°走線,使用圓弧或45°折線來代替;
(F)在差分線對內(nèi),兩條線之間的距離應(yīng)盡可能短,以保持接收器的共模抑制能力。在印制板上,兩條差分線之間的距離應(yīng)盡可能保持一致,以避免差分阻抗的不連續(xù)性。
2.4 終端
(A)使用終端電阻實(shí)現(xiàn)對差分傳輸線的最大匹配,阻值一般在90~130Ω之間,系統(tǒng)也需要此終端電阻來產(chǎn)生正常工作的差分電壓;
(B)最好使用精度1~2%的表面貼電阻跨接在差分線上,必要時(shí)也可使用兩個(gè)阻值各為50Ω的電阻,并在中間通過一個(gè)電容接地,以濾去共模噪聲。
2.5 未使用的管腳
所有未使用的LVDS接收器輸入管腳懸空,所有未使用的LVDS和TTL輸出管腳懸空,將未使用的TTL發(fā)送/驅(qū)動(dòng)器輸入和控制/使能管腳接電源或地。
2.6 媒質(zhì)(電纜和連接器)選擇
(A)使用受控阻抗媒質(zhì),差分阻抗約為100Ω,不會(huì)引入較大的阻抗不連續(xù)性;
(B)僅就減少噪聲和提高信號質(zhì)量而言,平衡電纜(如雙絞線對)通常比非平衡電纜好;
(C)電纜長度小于0.5m時(shí),大部分電纜都能有效工作,距離在0.5m~10m之間時(shí),CAT 3(Categiory 3)雙絞線對電纜效果好、便宜并且容易買到,距離大于10m并且要求高速率時(shí),建議使用CAT 5雙絞線對。
2.7 在噪聲環(huán)境中提高可靠性設(shè)計(jì)
LVDS 接收器在內(nèi)部提供了可靠性線路,用以保護(hù)在接收器輸入懸空、接收器輸入短路以及接收器輸入匹配等情況下輸出可靠。但是,當(dāng)驅(qū)動(dòng)器三態(tài)或者接收器上的電纜沒有連接到驅(qū)動(dòng)器上時(shí),它并沒有提供在噪聲環(huán)境中的可靠性保證。在此情況下,電纜就變成了浮動(dòng)的天線,如果電纜感應(yīng)到的噪聲超過LVDS內(nèi)部可靠性線路的容限時(shí),接收器就會(huì)開關(guān)或振蕩。如果此種情況發(fā)生,建議使用平衡或屏蔽電纜。另外,也可以外加電阻來提高噪聲容限,如圖3所示。 圖中R1、R3是可選的外接電阻,用來提高噪聲容限,R2≈100Ω。
當(dāng)然,如果使用內(nèi)嵌在芯片中的LVDS收發(fā)器,由于一般都有控制收發(fā)器是否工作的機(jī)制,因而這種懸置不會(huì)影響系統(tǒng)。
3 應(yīng)用實(shí)例
LVDS技術(shù)目前在高速系統(tǒng)中應(yīng)用的非常廣泛,本文給出一個(gè)簡單的例子來看一下具體的連線方式。加拿大PMC公司的DSLAM(數(shù)字用戶線接入模塊)方案中,利用LVDS技術(shù)實(shí)現(xiàn)點(diǎn)對點(diǎn)的單板互聯(lián),系統(tǒng)結(jié)構(gòu)可擴(kuò)展性非常好,實(shí)現(xiàn)了線卡上的高集成度,并且完全能夠滿足業(yè)務(wù)分散、控制集中帶來的大量業(yè)務(wù)數(shù)據(jù)和控制流通信的要求。 圖4描述了該系統(tǒng)線卡與線卡之間、線卡與背板之間的連線情形,使用的都是單工方式,所以需要兩對線來實(shí)現(xiàn)雙向通信。圖中示出了三種不同連接方式,從上到下分別為:存在對應(yīng)連接芯片;跨機(jī)架時(shí)實(shí)現(xiàn)終端匹配;同層機(jī)框時(shí)實(shí)現(xiàn)終端匹配。在接收端串接一個(gè)變壓器可以減小干擾并避免LVDS驅(qū)動(dòng)器和接收器地電位差較大的影響。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(fù)(0)
發(fā)表于 2010/4/17 9:28:15
FPGA設(shè)計(jì)流程(轉(zhuǎn)) 1.設(shè)計(jì)輸入
1)設(shè)計(jì)的行為或結(jié)構(gòu)描述。
2)典型文本輸入工具有UltraEdit-32和Editplus.exe.。
3)典型圖形化輸入工具-Mentor的Renoir。
4)我認(rèn)為UltraEdit-32最佳。
2.代碼調(diào)試
1)對設(shè)計(jì)輸入的文件做代碼調(diào)試,語法檢查。
2)典型工具為Debussy。
3.前仿真
1)功能仿真
2)驗(yàn)證驗(yàn)證邏輯模型(沒有使用時(shí)間延遲)。
3)典型工具有Mentor公司的ModelSim、Synopsys公司的VCS和VSS、Aldec公司的Active、Cadense公司的NC。
4)我認(rèn)為做功能仿真Synopsys公司的VCS和VSS速度最快,并且調(diào)試器最好用,Mentor公司的ModelSim對于讀寫文件速度最快,波形窗口比較好用。
4.綜合
1)把設(shè)計(jì)翻譯成原始的目標(biāo)工藝
2)最優(yōu)化
3)合適的面積要求和性能要求
4)典型工具有Mentor公司的LeonardoSpectrum、Synopsys公司的DC、Synplicity公司的Synplify。
5)推薦初學(xué)者使用Mentor公司的LeonardoSpectrum,由于它在只作簡單約束綜合后的速度和面積最優(yōu),如果你對綜合工具比較了解,可以使用Synplicity公司的
Synplify。
5.布局和布線
1)映射設(shè)計(jì)到目標(biāo)工藝?yán)镏付ㄎ恢?br />
2)指定的布線資源應(yīng)被使用
3)由于PLD市場目前只剩下Altera,Xilinx,Lattice,Actel,QuickLogic,Atmel六家公司,其中前5家為專業(yè)PLD公司,并且前3家?guī)缀跽加辛?0%的市場份額,
而我們一般使用Altera,Xilinx公司的PLD居多,所以典型布局和布線的工具為Altera公司的Quartus II和Maxplus II、Xilinx公司的ISE和Foudation。
4)Maxplus II和Foudation分別為Altera公司和Xilinx公司的第一代產(chǎn)品產(chǎn)品,所以布局布線一般使用Quartus II和ISE。
6.后仿真
1)時(shí)序仿真
2)驗(yàn)證設(shè)計(jì)一旦編程或配置將能在目標(biāo)工藝?yán)锕ぷ鳎ㄊ褂脮r(shí)間延遲)。
3)所用工具同前仿真所用軟件。
7.時(shí)序分析
4)一般借助布局布線工具自帶的時(shí)序分析工具,也可以使用Synopsys公司的 PrimeTime軟件和Mentor Graphics公司的Tau timing analysis軟件。
8.驗(yàn)證合乎性能規(guī)范
1)驗(yàn)證合乎性能規(guī)范,如果不滿足,回到第一步。
9.版圖設(shè)計(jì)
1)驗(yàn)證版版圖設(shè)計(jì)。
2)在板編程和測試器件。
點(diǎn)擊查看原文
發(fā)表評論 閱讀全文(34) | 回復(fù)(1)
發(fā)表于 2010/4/16 19:30:46
關(guān)于inout口的使用(轉(zhuǎn)) 見許多問這個(gè)問題的,總結(jié)一下,希望能對大家有點(diǎn)用處,如果有不對的地方,歡迎指出.
芯片外部引腳很多都使用inout類型的,為的是節(jié)省管腿。一般信號線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r(shí)候就要用到
INOUT類型了。就是一個(gè)端口同時(shí)做輸入和輸出。 inout在具體實(shí)現(xiàn)上一般用三態(tài)門來實(shí)現(xiàn)。三態(tài)門的第三個(gè)狀態(tài)就是高阻'Z'。 當(dāng)inout端口不輸出時(shí),將三態(tài)門置高阻。這樣信號就不會(huì)因?yàn)閮啥送瑫r(shí)輸出而出錯(cuò)了,更詳細(xì)的內(nèi)容可以搜索一下三態(tài)門tri-state的資料.
1 使用inout類型數(shù)據(jù),可以用如下寫法:
inout data_inout;
input data_in;
reg data_reg;//data_inout的映象寄存器
reg link_data;
assign data_inout=link_data?data_reg:1’bz;//link_data控制三態(tài)門
//對于data_reg,可以通過組合邏輯或者時(shí)序邏輯根據(jù)data_in對其賦值.通過控制link_data的高低電平,從而設(shè)置data_inout是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時(shí)當(dāng)作輸入端口使用.link_data可以通過相關(guān)電路來控制.
2 編寫測試模塊時(shí),對于inout類型的端口,需要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區(qū)別的.
當(dāng)上面例子中的data_inout用作輸入時(shí),需要賦值給data_inout,其余情況可以斷開.此時(shí)可以用assign語句實(shí)現(xiàn):assign data_inout=link?data_in_t:1’bz;其中的link ,data_in_t是reg類型變量,在測試模塊中賦值.
另外,可以設(shè)置一個(gè)輸出端口觀察data_inout用作輸出的情況:
Wire data_out;
Assign data_out_t=(!link)?data_inout:1’bz;
else,in RTL
inout use in top module(PAD)
dont use inout(tri) in sub module
也就是說,在內(nèi)部模塊最好不要出現(xiàn)inout,如果確實(shí)需要,那么用兩個(gè)port實(shí)現(xiàn),到頂層的時(shí)候再用三態(tài)實(shí)現(xiàn)。理由是:在非頂層模塊用雙向口的話,該雙向口必然有它的上層跟它相連。既然是雙向口,則上層至少有一個(gè)輸入口和一個(gè)輸出口聯(lián)到該雙向口上,則發(fā)生兩個(gè)內(nèi)部輸出單元連接到一起的情況出現(xiàn),這樣在綜合時(shí)往往會(huì)出錯(cuò)。
舉例說明
輸入口din定義:input[7:0]din;當(dāng)雙向端口
dinout作為輸出口時(shí),我們從din端口輸入數(shù)據(jù)到
模塊中,讓數(shù)據(jù)從dinout口出來。
輸出口dout定義:output[7:0]dout;當(dāng)雙向
端口dinout作為輸入口時(shí),我們讓數(shù)據(jù)從dinout口
輸入,從輸出口dout輸出。
雙向端口dinout定義:inout[7:0]dinout;
三態(tài)門選通信號z:inputz;
當(dāng)z=1時(shí),把三態(tài)門置為高阻態(tài),這時(shí)dinout
作為輸入口用;當(dāng)z=0時(shí),開通三態(tài)門,這時(shí)dinout
作為輸出口用。
三態(tài)門控制語句為:
assigndinout=(!z)?din_reg:8'bz;
總的完整程序如下:
moduledinout(din,z,clk,dout,dinout);
input [7:0]din;
input z;
input clk;
output [7:0]dout;
inout [7:0]dinout;
reg [7:0]dout;
reg [7:0]din_reg;
assigndinout=(!z)?din_reg:8'bz;
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
国产a视频
|
性xxxxx|
国产一区二区在线视频
|
请别相信他免费喜剧电影在线观看
|
国产精品久久久久久久久久久新郎
|
亚洲精品99
|
亚洲精品黄色
|
精品区|
亚洲一区国产精品
|
国产一区二区三区
|
一区二区三区精品视频
|
www.婷婷|
97av视频|
97精品国产97久久久久久免费
|
午夜激情免费视频
|
成人在线精品视频
|
国产探花在线观看视频
|
99久久婷婷国产综合精品电影
|
99热国产在线播放
|
精品三级在线观看
|
国产一区高清
|
成人毛片视频免费
|
欧美日韩在线视频一区二区
|
99精品电影
|
一级做a爰片性色毛片16美国
|
在线观看国产
|
国产精品视频网站
|
久久久新视频
|
久久久久免费观看
|
黄色国产在线视频
|
久久综合婷婷
|
亚洲不卡在线观看
|
国产综合av
|
色资源站
|
欧美激情啪啪
|
中文字幕一区二区三区四区五区
|
日韩欧美一级片
|
国产成人精品一区二区三区
|
亚洲第一视频网
|
黄色毛片免费视频
|
天天色官网
|