在公司里的幾個月,做的項目其實不多,但是收獲還是有一些,我覺得收獲最大的是
設計理念的改變,這也是我這段時間最想總結的,我會在后面逐漸闡述。
1 時序是設計出來的
我的boss有在華為及峻龍工作的背景,自然就給我們講了一些華為及altera做邏輯
的一些東西,而我們的項目規(guī)范,也基本上是按華為的那一套去做。在工作這幾個月中
,給我感觸最深的是華為的那句話:時序是設計出來的,不是仿出來的,更不是湊出來
的。
在我們公司,每一個項目都有很嚴格的評審,只有評審通過了,才能做下一步的工
作。以做邏輯為例,并不是一上來就開始寫代碼,而是要先寫總體設計方案和邏輯詳細
設計方案,要等這些方案評審通過,認為可行了,才能進行編碼,一般來說這部分工作
所占的時間要遠大于編碼的時間。
總體方案主要是涉及模塊劃分,一級模塊和二級模塊的接口信號和時序(我們要求
把接口信號的時序波形描述出來)以及將來如何測試設計。在這一級方案中,要保證在
今后的設計中時序要收斂到一級模塊(最后是在二級模塊中)。什么意思呢?我們在做
詳細設計的時候,對于一些信號的時序肯定會做一些調(diào)整的,但是這種時序的調(diào)整最多
只能波及到本一級模塊,而不能影響到整個設計。記得以前在學校做設計的時候,由于
不懂得設計時序,經(jīng)常因為有一處信號的時序不滿足,結果不得不將其它模塊信號的時
序也改一下,搞得人很郁悶。
在邏輯詳細設計方案這一級的時候,我們已經(jīng)將各級模塊的接口時序都設計出來了
,各級模塊內(nèi)部是怎么實現(xiàn)的也基本上確定下來了。
由于做到這一點,在編碼的時候自然就很快了,最重要的是這樣做后可以讓設計會
一直處于可控的狀態(tài),不會因為某一處的錯誤引起整個設計從頭進行。
2規(guī)范很重要
工作過的朋友肯定知道,公司里是很強調(diào)規(guī)范的,特別是對于大的設計(無論軟件軟件
還是硬件),不按照規(guī)范走幾乎是不可實現(xiàn)的。邏輯設計也是這樣:如果不按規(guī)范做的
話,過一個月后調(diào)試時發(fā)現(xiàn)有錯,回頭再看自己寫的代碼,估計很多信號功能都忘了,
更不要說檢錯了;如果一個項目做了一半一個人走了,接班的估計得從頭開始設計;如
果需要在原來的版本基礎上增加新功能,很可能也得從頭來過,很難做到設計的可重用
性。
在邏輯方面,我覺得比較重要的規(guī)范有這些:
1.設計必須文檔化。要將設計思路,詳細實現(xiàn)等寫入文檔,然后經(jīng)過嚴格評審通過
后才能進行下一步的工作。這樣做乍看起來很花時間,但是從整個項目過程來看,絕對
要比一上來就寫代碼要節(jié)約時間,且這種做法可以使項目處于可控、可實現(xiàn)的狀態(tài)。
2.代碼規(guī)范。
a.設計要參數(shù)化。比如一開始的設計時鐘周期是30ns,復位周期是5個時鐘周期,我
們可以這么寫:
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;
如果在另一個設計中的時鐘是40ns,復位周期不變,我們只需對CLK_PERIOD進行重
新例化就行了,從而使得代碼更加易于重用。
b.信號命名要規(guī)范化。
1) 信號名一律小寫,參數(shù)用大寫。
2) 對于低電平有效的信號結尾要用_n標記,如rst_n。
3) 端口信號排列要統(tǒng)一,一個信號只占一行,最好按輸入輸出及從哪個模塊來到哪
個模塊去的關系排列,這樣在后期仿真驗證驗證找錯時后 方便很多。如:
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) 一個模塊盡量只用一個時鐘,這里的一個模塊是指一個module或者是一個en
tity。在多時鐘域的設計中涉及到跨時鐘域的設計中最好有專門一個模塊做時鐘域的隔
離。這樣做可以讓綜合器綜合出更優(yōu)的結果。
5) 盡量在底層模塊上做邏輯,在高層盡量做例化,頂層模塊只能做例化,禁止
出現(xiàn)任何膠連邏輯(glue logic),哪怕僅僅是對某個信號取反。理由同上。
6) 在FPGAFPGA的設計上禁止用純組合邏輯產(chǎn)生latch,帶D觸發(fā)器的latch的是允許的
,比如配置寄存器就是這種類型。
7) 一般來說,進入FPGA的信號必須先同步,以提高系統(tǒng)工作頻率(板級)。
8) 所有模塊的輸出都要寄存器化,以提高工作頻率,這對設計做到時序收斂也
是極有好處的。
9) 除非是低功耗設計,不然不要用門控時鐘--這會增加設計的不穩(wěn)定性,在要
用到門控時鐘的地方,也要將門控信號用時鐘的下降沿 打一拍再輸出與時鐘相與。
clk_gate_en -------- ----
-----------------|D Q |------------------| \ gate_clk
_out
| | ---------| )--------
-
------o|> | | | /
clk | -------- | ----
------------------------------------
10)禁止用計數(shù)器分頻后的信號做其它模塊的時鐘,而要用改成時鐘使能的方式
,否則這種時鐘滿天飛的方式對設計的可靠性極為不利,也大大增加了靜態(tài)時序分析的
復雜性。如FPGA的輸入時鐘是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)機要寫成3段式的(這是最標準的寫法),即
...
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; //賦默認值
case(current_state)
s1:
a <= 1'b0; //由于上面賦了默認值,這里就不用再對b
、c賦值了
s2:
b <= 1'b1;
s3:
c <= 1'b1;
default:
...
...
3.ALTERA參考設計準則
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ī)范一時沒有想到,想到了再寫,也歡迎大家補充。
3/如何提高電路工作頻率
對于設計者來說,我們當然希望我們設計的電路的工作頻率(在這里如無特別說明
,工作頻率指FPGA片內(nèi)的工作頻率)盡量高。我們也經(jīng)常聽說用資源換速度,用流水的
方式可以提高工作頻率,這確實是一個很重要的方法,今天我想進一步去分析該如何提
高電路的工作頻率。
我們先來分析下是什么影響了電路的工作頻率。
我們電路的工作頻率主要與寄存器到寄存器之間的信號傳播時延及clock skew有關
。在FPGA內(nèi)部如果時鐘走長線的話,clock skew很小,基本上可以忽略, 在這里為了簡
單起見,我們只考慮信號的傳播時延的因素。
信號的傳播時延包括寄存器的開關時延、走線時延、經(jīng)過組合邏輯的時延(這樣劃
分或許不是很準確,不過對分析問題來說應該是沒有可以的),要提高電路的工作頻率
,我們就要在這三個時延中做文章,使其盡可能的小。
我們先來看開關時延,這個時延是由器件物理特性決定的,我們沒有辦法去改變,
所以我們只能通過改變走線方式和減少組合邏輯的方法來提高工作頻率。
1.通過改變走線的方式減少時延。
以altera的器件為例,我們在quartus里面的timing closure floorplan可以看到有
很多條條塊塊,我們可以將條條塊塊按行和按列分,每一個條塊代表1個LAB,每個LAB里
有8個或者是10個LE。它們的走線時延的關系如下:同一個LAB中(最快) < 同列或者同
行 < 不同行且不同列。
我們通過給綜合器加適當?shù)募s束(不可貪心,一般以加5%裕量較為合適,比如電路
工作在100Mhz,則加約束加到105Mhz就可以了,貪心效果反而不好,且極大增加綜合時
間)可以將相關的邏輯在布線時盡量布的靠近一點,從而減少走線的時延。(注:約束
的實現(xiàn)不完全是通過改進布局布線方式去提高工作頻率,還有其它的改進措施)
2.通過減少組合邏輯的減少時延。
上面我們講了可以通過加約束來提高工作頻率,但是我們在做設計之初可萬萬不可
將提高工作頻率的美好愿望寄托在加約束上,我們要通過合理的設計去避免出現(xiàn)大的組
合邏輯,從而提高電路的工作頻率,這才能增強設計的可移植性,才可以使得我們的設
計在移植到另一同等速度級別的芯片時還能使用。
我們知道,目前大部分FPGA都基于4輸入LUT的,如果一個輸出對應的判斷條件大于
四輸入的話就要由多個LUT級聯(lián)才能完成,這樣就引入一級組合邏輯時延,我們要減少組
合邏輯,無非就是要輸入條件盡可能的少,,這樣就可以級聯(lián)的LUT更少,從而減少了組
合邏輯引起的時延。
我們平時聽說的流水就是一種通過切割大的組合邏輯(在其中插入一級或多級D觸發(fā)
器,從而使寄存器與寄存器之間的組合邏輯減少)來提高工作頻率的方法。比如一個32
位的計數(shù)器,該計數(shù)器的進位鏈很長,必然會降低工作頻率,我們可以將其分割成4位和
8位的計數(shù),每當4位的計數(shù)器計到15后觸發(fā)一次8位的計數(shù)器,這樣就實現(xiàn)了計數(shù)器的切
割,也提高了工作頻率。
在狀態(tài)機中,一般也要將大的計數(shù)器移到狀態(tài)機外,因為計數(shù)器這東西一般是經(jīng)常
是大于4輸入的,如果再和其它條件一起做為狀態(tài)的跳變判據(jù)的話,必然會增加LUT的級
聯(lián),從而增大組合邏輯。以一個6輸入的計數(shù)器為例,我們原希望當計數(shù)器計到111100后
狀態(tài)跳變,現(xiàn)在我們將計數(shù)器放到狀態(tài)機外,當計數(shù)器計到111011后產(chǎn)生個enable信號
去觸發(fā)狀態(tài)跳變,這樣就將組合邏輯減少了。
上面說的都是可以通過流水的方式切割組合邏輯的情況,但是有些情況下我們是很
難去切割組合邏輯的,在這些情況下我們又該怎么做呢?
狀態(tài)機就是這么一個例子,我們不能通過往狀態(tài)譯碼組合邏輯中加入流水。如果我
們的設計中有一個幾十個狀態(tài)的狀態(tài)機,它的狀態(tài)譯碼邏輯將非常之巨大,毫無疑問,
這極有可能是設計中的關鍵路徑。那我們該怎么做呢?還是老思路,減少組合邏輯。我
們可以對狀態(tài)的輸出進行分析,對它們進行重新分類,并根據(jù)這個重新定義成一組組小
狀態(tài)機,通過對輸入進行選擇(case語句)并去觸發(fā)相應的小狀態(tài)機,從而實現(xiàn)了將大的
狀態(tài)機切割成小的狀態(tài)機。在ATA6的規(guī)范中(硬盤的標準),輸入的命令大概有20十種
,每一個命令又對應很多種狀態(tài),如果用一個大的狀態(tài)機(狀態(tài)套狀態(tài))去做那是不可
想象的,我們可以通過case語句去對命令進行譯碼,并觸發(fā)相應的狀態(tài)機,這樣做下來
這一個模塊的頻率就可以跑得比較高了。
總結:提高工作頻率的本質(zhì)就是要減少寄存器到寄存器的時延,最有效的方法就是
避免出現(xiàn)大的組合邏輯,也就是要盡量去滿足四輸入的條件,減少LUT級聯(lián)的數(shù)量。我們
可以通過加約束、流水、切割狀態(tài)的方法提高工作頻率。
4/ 做邏輯的難點在于系統(tǒng)結構設計和仿真驗證
剛?cè)ス镜臅r候BOSS就和我講,做邏輯的難點不在于RTL級代碼的設計,而在于系統(tǒng)
結構設計和仿真驗證方面。目前國內(nèi)對可綜合的設計強調(diào)的比較多,而對系統(tǒng)結構設計
和仿真驗證方面似乎還沒有什么資料,這或許也從一個側(cè)面反映了國內(nèi)目前的設計水平
還比較低下吧。
以前在學校的時候,總是覺得將RTL級代碼做好就行了,仿真驗證只是形式而已,所
以對HDL的行為描述方面的語法不屑一顧,對testbench也一直不愿意去學--因為覺得畫
波形圖方便;對于系統(tǒng)結構設計更是一點都不懂了。
到了公司接觸了些東西才發(fā)現(xiàn)完全不是這樣。
其實在國外,花在仿真驗證上的時間和人力大概是花在RTL級代碼上的兩倍,現(xiàn)在仿
真驗證才是百萬門級芯片設計的關鍵路徑。仿真驗證的難點主要在于怎么建模才能完全
和準確地去驗證設計的正確性(主要是提高代碼覆蓋),在這過程中,驗證速度也是很
重要的。
驗證說白了也就是怎么產(chǎn)生足夠覆蓋率的激勵源,然后怎么去檢測錯誤。我個人認
為,在仿真驗證中,最基本就是要做到驗證的自動化。這也是為什么我們要寫testbenc
h的原因。在我現(xiàn)在的一個設計中,每次跑仿真都要一個小時左右(這其實算小設計)。
由于畫波形圖無法做到驗證自動化,如果用通過畫波形圖來仿真的話,一是畫波形會畫
死(特別是對于算法復雜的、輸入呈統(tǒng)計分布的設計),二是看波形圖要看死,三是檢
錯率幾乎為零。
那么怎么做到自動化呢?我個人的水平還很有限,只能簡單地談下BFM(bus funct
ion model,總線功能模型)。
以做一個MAC的core為例(背板是PCI總線),那么我們需要一個MAC_BFM和PCI_BFM
及PCI_BM(PCI behavior model)。MAC_BFM的主要功能是產(chǎn)生以太網(wǎng)幀(激勵源),隨
機的長度和幀頭,內(nèi)容也是隨機的,在發(fā)送的同時也將其復制一份到PCI_BM中;PCI_BFM
的功能則是仿PCI總線的行為,比如被測收到了一個正確幀后會向PCI總線發(fā)送一個
請求,PCI_BFM則會去響應它,并將數(shù)據(jù)收進來;PCI_BM的主要功能是將MAC_BFM發(fā)送出
來的東西與PCI_BFM接收到的東西做比較,由于它具有了MAC_BFM的發(fā)送信息和PCI_BFM的
接收信息,只要設計合理,它總是可以自動地、完全地去測試被測是否工作正常,
從而實現(xiàn)自動檢測。
華為在仿真驗證方面估計在國內(nèi)來說是做的比較好的,他們已建立起了比較好的驗
證平臺,大部分與通信有關的BFM都做好了,聽我朋友說,現(xiàn)在他們只需要將被測放
在測試平臺中,并配置好參數(shù),就可以自動地檢測被測功能的正確與否。
在功能仿真做完后,由于我們做在是FPGA的設計,在設計時已經(jīng)基本保證RTL級代碼
在綜合結果和功能仿真結果的一致性,只要綜合布局布線后的靜態(tài)時序報告沒有違反時
序約束的警告,就可以下到板子上去調(diào)試了。事實上,在華為中興,他們做FPGA的設計
時也是不做時序仿真的,因為做時序仿真很花時間,且效果也不見得比看靜態(tài)時序分析
報告好。
當然了,如果是ASICASIC的設計話,它們的仿真驗證的工作量要大一些,在涉及到多時
鐘域的設計時,一般還是做后仿的。不過在做后仿之前,也一般會先用形式驗證工具和
通過靜態(tài)時序分序報告去查看有沒有違反設計要求的地方,這樣做了之后,后仿的工作
量可以小很多。
在HDL語言HDL語言方面,國內(nèi)語言很多人都在爭論VHDLVHDL和verilogverilog哪個好,其實我個人認為
這并沒有多大的意義,外面的大公司基本上都是用verilog在做RTL級的代碼,所以還是
建議大家盡量學verilog。在仿真方面,由于VHDL在行為級建模方面弱于verilog,用VH
DL做仿真模型的很少,當然也不是說verilog就好,其實verilog在復雜的行為級建模方
面的能力也是有限的,比如目前它還不支持數(shù)組。在一些復雜的算法設計中,需要高級
語言做抽象才能描述出行為級模型。在國外,仿真建模很多都是用System C和E語言,用
verilog的都算是很落后的了,國內(nèi)華為的驗證平臺好像是用System C寫。
在系統(tǒng)結構設計方面,由于我做的設計還不夠大,還談不上什么經(jīng)驗,只是覺得必
須要具備一些計算機系統(tǒng)結構的知識才行。劃分的首要依據(jù)是功能,之后是選擇合適的
總線結構、存儲結構和處理器架構,通過系統(tǒng)結構劃分要使各部分功能模塊清晰,易于
實現(xiàn)。這一部分我想過段時間有一點體會了再和大家分享,就先不誤導大家了。
點擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(0)
發(fā)表于 2010/4/18 16:20:21
淺淡邏輯設計的學習 學習邏輯設計首先要有項目掛靠,如果你覺得未來一段時間你都不可能有的話,接下來的內(nèi)容你就沒有必要再看了,花的時間再多也只能學到皮毛--很多細節(jié)的問題光寫代碼是發(fā)現(xiàn)不到的。而且要真正入門,最好要多做幾個項目(這三年大大小小的項目我做有七八個),總線型的和數(shù)字信號處理型的最好都要接觸一些,因為這兩個方向的邏輯設計差異比較大:前者主要是控制型的,會涉及到狀態(tài)機等控制邏輯;后者主要是計算型的,難點主要在對符號、浮點數(shù)轉(zhuǎn)定點數(shù)、位寬等方面的處理上。第二要有好的師父。這里說的好的師父并不是指畫原理圖畫了幾十年的老師傅,而是指曾在專業(yè)IC公司做過一段時間的人,好的專業(yè)IC公司可以接觸國內(nèi)外最新的設計思想,在他們的幫助下,起點就可以比其他人高不少,更重要的是你可以學習邏輯設計思想性的東西!如果你的師傅經(jīng)常跟你說畫原理圖的好處,你還是重新找過師父算了--用原理圖設計是一種很落后的方式,即使他們可能會說可以系統(tǒng)級設計(專業(yè)的IC設計公司系統(tǒng)級設計絕對是由方案保證的,而不會靠原理圖這鬼東西)更為清淅。第三要看一些好的資料。RTL級的書中《硬件描述語言》、先鋒寫的那幾本書都還可以,還有不得不提的是cliff的一些上有)Writting Testbenches》,提高可以看下snug(Synopsys的用戶論壇,里面的文章基本上反映了業(yè)界的領先水平)的paper;系統(tǒng)級的可以看看《片上系統(tǒng)-可重用性設計方法學》。第四要自己多總結,多動腦筋。邏輯設計的東西其實本質(zhì)上的東西并不多:把RTL級的常用的D觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器等基本的電路標準化、固定化;先做方案再寫代碼;設計時序;知道約束原理及怎么加約束;劃分模塊時知道怎么做到時序收斂;做驗證的時候熟悉相應語言的行為級描述(這個肯定比RTL級好學多了)然后就是理解testbench的結構化設計。把這些東西的本質(zhì)都搞清楚了做個合格的邏輯工程師應該是綽綽有余了,呵呵。在接下來的部分我主要就第四點隨便說點自己的經(jīng)驗,說的不好還請大家批評指正。 入門前
剛才開始接觸邏輯設計很多人會覺得很簡單:因為verilog的語法不多,半天就可以把書看完了。但是很快許多人就發(fā)現(xiàn)這個想法是錯誤的,他們經(jīng)常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環(huán)寫的一個計數(shù)器都不認識!相信上一段的經(jīng)歷大部分人都曾有,原因是做邏輯設計的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。在這個過程中首先要明白的是軟件設計和邏輯設計的不同,并理解什么是硬件意識。軟件代碼的執(zhí)行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執(zhí)行;因此軟件設計中經(jīng)常會帶有順序處理的思維。而邏輯設計則不同,我們設計的是數(shù)字電路,它是由很多很多的與非門及D觸發(fā)器構成的,上電之后所有與非門和D觸發(fā)器都同時工作,不會因為A觸發(fā)器的代碼描述在B觸發(fā)器之前A觸發(fā)器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網(wǎng)表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯(lián)關系描述;因此邏輯設計需要的是一種并發(fā)的思維,我們也需要用并發(fā)的思維去考慮電路的設計。當然,我們設計的電路功能一般都有先后順序的關系,如果這種順序不能通過代碼的先后順序來實現(xiàn),那么要怎么完成這一功能呢?在邏輯設計中,我們所說的先后順序都是基于時間軸來實現(xiàn):它的承載體就是時序邏輯,也就是那些觸發(fā)器。硬件意識的東西網(wǎng)上談論的已經(jīng)很多,這里就不再多說了。其次就是要熟悉基本電路的設計;镜碾娐凡皇呛芏啵簿褪荄觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器、譯碼器等幾種,所有復雜的電路都可由這些基本的電路構成。高手水平高的體現(xiàn)并不是他能寫出一些很奇特的電路,相反,水平高是體現(xiàn)在他們總能將復雜的電路用這些很樸素的基本電路去描述。甚至,你會發(fā)現(xiàn)他們的代碼基本上是由if...else、case這些語句構成的,樸素的讓你覺得奇怪。我認為,初學者在入門的時候,對于基本電路的設計應該固定化、標準化,每種電路該用什么樣的代碼描述,應該要固定、統(tǒng)一,盡量少一些花哨的東西。說來這里我舉個例子。以前有幾個朋友因為仿真有問題請我?guī)兔φ覇栴}。他們的代碼寫的很亂,出現(xiàn)了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標準的電路重新寫下代碼。結果過了半天,他們就和我說問題不見了。所以,高手們喜歡用簡單的代碼是有道理的,電路的標準化和規(guī)范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時候回家多睡回覺,呵呵?傊,簡單的、樸素的就是最好的。最后是代碼的規(guī)范化。代碼規(guī)范主要是代碼書寫、命名等規(guī)范。比如不能用TAB鍵空格、低電平有效信號命名時加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網(wǎng)上也很多,這里只是強烈建議大家要嚴格遵守,像華為等公司如果代碼不規(guī)范的話肯定是要打回去重寫的。 入門
結合一兩個小項目把上面所說的事情都做好后,差不多就可以進入入門的階段了(要求稍微嚴格了一點點,呵呵)。入門階段要學的有:設計時序;理解約束的原理及如何加約束。先談談設計時序。設計時序是進行邏輯設計的基本要求:時序是設計出來的,不是仿出來的,更不是湊出來的。很多人在做邏輯設計時喜歡一上來就狂寫代碼,寫到一半后發(fā)現(xiàn)信號間的時序出問題了,只好推倒重來;好不容易反復了幾次之后,通過仿真軟件看了下,差不多要對了,于是再湊一下時序,竟然對了!但這個做法除了設計周期長外,代碼的質(zhì)量也難以保證,往往存在很多冗余的邏輯,甚至有一些隱藏著較深的bug。為什么會出現(xiàn)上面的問題呢?因為我們設計的是數(shù)字邏輯,而信號之間的邏輯關系往往是比較復雜的,在內(nèi)部信號很多的情況下,僅憑拍下腦袋就寫代碼肯定是不能理清楚它們之前的復雜的關系,所以出錯在所難免。正確的做法是我們要先對整個設計有一些規(guī)劃--時時刻刻都要有設計時序的思想。設計時序最重要的是做好方案,這里說的方案絕不是只是擺幾個框圖在那里。我們在做設計的時候需要做總體設計方案、邏輯詳細設計方案。這兩種方案包括了很多東西,邏輯總體方案主要是一級模塊的劃分及接口時序的定義,而邏輯詳細方案就是代碼的文字及圖形描述!對于入門者來說,接觸的比較多的是邏輯詳細設計方案。在這一級別的方案中,我們是要求的是至少要做到模塊內(nèi)部所有關鍵信號的時序都要先設計好,這里講的設計時序主要就是畫波形圖,在一個操作周期內(nèi)每個信號在每一個時鐘周期該是什么樣子就畫成什么樣子。附圖(時序圖)是我曾設計的一個模塊的主要信號時序:aes_cnt信號控制著w_fifo_rden、aes_ready等信號,是該模塊的關鍵信號,通過將它們之間的時序關系通過時序圖反應出來,寫代碼時就可以做到胸有成竹,減少出現(xiàn)邏輯混亂的情況。聽起來似乎很簡單,但是執(zhí)行起來卻不容易,因為畫波形圖是一件很煩鎖的事(有一次一個模塊因為操作比較多我畫了8張時序圖)。但是請相信我,如果不這樣做,因為時序關系沒有處理好引起設計多次迭代所花的時間遠多于畫波形圖的時間。時序設計好之后,模塊內(nèi)部各個信號之間的關系就理得差不多了,之后就是將它翻譯成代碼了,這個過程以體力勞動為主,我就不多說了。補充一下,畫波形圖推薦用TimingDesigner這個軟件,如果有更好的,請告訴我,我也不喜歡。另一個就是約束。這里的約束是針對綜合軟件和布局布線軟件而言的。為什么會有約束這個東西出現(xiàn)呢?主要原因是EDA軟件比較笨,難以明白我們的心思,如果我們不把更詳細的信息告訴它的話它就干不好活,比如需要將輸出寄存器放的與輸出管腳近一點,如果不加約束,EDA軟件可能布通之后就不管了,導致Tco狂大,一點也不善解人意。所以我們需要約束這個東西,告訴EDA軟件要怎么干活,工程驗收的標準又是什么。在加約束之前,我們首先要定義一些術語好告訴EDA軟件我們想干什么,這些術語便是Fmax、Tsu、Tco等等這些東西。這些東西的含義這里就不多說了,網(wǎng)上的討論已經(jīng)很多了。有了術語,還要有一種通信方式與EDA軟件通信,腳本語言充當了這一角色。不過現(xiàn)在像quartus這類軟件做的比較智能化了,提供了圖形化界面,但是這背后支撐的還是些腳本語言,大家可以用UltraEdit打加*.qsf文件去看看我們加的約束用腳本語言是怎么寫的。
在加了約束之后,EDA工具就可以更好地按照我們的意愿去干活了,比較我們加了Fmax的約束,它就會盡可能地將關鍵路徑放的靠近一些,以提高電路工作頻率。當然,這是有代價的,尋找路徑是需要時間的,要求越苛刻,時間花的越多,因此加約束的原則的適用就行。如果約束加的過高,就相當于讓EDA工具去做一件不可能完成的事,找更短的路徑的時候說不定找著找著就掉下懸崖了,效果反而更差。雖然有約束這個好東西,不過提醒一下,在項目之前千萬對它抱有太多的幻想,把希望寄托在別人的身上并不是每一次都很可靠的,出了問題還是要麻煩自己,加約束只能做一些錦上添花的事情。所以,我們在做方案的時候就需要對關鍵路徑進行預估,要通過設計而不是約束解決這些問題。
點擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(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的概念中分化出來。
各自的特點為:
ASIC特性
?嵌入式設計
?產(chǎn)量大
?可以不涉及布局布線工作
?ASIC可以支持高速和高度復雜的門級設計
?需要與ASIC廠商密切合作
FPGA特性:
?FPGA主要用作樣片試制
?若用于市場需求比較少量的設計,一般不超過一千片
?FPGA等于簡單ASIC
?減少庫存與設計錯誤的危險性
?資金投入少
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(0)
發(fā)表于 2010/4/18 16:20:21
同步復位和異步復位的比較 一、特點:
同步復位:顧名思義,同步復位就是指復位信號只有在時鐘上升沿到來時,才能有效。否則,無法完成對系統(tǒng)的復位工作。用描述如下:
always @ (posedge clk) begin
if (!Rst_n)
...
end
異步復位:它是指無論時鐘沿是否到來,只要復位信號有效,就對系統(tǒng)進行復位。用Verilog描述如下:
always @ (posedge clk or negedge Rst_n) begin
if (!Rst_n)
...
end
二、各自的優(yōu)缺點:
1、總的來說,同步復位的優(yōu)點大概有3條:
a、有利于仿真器的仿真。
b、可以使所設計的系統(tǒng)成為100%的同步時序電路,這便大大有利于時序分析,而且綜合出來的fmax一般較高。
c、因為他只有在時鐘有效電平到來時才有效,所以可以濾除高于時鐘頻率的毛刺。他的缺點也有不少,主要有以下幾條:
a、復位信號的有效時長必須大于時鐘周期,才能真正被系統(tǒng)識別并完成復位任務。同時還要考慮,諸如:clk skew,組合邏輯路徑延時,復位延時等因素。
b、由于大多數(shù)的邏輯器件的目標庫內(nèi)的DFF都只有異步復位端口,所以,倘若采用同步復位的話,綜合器就會在寄存器的數(shù)據(jù)輸入端口插入組合邏輯,這樣就會耗費較多的邏輯資源。
2、對于異步復位來說,他的優(yōu)點也有三條,都是相對應的
a、大多數(shù)目標器件庫的dff都有異步復位端口,因此采用異步復位可以節(jié)省資源。
b、設計相對簡單。
c、異步復位信號識別方便,而且可以很方便的使用的全局復位端口GSR。
缺點:
a、在復位信號釋放(release)的時候容易出現(xiàn)問題。具體就是說:倘若復位釋放時恰恰在時鐘有效沿附近,就很容易使寄存器輸出出現(xiàn)亞穩(wěn)態(tài),從而導致亞穩(wěn)態(tài)。
b、復位信號容易受到毛刺的影響。
三、總結:
所以說,一般都推薦使用異步復位,同步釋放的方式,而且復位信號低電平有效。這樣就可以兩全其美了。
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(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ù)據(jù),允許端,清零,同步加
載等)在時鐘的邊緣同時變化。而時鐘敏感信號是不能在時鐘邊沿變化的。其后
果為導致結果不正確。
措施:編輯vector source file
2.Verilog HDL assignment warning at <location>: truncated
with size <number> to match size of target (<number>
原因:在HDL設計中對目標的位數(shù)進行了設定,如:reg[4:0] a;而默認為32位,
將位數(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腳,空或接地或接上了電源
措施:有時候定義了輸出端口,但輸出端直接賦‘0’,便會被接地,賦‘1’接電源。
如果你的設計中這些端口就是這樣用的,那便可以不理會這些warning
5.Found pins ing as undefined clocks and/or memory enables
原因:是你作為時鐘的PIN沒有約束信息。可以對相應的PIN做一下設定就行了。
主要是指你的某些管腳在電路當中起到了時鐘管腳的作用,比如flip-flop的clk
管腳,而此管腳沒有時鐘約束,因此QuartusII把“clk”作為未定義的時鐘。
措施:如果clk不是時鐘,可以加“not clock”的約束;如果是,可以在clock
setting當中加入;在某些對時鐘要求不很高的情況下,可以忽略此警告或在這
里修改:Assignments>Timing analysis settings...>Individual
clocks...>...
6.Timing characteristics of device EPM570T144C5 are preliminary
原因:因為MAXII 是比較新的元件在 QuartusII 中的時序并不是正式版的,要
等 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時間,應該是后仿真,看看波形設置是否和時鐘沿符
合steup/hold時間
措施:在中間加個寄存器可能可以解決問題
9.warning: circuit may not operate.detected 46 non-operational
paths clocked by clock clk44 with clock skew larger than data delay
原因:時鐘抖動大于數(shù)據(jù)延時,當時鐘很快,而if等類的層次過多就會出現(xiàn)這種問
題,但這個問題多是在器件的最高頻率中才會出現(xiàn)
措施:setting-->timing Requirements&Options-->Default required
fmax 改小一些,如改到50MHZ
10.Design contains <number> input pin(s) that do not drive logic
原因:輸入引腳沒有驅(qū)動邏輯(驅(qū)動其他引腳),所有的輸入引腳需要有輸入邏輯
措施:如果這種情況是故意的,無須理會,如果非故意,輸入邏輯驅(qū)動.
11.Warning:Found clock high time violation at 8.9ns on node
'TEST3.CLK'
原因:FF中輸入的PLS的保持時間過短
措施:在FF中設置較高的時鐘頻率
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 只有一組全局時鐘時,用全局時鐘分頻產(chǎn)生的另一個時
鐘在布線中當作信號處理,不能保證低的時鐘歪斜(SKEW)。會造成在這個時鐘
上工作的時序電路不可靠,甚至每次布線產(chǎn)生的問題都不一樣。
措施:如果用有兩組以上全局時鐘的 FPGA 芯片,可以把第二個全局時鐘作為另
一個時鐘用,可以解決這個問題。
13.Critical Warning: Timing requirements were not met. See Report
window for details.
原因:時序要求未滿足,
措施:雙擊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.
原因:時序分析發(fā)現(xiàn)一定數(shù)量的路徑違背了最小的建立和保持時間,與時鐘歪斜
有關,一般是由于多時鐘引起的
措施:利用Compilation Report-->Time Analyzer-->紅色部分(如clock
hold:'clk'等),在slack中觀察是hold time為負值還是setup time 為負值,
然后在:Assignment-->Assignment Editor-->To中增加時鐘名(from
node finder),Assignment Name中增加
和多時鐘有關的Multicycle 和Multicycle Hold選項,如hold time為負,可
使Multicycle hold的值>multicycle,如設為2和1。
15: Can't analyze file -- file E://quartusii/*/*.v is missing
原因:試圖編譯一個不存在的文件,該文件可能被改名或者刪除了
措施:不管他,沒什么影響
16.Warning: Can't find signal in vector source file for input pin
|whole|clk10m
原因:因為你的波形仿真文件( vector source file )中并沒有把所有的輸入
信號(input pin)加進去,對于每一個輸入都需要有激勵源的
17.Error: Can't name logic scfifo0 of instance "inst" --
has same name as current design file
原因:模塊的名字和project的名字重名了
措施:把兩個名字之一改一下,一般改模塊的名字
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
原因:模塊不是在本項目生成的,而是直接copy了別的項目的原理圖和源程序
而生成的,而不是用QUARTUS將文件添加進本項目
措施:無須理會,不影響使用
19.Timing characteristics of device <name> are preliminary
原因:目前版本的QuartusII只對該器件提供初步的時序特征分析
措施:如果堅持用目前的器件,無須理會該警告。關于進一步的時序特征分析會
在后續(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來分析同步鎖存,但目前的器件不支持這個特性
措施:無須理會。時序分析可能將鎖存器分析成回路。但并不一定分析正確。其
后果可能會導致顯示提醒用戶:改變設計來消除鎖 存器
21.Warning:Found xx output pins without output pin load capacitance
assignment(網(wǎng)友:gucheng82提供)
原因:沒有給輸出管教指定負載電容
措施:該功能用于估算TCO和功耗,可以不理會,也可以在Assignment Editor
中為相應的輸出管腳指定負載電容,以消除警告
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
原因:使用了行波時鐘或門控時鐘,把觸發(fā)器的輸出當時鐘用就會報行波時鐘,
將組合邏輯的輸出當時鐘用就會報門控時鐘
措施:不要把觸發(fā)器的輸出當時鐘,不要將組合邏輯的輸出當時鐘,如果本身如
此設計,則無須理會該警告
23.Warning (10268): Verilog HDL information at lcd7106.v(63):
Always Construct contains both blocking and non-blocking
assignments
原因: 一個always模塊中同時有阻塞和非阻塞的賦值
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(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的設備中讀取寄存器中偏移量為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):應用程序已經(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直接存儲器名, req為請求操作的列舉, arg由請求決定
函數(shù)說明:通過DMA接收信道執(zhí)行設備的具體I/O操作
返回值: 成功返回請求具體值,反之返回為負數(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接收信道獲得一個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ā)送一個接收請求到DMA接收信道,
返回值: 成功返回0,反之返回為負數(shù)
函數(shù)原型:int alt_dma_rxchan_reg (alt_dma_rxchan_dev * dev)
輸入?yún)?shù):dev接收信道設備名
函數(shù)說明:給系統(tǒng)寄存DMA接收信道
返回值: 成功返回0,反之返回為負數(shù)
函數(shù)原型:int alt_dma_txchan_close (alt_dma_txchan txchan)
輸入?yún)?shù):txchan發(fā)送信道名
函數(shù)說明:通知系統(tǒng):應用程序已經(jīng)完成DMA發(fā)送信道txchan
返回值: 成功返回0,反之返回為負數(shù)
函數(shù)原型:int alt_dma_txchan_ioctl (alt_dma_txchan dma, int req, void* arg)
輸入?yún)?shù):dma直接存儲器名;req為請求操作的列舉;arg請求的額外參數(shù),由請求決定
函數(shù)說明:通過DMA發(fā)送信道執(zhí)行設備的具體I/O操作
返回值: 成功返回請求具體值,反之返回為負數(shù)
函數(shù)原型:alt_dma_txchan alt_dma_txchan_open (const char* name)
輸入?yún)?shù):name為常數(shù)字符指針,如/dev/dma_0
函數(shù)說明:為DMA發(fā)送信道獲得一個alt_dma_rxchan描述符
返回值: 成功返回非0,反之返回為0
函數(shù)原型:int alt_dma_txchan_reg (alt_dma_txchan_dev* dev)
輸入?yún)?shù):dev接收信道設備名
函數(shù)說明:給系統(tǒng)寄存DMA發(fā)送信道
返回值: 成功返回0,反之返回為負數(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ā)送一個發(fā)送請求到DMA發(fā)送信道,
返回值: 發(fā)送成功返回0,反之返回為負數(shù)
函數(shù)原型:nt alt_dma_txchan_space (alt_dma_txchan dma)
輸入?yún)?shù):dma 直接存儲器名
函數(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設備;offset擦除的flash模塊的偏移量;length擦除的flash模塊的長度
函數(shù)說明:擦除單獨的一個flash模塊
返回值: 發(fā)送成功返回0,反之返回為負數(shù)
函數(shù)原型:void alt_flash_close_dev(alt_flash_fd * fd)
輸入?yún)?shù):fd為具體的flash設備
函數(shù)說明:關閉flash設備
返回值: -
函數(shù)原型:alt_flash_fd * alt_flash_open_dev(const char* name)
輸入?yún)?shù):
函數(shù)說明:打開flash設備。一旦打開,函數(shù)alt_write_flash()用來寫入,函數(shù)alt_read_flash()用來讀取數(shù)據(jù),或者使用函數(shù)alt_get_flash_info(), alt_erase_flash_block(), alt_write_flash_block(),控制單個模塊
返回值: 失敗返回0,成功其他值
函數(shù)原型:int alt_get_flash_info(alt_flash_fd* fd, flash_region ** info,
int* number_of_regions)
輸入?yún)?shù):fd flash設備;info指向flash_region結構體的指針;number_of_regions
函數(shù)說明:得到擦除flash區(qū)域的細節(jié)
返回值: 發(fā)送成功返回0,反之返回為負數(shù)
函數(shù)原型:int alt_read_flash(alt_flash_fd* fd, int offset, void* dest_addr, int length)
輸入?yún)?shù):dest_addr目標地址指針
函數(shù)說明:從flash偏移量為offset字節(jié)開始讀取數(shù)據(jù),寫入到目標地址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設備;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ù)說明:寫入到一個已擦除的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ù)說明:啟動所有中斷
返回值: -
函數(shù)原型:int alt_irq_enabled (void)
輸入?yún)?shù):void
函數(shù)說明:啟動中斷
返回值: 禁止中斷返回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的兩個輸入?yún)?shù);中斷激活時調(diào)用isr
函數(shù)說明:寄存一個isr
返回值: 成功返回0,反之為非0
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(0)
發(fā)表于 2010/4/18 16:04:46
點擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(0)
發(fā)表于 2010/4/18 16:04:46
學好NiosII必須具備的條件- - 經(jīng)過1年多的學習和實踐,我總結了下面幾條要學好niosII所需要具備的條件:
1.良好的英文閱讀能力:因為所有的nios的權威資料都是來自與下面的altera的官方網(wǎng)站
2.C語言的基礎以及部分匯編基礎
3.最基本的單片機的硬件基礎
4.一個nios的參考開發(fā)板,最好是來自于altera公司
5.一定的QuartusII的基礎
6.一定的調(diào)試能力: NiosII IDE是基于eclipse架構的,該IDE具備非常強大的調(diào)試能力
比如:
breakpoint
watchpoint
register view
memory view
variable view
trace==
7.添加一點,要想學好Nios,最好能帶著項目學習
給大家一個強烈的建議:
要想學好Nios,調(diào)試能力是非常重要的
通過調(diào)試,你可以逐漸的了解nios的整個軟件架構,比如它是如何處理中斷的,又是如何處理bootloader的,等等
還有NiosII IDE里面有非常多的屬性設置,基本上每個設置都有它的作用,等你了解了所有設置的功能,也就差不多算半個高手了^_^
還有很重要的一點就是如何尋找?guī)椭?
1. Altera的官方網(wǎng)站有一個mysupport,在那里可以提交service request, 不過只支持英文
2. Altera的官方網(wǎng)站有Find Answer的功能,輸入問題的關鍵字,可能就可以直接得到答案
3. Nios的官方論壇, ,這是個英文網(wǎng)站,里面很多斑竹都是Nios的開發(fā)者
4. 咱們這個EDA論壇也不賴
5. Altera的FAE
6. 其實我用到的最多的幫助是Altera的nios資料,在里面幾乎可以找到所有的答案^_^
下面補充一下如何查找資料:
1.
在Nios的安裝目錄下,有個document文件夾C:\altera\kits\nios2_51\documents
該文件夾下有個index.htm文件
如果大家仔細認真的研究一下這個文件,一定可以從中得到非常多的收獲,
以后碰上問題的話基本上都可以從這個網(wǎng)頁開始自己尋找答案
2.
還有一個很重要的幫助途徑
Click NiosII IDE->Help->Help Contents
此時會彈出一個Help的網(wǎng)頁,該網(wǎng)頁支持搜索功能,你可以在里面輸入你所要查找的關鍵字,就可以得到相關內(nèi)容.
比如你想知道如何在NiosII IDE里面創(chuàng)建自己的庫文件,那么你就可以查找managed library的關鍵字^_^
差點忘了一個非常重要的學習資源了,就是altera提供的視頻教程:
在這個網(wǎng)址有個課程列表,其中很大一部分的視頻教程是免費的,內(nèi)容非常豐富^_^
這里是關于niosII的一些視頻demo,對初學者非常有幫助^_^
點擊查看原文
發(fā)表評論 閱讀全文(1) | 回復(0)
發(fā)表于 2010/4/18 15:58:59
FPGA開發(fā)板各存儲器之間的聯(lián)系 在FPGA開發(fā)板上都有幾種不同的存儲器,比如SDRAM,F(xiàn)LASH,EPCS,還有內(nèi)部onchip memory,這幾種存儲器間是如何通信或者構建一個系統(tǒng)
該如何搭配他們呢,不少人都問到這個問題。在這里我做個總結以方便初學者的學習。
首先看看在sopc builder中reset address和nios IDE中System Library中的program memory(.text)、read-only data memory(.rodata)等
這幾個地址的關系和作用
根據(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 標簽中的
reset address決定了flash programmer 的下載存儲器(一般是選EPCS controller 或者CFI flash),并且決定了程序從此處開始啟動。exception address指定的是異常處理地址。當然,程序在運行前所有的數(shù)據(jù)都是存放在flash(EPCS或者CFI FLASH)中如果你設計的系統(tǒng)reset address與其它地址的設置不相同,比如reset address 和exceprion address,reset address 和IDE中的program memory(.text)設成不同的存儲器,那么系統(tǒng)從reset address啟動時都會從flash中把相關數(shù)據(jù)自動下載到相應的地址或者初始化相應地址。
通過上面的認識,我們就比較清楚了各存儲器間可進行哪些搭配了,reset address的選擇可選EPCS controllor 或者CFI flash;program memory(.text)可選擇onchip memory,SDRAM,CFI flash等。如果reset address為EPCS則在使用flash progrrammer時程序是下載到EPCS芯片中。如果reset address選擇CFI flash,則flash progrrammer時程序是下載到CFI flash芯片中。
需要注意的是這里有個特殊情況。例如在開發(fā)板上經(jīng)常有這么一個簡單的系統(tǒng),CPU+onchip memory+LED_PIO,reset address選擇onchip memory;感覺整個系統(tǒng)都沒有用到flash。而且onchip memory在系統(tǒng)斷電后數(shù)據(jù)就會消失,那么程序代碼是存在哪,系統(tǒng)是如何從onchip memory啟動聽呢?先來看看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中存儲器有選擇onchip_memory(至少有一項是選擇onchip_memory,如果都不選,就不會生成)時,在build結束的時候生成的。于是當我們把System Library中存儲器的選擇都選擇onchip_memory時,在IDE中build結束后所有的程序代碼都生成在"onchip_memory.hex"中,再在QII中全編譯一次時,系統(tǒng)通過onchip_memory.v調(diào)用"onchip_memory.hex"從而把所有的程序代碼以及配制信息都生成在POF和SOF文件中,使用QII的programmer直接下載到EPCS芯片或者FPGA芯片內(nèi)程序都會立即執(zhí)行。因為這里的特殊性就有很多網(wǎng)友詢問了,reset address 選擇onchip memory,而IDE中把代碼區(qū)都選擇SDRAM調(diào)試的時候程序正常運行,再在QII全編譯后下載POF文件就運行不了呢?問題就是出在這了,在這里可以總結出一點,要讓程序在onchip memory之外的存儲器中運行,那么reset address就必然選EPCS 或者CFI flash,并且要通過flash programmer把程序下載到flash中。
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(0)
發(fā)表于 2010/4/18 15:58:59
關于建立時間、保持時間的討論 時鐘周期為T,觸發(fā)器D1的時鐘沿到來到觸發(fā)器Q變化的時間Tco(CLK--Q)最大為T1max,最小為T1min,邏輯組合電路的延遲時間最大為T2max,最小為T2min,問觸發(fā)器D2的建立時間和保持時間。
maxbird: D2的保持時間就是時鐘沿到來之后,D2的數(shù)據(jù)輸入端要保持數(shù)據(jù)不變的時間,這個時間是由D1和D2之間的組合邏輯時延決定的。例如:假設D1和D2之間的組合邏輯時延為2ns,時鐘周期為10ns,這意味著在時鐘沿來到后,D1輸出的新數(shù)據(jù)要過2ns才會到達D2的數(shù)據(jù)輸入端,那么在這2ns內(nèi),D2的數(shù)據(jù)輸入端保持的還是上一次的舊數(shù)據(jù),其值不會立即更新,假設D2的最小保持時間為3ns,這意味時鐘沿到來后,D2的數(shù)據(jù)輸入端的值在3ns內(nèi)不能有變化,回到問題的關鍵,由于D1在時鐘沿到來后的輸出結果,經(jīng)過2ns的組合邏輯延時便到達了D2的輸入端,而D2要求在時鐘沿到來后的3ns內(nèi)其輸入端的值不能改變,這樣D2的保持時間就得不到滿足,所以D2的保持時間必須小于等于2ns。 至于說T2min為0時的情況,其實T2min是永遠不能為0的,即使是一根導線其時延也是不可能為0的,這就是為什么移位寄存器的兩個觸發(fā)器之間連的只是一根導線,導線后端觸發(fā)器的保持時間卻還是可以滿足的原因,其實移位寄存器中觸發(fā)器的保持時間可以看成是小于等于其間導線的時延。
建立時間:觸發(fā)器在時鐘沿來到前,其數(shù)據(jù)輸入端的數(shù)據(jù)必須保持不變的時間;保持時間:觸發(fā)器在時鐘沿來到后,其數(shù)據(jù)輸入端的數(shù)據(jù)必須保持不變的時間。如下圖:
因為觸發(fā)器內(nèi)部數(shù)據(jù)的形成是需要一定的時間的,如果不滿足建立和保持時間,觸發(fā)器將進入亞穩(wěn)態(tài),進入亞穩(wěn)態(tài)后觸發(fā)器的輸出將不穩(wěn)定,在0和1之間變化,這時需要經(jīng)過一個恢復時間,其輸出才能穩(wěn)定,但穩(wěn)定后的值并不一定是你的輸入值。這就是為什么要用兩級觸發(fā)器來同步異步輸入信號。這樣做可以防止由于異步輸入信號對于本級時鐘可能不滿足建立保持時間而使本級觸發(fā)器產(chǎn)生的亞穩(wěn)態(tài)傳播到后面邏輯中,導致亞穩(wěn)態(tài)的傳播。兩級觸發(fā)器可防止亞穩(wěn)態(tài)傳播的原理:假設第一級觸發(fā)器的輸入不滿足其建立保持時間,它在第一個脈沖沿到來后輸出的數(shù)據(jù)就為亞穩(wěn)態(tài),那么在下一個脈沖沿到來之前,其輸出的亞穩(wěn)態(tài)數(shù)據(jù)在一段恢復時間后必須穩(wěn)定下來,而且穩(wěn)定的數(shù)據(jù)必須滿足第二級觸發(fā)器的建立時間,如果都滿足了,在下一個脈沖沿到來時,第二級觸發(fā)器將不會出現(xiàn)亞穩(wěn)態(tài),因為其輸入端的數(shù)據(jù)滿足其建立保持時間。同步器有效的條件:第一級觸發(fā)器進入亞穩(wěn)態(tài)后的恢復時間 + 第二級觸發(fā)器的建立時間 < = 時鐘周期。 (編者注:maxbird在該部分詳細說明了建立時間和保持時間的概念,以及如果不滿足二者可能導致的亞穩(wěn)態(tài)的傳播。注意這里說的建立時間和保持時間都是針對時鐘而言的,在進行時序約束時所指的就是這種,而很多網(wǎng)友以前學習的建立時間保持時間的概念是針對信號而言的,所指的對象不同,分析出來的結論完全相反,一定注意不要混淆。)
lh1688: 不考慮CLOCK SKEW情況下。D2的建立時間要求:Tco1+T1(logic delay)+Tsetup2 < Tc(CLOCK 周期) 。那么 Tsetup2 < Tc(CLOCK 周期) -(Tco1+T1)。這個應該比較容易理解。相對的保持時間實際就是 路徑的總延時 (Tco1+T1)。 保持時間 Thold2 < (Tco1+T1)。
點擊查看原文
發(fā)表評論 閱讀全文(2) | 回復(0)
發(fā)表于 2010/4/17 17:16:54
QuartusII警告信息大解析(zz) ********************************************************************
在II下進行編譯和仿真的時候,會出現(xiàn)一堆warning,有的可以忽略,有的卻需要注意,雖然按F1可以了解關于該警告的幫助,但有時候幫助解釋的仍然不清楚,大家群策群力,把自己知道和了解的一些關于警告的問題都說出來討論一下,免得后來的人走彎路.
下面是我收集整理的一些,有些是自己的經(jīng)驗,有些是網(wǎng)友的,希望能給大家一點幫助,如有不對的地方,請指正,如果覺得好,請版主給點威望吧,謝謝
1.Found clock-sensitive change during activeclockedge at time <time> on register "<name>"
原因:vector sourcefile中時鐘敏感信號(如:數(shù)據(jù),允許端,清零,同步加載等)在時鐘的邊緣同時變化。而時鐘敏感信號是
不能在時鐘邊沿變化的。其后果為導致結果不正確。
措施:編輯vector source file
2. assignment warning at <location>: truncated value with size <number> to match size of target (<number>
原因:在HDL設計中對目標的位數(shù)進行了設定,如:reg[4:0] a;而默認為32位,將位數(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腳,空或接地或接上了電源
措施:有時候定義了輸出端口,但輸出端直接賦‘0’,便會被接地,賦‘1’接電源。如果你的設計中這些端口就是這樣用的,那便可以不理會這些warning
5.Found pins functioning as undefined clocks and/or memory enables
原因:是你作為時鐘的PIN沒有約束信息?梢詫ο鄳腜IN做一下設定就行了。主要是指你的某些管腳在電路當中起到了時鐘管腳的
作用,比如flip-flop的clk管腳,而此管腳沒有時鐘約束,因此QuartusII把“clk”作為未定義的時鐘。
措施:如果clk不是時鐘,可以加“not clock”的約束;如果是,可以在clock setting當中加入;在某些對時鐘要求不很高的情況下,可以忽略此警告或在這里修改:Assignments>Timing analysis settings...>Individualclocks...>...
注意在Applies to node中只用選擇時鐘引腳一項即可,required fmax一般比所要求頻率高5%即可,無須太緊或太松。
6.Timing characteristics of device EPM570T144C5 are preliminary
原因:因為MAXII 是比較新的元件在 QuartusII 中的時序並不是正式版的,要等 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時間,應該是后仿真,看看波形設置是否和時鐘沿符合steup/hold時間
措施:在中間加個寄存器可能可以解決問題
9.warning: circuit may not operate.detected 46 non-operational paths clocked by clock clk44 with clockskewlarger than data delay
原因:時鐘抖動大于數(shù)據(jù)延時,當時鐘很快,而if等類的層次過多就會出現(xiàn)這種問題,但這個問題多是在器件的最高頻率中才會出現(xiàn)
措施:setting-->timing Requirements&Options-->Default required fmax 改小一些,如改到50MHZ
10.Designcontains <number> input pin(s) that do not drive logic
原因:輸入引腳沒有驅(qū)動邏輯(驅(qū)動其他引腳),所有的輸入引腳需要有輸入邏輯
措施:如果這種情況是故意的,無須理會,如果非故意,輸入邏輯驅(qū)動.
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
原因:如果你用的 只有一組全局時鐘時,用全局時鐘分頻產(chǎn)生的另一個時鐘在布線中當作信號處理,不能保證低的時鐘歪斜(SKEW)。會造成在這個時鐘上工作的時序電路不可靠,甚至每次布線產(chǎn)生的問題都不一樣。
措施:如果用有兩組以上全局時鐘的 [url=][url=][/url][/url]芯片,可以把第二個全局時鐘作為另一個時鐘用,可以解決這個問題。
13.Critical Warning: Timing requirements were not met. See Report window for details.
原因:時序要求未滿足,
措施:雙擊Compilation Report-->Time Analyzer-->紅色部分(如clock setup:'clk'等)-->左鍵單擊list path,查看fmax的SLACK REPORT再根據(jù)提示解決,有可能是程序的算法問題或fmax設置問題
14.Warning: Can't find signal in vector source file for input pin |whole|clk10m
原因:這個時因為你的波形仿真文件( vector source file )中并沒有把所有的輸入信號(input pin)加進去, 對于每一個輸入都需要有激勵源的
15.Can't achieve minimum setup and hold requirement <text> along <number> path(s). See Report window for details.
原因:時序分析發(fā)現(xiàn)一定數(shù)量的路徑違背了最小的建立和保持時間,與時鐘歪斜有關,一般是由于多時鐘引起的
措施:利用Compilation Report-->Time Analyzer-->紅色部分(如clock hold:'clk'等),在slack中觀察是hold time為負值還是setup time 為負值,然后在:Assignment-->Assignment Editor-->To中增加時鐘名(fromnode finder),Assignment Name中增加和多時鐘有關的Multicycle 和Multicycle Hold選項,如hold time為負,可使Multicycle hold的值>multicycle,如設為2和1。
16: Can't analyze file -- file E://quartusii/*/*.v is missing
原因:試圖編譯一個不存在的文件,該文件可能被改名或者刪除了
措施:不管他,沒什么影響
17.Warning: Can't find signal in vector source file for input pin |whole|clk10m
原因:因為你的波形仿真文件( vector source file )中并沒有把所有的輸入信號(input pin)加進去, 對于每一個輸入都需要有激勵源的
18.Error: Can't name logic function scfifo0 of instance "inst" -- function has same name as current design file
原因:模塊的名字和project的名字重名了
措施:把兩個名字之一改一下,一般改模塊的名字
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
原因:模塊不是在本項目生成的,而是直接copy了別的項目的原理圖和源程序而生成的,而不是用QUARTUS將文件添加進本項目
措施:無須理會,不影響使用
20.Timing characteristics of device <name> are preliminary
原因:目前版本的QuartusII只對該器件提供初步的時序特征分析
措施:如果堅持用目前的器件,無須理會該警告。關于進一步的時序特征分析會在后續(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來分析同步鎖存,但目前的器件不支持這個特性
措施:無須理會。時序分析可能將鎖存器分析成回路。但并不一定分析正確。其后果可能會導致顯示提醒用戶:改變設計來消除鎖存器,但實際其實無關緊要
22.Warning:Found xx output pins without output pin load capacitance assignment
原因:沒有給輸出管教指定負載電容
解決方法:該功能用于估算TCO和功耗,可以不理會,也可以在Assignment Editor中為相應的輸出管腳指定負載電容,以消除警告
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(0)
發(fā)表于 2010/4/17 16:52:58
一些關于微電子方面的筆試題(有答案) 專用集成電路,它是面向?qū)iT用途的電路,專門為一個用戶設計和制造的。根據(jù)一個用戶的特定要求,能以低研制成本,短、交貨周期供貨的全定制,半定制集成電路。與門陣列等其它ASIC(Application Specific IC)相比,它們又具有設計開發(fā)周期短、設計制造成本低、開發(fā)工具先進、標準產(chǎn)品無需測試、質(zhì)量穩(wěn)定以及可實時在線檢驗等優(yōu)點
建立時間是指觸發(fā)器的時鐘信號上升沿到來以前,數(shù)據(jù)穩(wěn)定不變的時間。輸入信號應提前時鐘上升沿(如上升沿有效)T時間到達芯片,這個T就是建立時間如不滿足setup time,這個數(shù)據(jù)就不能被這一時鐘打入觸發(fā)器,只有在下一個時鐘上升沿,數(shù)據(jù)才能被打入觸發(fā)器。保持時間是指觸發(fā)器的時鐘信號上升沿到來以后,數(shù)據(jù)穩(wěn)定不變的時間。如果hold time不夠,數(shù)據(jù)同樣不能被打入觸發(fā)器。 建立時間是指在時鐘邊沿前,數(shù)據(jù)信號需要保持不變的時間。保持時間是指時鐘跳變邊沿后數(shù)據(jù)信號需要保持不變的時間。如果不滿足建立和保持時間的話,那么DFF將不能正確地采樣到數(shù)據(jù),將會出現(xiàn)metastability(亞穩(wěn)態(tài))的情況。如果數(shù)據(jù)信號在時鐘沿觸發(fā)前后持續(xù)的時間均超過建立和保持時間,那么超過量就分別被稱為建立時間裕量和保持時間裕量。
在組合邏輯中,由于門的輸入信號通路中經(jīng)過了不同的延時,導致到達該門的時間不一致叫競爭。產(chǎn)生毛刺叫冒險。如果布爾式中有相反的信號則可能產(chǎn)生競爭和冒險現(xiàn)象。解決方法:一是添加布爾式的消去項,二是在芯片外部加電容。 列舉幾種集成電路典型工藝。工藝上常提到0.25,0.18指的是什么?(仕蘭微面試題目)制造工藝:我們經(jīng)常說的0.18微米、0.13微米制程,就是指制造工藝了。制造工藝直接關系到cpu的電氣性能。而0.18微米、0.13微米這個尺度就是指的是cpu核心中線路的寬度。線寬越小,cpu的功耗和發(fā)熱量就越低,并可以工作在更高的頻率上了。所以以前0.18微米的cpu最高的頻率比較低,用0.13微米制造工藝的cpu會比0.18微米的制造工藝的發(fā)熱量低都是這個道理了。 集成電路前段設計流程,寫出相關的工具。(揚智電子筆試)
1.)代碼輸入(
語言輸入工具:SUMMIT VISUALHDL
MENTOR RENIOR
圖形輸入: composer(cadence);
viewlogic (viewdraw)
2.)電路仿真(circuit simulation)
將vhd代碼進行先前邏輯仿真,驗證功能描述是否正確
數(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.)邏輯綜合(邏輯綜合工具可以將設計思想vhd代碼轉(zhuǎn)化成對應一定工藝手段的門級電路;將初級仿真中所沒有考慮的門沿(gates delay)反標到生成的門級網(wǎng)表中,返回電路仿真階段進行再仿真。最終仿真結果生成的網(wǎng)表稱為物理網(wǎng)表。 7、解釋setup和hold time violation,畫圖說明,并說明解決辦法。(威盛VIA 2003.11.06上海筆試試題) Setup/hold time是測試芯片對輸入信號和時鐘信號之間的時間要求。建立時間是指觸發(fā)器的時鐘信號上升沿到來以前,數(shù)據(jù)穩(wěn)定不變的時間。輸入信號應提前時鐘上升沿(如上升沿有效)T時間到達芯片,這個T就是建立時間-Setup time.如不滿足setup time,這個數(shù)據(jù)就不能被這一時鐘打入觸發(fā)器,只有在下一個時鐘上升沿,數(shù)據(jù)才能被打入觸發(fā)器。保持時間是指觸發(fā)器的時鐘信號上升沿到來以后,數(shù)據(jù)穩(wěn)定不變的時間。如果hold time不夠,數(shù)據(jù)同樣不能被打入觸發(fā)器。 建立時間(Setup Time)和保持時間(Hold time)。建立時間是指在時鐘邊沿前,數(shù)據(jù)信號需要保持不變的時間。保持時間是指時鐘跳變邊沿后數(shù)據(jù)信號需要保持不變的時間。如果不滿足建立和保持時間的話,那么DFF將不能正確地采樣到數(shù)據(jù),將會出現(xiàn)metastability的情況。如果數(shù)據(jù)信號在時鐘沿觸發(fā)前后持續(xù)的時間均超過建立和保持時間,那么超過量就分別被稱為建立時間裕量和保持時間裕量。 在組合邏輯中,由于門的輸入信號通路中經(jīng)過了不同的延時,導致到達該門的時間不一致叫競爭。產(chǎn)生毛刺叫冒險。如果布爾式中有相反的信號則可能產(chǎn)生競爭和冒險現(xiàn)象。解決方法:一是添加布爾式的消去項,二是在芯片外部加電容。 亞穩(wěn)態(tài)是指觸發(fā)器無法在某個規(guī)定時間段內(nèi)達到一個可確認的狀態(tài)。當一個觸發(fā)器進入亞穩(wěn)態(tài)時,既無法預測該單元的輸出電平,也無法預測何時輸出才能穩(wěn)定在某個正確的電平上。在這個穩(wěn)定期間,觸發(fā)器輸出一些中間級電平,或者可能處于振蕩狀態(tài),并且這種無用的輸出電平可以沿信號通道上的各個觸發(fā)器級聯(lián)式傳播下去。 同步復位在時鐘沿采復位信號,完成復位動作。異步復位不管時鐘,只要復位信號滿足條件,就完成復位動作。異步復位對復位信號要求比較高,不能有毛刺,如果其與時鐘關系不確定,也可能出現(xiàn)亞穩(wěn)態(tài)。 不同的時鐘域之間信號通信時需要進行同步處理,這樣可以防止新時鐘域中第一級觸發(fā)器的亞穩(wěn)態(tài)信號對下級邏輯造成影響,其中對于單個控制信號可以用兩級同步器,如電平、邊沿檢測和脈沖,對 跨時域的信號要經(jīng)過同步器同步,防止亞穩(wěn)態(tài)傳播。例如:時鐘域1中的一個信號,要送到時鐘域2,那么在這個信號送到時鐘域2之前,要先經(jīng)過時鐘域2的同步器同步后,才能進入時鐘域2。這個同步器就是兩級d觸發(fā)器,其時鐘為時鐘域2的時鐘。這樣做是怕時鐘域1中的這個信號,可能不滿足時鐘域2中觸發(fā)器的建立保持時間,而產(chǎn)生亞穩(wěn)態(tài),因為它們之間沒有必然關系,是異步的。這樣做只能防止亞穩(wěn)態(tài)傳播,但不能保證采進來的數(shù)據(jù)的正確性。所以通常只同步很少位數(shù)的信號。比如控制信號,或地址。當同步的是地址時,一般該地址應采用格雷碼,因為格雷碼每次只變一位,相當于每次只有一個同步器在起作用,這樣可以降低出錯概率,象異步FIFO的設計中,比較讀寫地址的大小時,就是用這種方法。 如果兩個時鐘域之間傳送大量的數(shù)據(jù),可以用異步FIFO來解決問題。 10、給了reg的setup,hold時間,求中間組合邏輯的delay范圍。(飛利浦-大唐筆試)
Delay < period - setup 11、時鐘周期為T,觸發(fā)器D1的寄存器到輸出時間最大為T1max,最小為T1min。組合邏輯電路最大延遲為T2max,最小為T2min。問,觸發(fā)器D2的建立時間T3和保持時間應滿足什么條件。(華為)
12、說說靜態(tài)、動態(tài)時序模擬的優(yōu)缺點。(威盛VIA 2003.11.06上海筆試試題)
靜態(tài)時序分析是采用窮盡分析方法來提取出整個電路存在的所有時序路徑,計算信號在這些路徑上的傳播延時,檢查信號的建立和保持時間是否滿足時序要求,通過對最大路徑延時和最小路徑延時的分析,找出違背時序約束的錯誤。它不需要輸入向量就能窮盡所有的路徑,且運行速度很快、占用內(nèi)存較少,不僅可以對芯片設計進行全面的時序功能檢查,而且還可利用時序分析的結果來優(yōu)化設計,因此靜態(tài)時序分析已經(jīng)越來越多地被用到數(shù)字集成的驗證中。 動態(tài)時序模擬就是通常的仿真,因為不可能產(chǎn)生完備的測試向量,覆蓋門級網(wǎng)表中的每一條路徑。因此在動態(tài)時序分析中,無法暴露一些路徑上可能存在的時序問題; 同步電路:存儲電路中所有觸發(fā)器的時鐘輸入端都接同一個時鐘脈沖源,因而所有觸發(fā)器的狀態(tài)的變化都與所加的時鐘脈沖信號同步。 異步電路:電路沒有統(tǒng)一的時鐘,有些觸發(fā)器的時鐘輸入端與時鐘脈沖源相連,這有這些觸發(fā)器的狀態(tài)變化與時鐘脈沖同步,而其他的觸發(fā)器的狀態(tài)變化不與時鐘脈沖同步。 什么是NMOS、PMOS、CMOS?什么是增強型、耗盡型?什么是PNP、NPN?他們有什么差
別?
MOS場效應管即金屬-氧化物-半導體型場效應管,英文縮寫為MOSFET(Metal-Oxide-Semiconductor Field-Effect-Transistor),屬于絕緣柵型。其主要特點是在金屬柵極與溝道之間有一層二氧化硅絕緣層,因此具有很高的輸入電阻(最高可達1015Ω)。它也分N溝道管和P溝道管,符號如圖1所示。通常是將襯底(基板)與源極S接在一起。根據(jù)導電方式的不同,MOSFET又分增強型、耗盡型。所謂增強型是指:當VGS=0時管子是呈截止狀態(tài),加上正確的VGS后,多數(shù)載流子被吸引到柵極,從而“增強”了該區(qū)域的載流子,形成導電溝道。耗盡型則是指,當VGS=0時即形成溝道,加上正確的VGS時,能使多數(shù)載流子流出溝道,因而“耗盡”了載流子,使管子轉(zhuǎn)向截止。 PNP與NPN的區(qū)別在表面上是以PN結的方向來定義的,實際上是以三極管的結構材料來區(qū)分的。PNP是兩邊的棒料是鎵,中間的是硅。鎵是第三主族的元素,其核外為三個電子,硅是第四主族的元素,其核外有四個電子,這樣在兩個PN的方向上的順序是P-N-N的關系;相反NPN是兩邊的材料是硅,中間的是鎵,形成的PN結順序為N-P-N的關系。
順便說明:P的意思是在PN結上缺少電子,以空穴為主導電的材料,也叫P型材料;N的意思是在PN結上有多余的電子,以電子為主導電的材料,也叫N型材料。 根據(jù)不同分頻系數(shù)設置適當?shù)挠嫈?shù)器周期,每個計數(shù)值對應輸入時鐘信號fi的一個周期,讓q0只在fi的上升沿及適當?shù)挠嫈?shù)范圍內(nèi)產(chǎn)生高電平,最后將q0和q1進行邏輯或操作,進而得到所需的分頻信號fo。q1的作用是在奇數(shù)分頻中補足下降沿處半個時鐘周期,使其等占空比,以及在半整數(shù)分頻中,在時鐘下降沿處產(chǎn)生分頻信號的上升沿,以實現(xiàn)半整數(shù)分頻。
下面介紹如何確定計數(shù)器周期以及q0、q1產(chǎn)生高電平輸出時各自的計數(shù)范圍。為敘述方便,現(xiàn)規(guī)定如下標記:分頻系數(shù)為divide(MAX downto 0),其中MAX是分頻數(shù)對應二進制數(shù)的最高位,對于半整數(shù)分頻,最低位即第0位為小數(shù)位;q 0_count和q1_count分別為q0和q1產(chǎn)生高電平的計數(shù)范圍,并記divide(MAX downto 1)為a,divide(MAX downto 2)為b,divide(MAX downto 0)-1為c。
計數(shù)器周期都為0到c。等占空比的偶數(shù)分頻很容易實現(xiàn),在此不加敘述。對奇數(shù)分頻,只需當q0_count<a時q0輸出高電平,當q1_count=a-1時q1輸出一個周期的高電平,其他情況下q0和q1都為低電平,然后把q0和q1邏輯或,所得的輸出fo就是所需的基數(shù)分頻時鐘信號。
計數(shù)器周期為0到c。如果整數(shù)部分是偶數(shù),只需當q0_count<b時q0輸出高電平,當b≤q1_count<a+b時q1輸出高電平,其他情況下,q0和q1都為低電平;如果整數(shù)部分是奇數(shù),只需當q0_coun≤b時q0輸出高電平,當b≤q1_count≤a+b輸出高電平,其他情況下q0和q1都為低電平,然后把q0和q1邏輯或所得輸出f0即所需的半整數(shù)分頻時鐘信號。
1、latch由電平觸發(fā),非同步控制。在使能信號有效時latch相當于通路,在使能信號無效時latch保持輸出狀態(tài)。DFF由時鐘沿觸發(fā),同步控制。
2、latch容易產(chǎn)生毛刺(glitch),DFF則不易產(chǎn)生毛刺。
3、如果使用門電路來搭建latch和DFF,則latch消耗的門資源比DFF要少,這是latch比DFF優(yōu)越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因為FPGA中沒有標準的latch單元,但有DFF單元,一個LATCH需要多個LE才能實現(xiàn)。
一般的設計規(guī)則是:在絕大多數(shù)設計中避免產(chǎn)生latch。它會讓您設計的時序完蛋,并且它的隱蔽性很強,非老手不能查出。latch最大的危害在于不能過濾毛刺。這對于下一級電路是極其危險的。所以,只要能用D觸發(fā)器的地方,就不用latch。
有些地方?jīng)]有時鐘,也只能用latch了。比如現(xiàn)在用一個clk接到latch的使能端(假設是高電平使能),這樣需要的setup時間,就是數(shù)據(jù)在時鐘的下降沿之前需要的時間,但是如果是一個DFF,那么setup時間就是在時鐘的上升沿需要的時間。這就說明如果數(shù)據(jù)晚于控制信號的情況下,只能用latch,這種情況就是,前面所提到的latch timing borrow;旧舷喈斢诮枇艘粋高電平時間。也就是說,latch借的時間也是有限的。
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(0)
發(fā)表于 2010/4/17 16:27:13
LVDS技術原理和設計簡 作者:南京中興通訊研究所(210002) 張 健 南京郵電學院(210003) 吳曉冰 來源:《電子技術應用》
LVDS技術原理和設計簡介
--------------------------------------------------------------------------------
摘 要: 介紹了LVDS(低電壓差分信號)技術的原理和應用,并討論了在單板和系統(tǒng)設計中應用LVDS時的布線技巧。
1 LVDS介紹
LVDS(Low Voltage Differential Signaling)是一種低擺幅的差分信號技術,它使得信號能在差分PCB線對或平衡電纜上以幾百Mbps的速率傳輸,其低壓幅和低電流驅(qū)動輸出實現(xiàn)了低噪聲和低功耗。
幾十年來,5V供電的使用簡化了不同技術和廠商邏輯電路之間的接口。然而,隨著集成電路的發(fā)展和對更高數(shù)據(jù)速率的要求,低壓供電成為急需。降低供電電壓不僅減少了高密度集成電路的功率消耗,而且減少了芯片內(nèi)部的散熱,有助于提高集成度。
減少供電電壓和邏輯電壓擺幅的一個極好例子是低壓差分信號(LVDS)。LVDS物理接口使用1.2V偏置提供400mV擺幅的信號(使用差分信號的原因是噪聲以共模的方式在一對差分線上耦合出現(xiàn),并在接收器中相減從而可消除噪聲)。LVDS驅(qū)動和接收器不依賴于特定的供電電壓,因此它很容易遷移到低壓供電的系統(tǒng)中去,而性能不變。作為比較,ECL和PECL技術依賴于供電電壓,ECL要求負的供電電壓,PECL參考正的供電電壓總線上電壓值(Vcc)而定。而GLVDS是一種發(fā)展中的標準尚未確定的新技術,使用500mV的供電電壓可提供250mV 的信號擺幅。不同低壓邏輯信號的差分電壓擺幅示于圖1。
LVDS在兩個標準中定義。IEEE P1596.3(1996年3月通過),主要面向SCI(Scalable Coherent Interface),定義了LVDS的電特性,還定義了SCI協(xié)議中包交換時的編碼;ANSI/EIA/EIA-644(1995年11月通過),主要定義了LVDS的電特性,并建議了655Mbps的最大速率和1.823Gbps的無失真媒質(zhì)上的理論極限速率。在兩個標準中都指定了與物理媒質(zhì)無關的特性,這意味著只要媒質(zhì)在指定的噪聲邊緣和歪斜容忍范圍內(nèi)發(fā)送信號到接收器,接口都能正常工作。 LVDS具有許多優(yōu)點:①終端適配容易;②功耗低;③具有fail-safe特性確?煽啃;④低成本;⑤高速傳送。這些特性使得LVDS在計算機、通信設備、消費電子等方面得到了廣泛應用。
圖2給出了典型的LVDS接口,這是一種單工方式,必要時也可使用半雙工、多點配置方式,但一般在噪聲較小、距離較短的情況下才適用。每個點到點連接的差分對由一個驅(qū)動器、互連器和接收器組成。驅(qū)動器和接收器主要完成TTL信號和LVDS信號之間的轉(zhuǎn)換;ミB器包含電纜、PCB上差分導線對以及匹配電阻。LVDS驅(qū)動器由一個驅(qū)動差分線對的電流源組成通常電流為3.5mA),LVDS接收器具有很高的輸入阻抗,因此驅(qū)動器輸出的電流大部分都流過100Ω的匹配電阻,并在接收器的輸入端產(chǎn)生大約350mA 的電壓。當驅(qū)動器翻轉(zhuǎn)時,它改變流經(jīng)電阻的電流方向,因此產(chǎn)生有效的邏輯″1″和邏輯″0″狀態(tài)。低擺幅驅(qū)動信號實現(xiàn)了高速操作并減小了功率消耗,差分信號提供了適當噪聲邊緣和功率消耗大幅減少的低壓擺幅。功率的大幅降低允許在單個集成電路上集成多個接口驅(qū)動器和接收器。這提高了PCB板的效能,減少了成本。
不管使用的LVDS傳輸媒質(zhì)是PCB線對還是電纜,都必須采取措施防止信號在媒質(zhì)終端發(fā)生反射,同時減少電磁干擾。LVDS要求使用一個與媒質(zhì)相匹配的終端電阻(100±20Ω),該電阻終止了環(huán)流信號,應該將它盡可能靠近接收器輸入端放置。LVDS驅(qū)動器能以超過155.5Mbps的速度驅(qū)動雙絞線對,距離超過10m。對速度的實際限制是:①送到驅(qū)動器的TTL數(shù)據(jù)的速度;②媒質(zhì)的帶寬性能。通常在驅(qū)動器側(cè)使用復用器、在接收器側(cè)使用解復用器來實現(xiàn)多個TTL信道和一個LVDS信道的復用轉(zhuǎn)換,以提高信號速率,降低功耗。并減少傳輸媒質(zhì)和接口數(shù),降低設備復雜性。
LVDS接收器可以承受至少±1V的驅(qū)動器與接收器之間的地的電壓變化。由于LVDS驅(qū)動器典型的偏置電壓為+1.2V,地的電壓變化、驅(qū)動器偏置電壓以及輕度耦合到的噪聲之和,在接收器的輸入端相對于接收器的地是共模電壓。這個共模范圍是:+0.2V~+2.2V。建議接收器的輸入電壓范圍為:0V~+2.4V。
2 LVDS系統(tǒng)的設計
LVDS系統(tǒng)的設計要求設計者應具備超高速單板設計的經(jīng)驗并了解差分信號的理論。設計高速差分板并不很困難,下面將簡要介紹一下各注意點。
2.1 PCB板
(A)至少使用4層PCB板(從頂層到底層):LVDS信號層、地層、電源層、TTL信號層;
(B)使TTL信號和LVDS信號相互隔離,否則TTL可能會耦合到LVDS線上,最好將TTL和LVDS信號放在由電源/地層隔離的不同層上;
(C)使LVDS驅(qū)動器和接收器盡可能地靠近連接器的LVDS端;
(D)使用分布式的多個電容來旁路LVDS設備,表面貼電容靠近電源/地層管腳放置;
(E)電源層和地層應使用粗線,不要使用50Ω布線規(guī)則;
(F)保持PCB地線層返回路徑寬而短;
(G)應該使用利用地層返回銅線(gu9ound return wire)的電纜連接兩個系統(tǒng)的地層;
(H) 使用多過孔(至少兩個)連接到電源層(線)和地層(線),表面貼電容可以直接焊接到過孔焊盤以減少線頭。
2.2 板上導線
(A) 微波傳輸線(microstrip)和帶狀線(stripline)都有較好性能;
(B) 微波傳輸線的優(yōu)點:一般有更高的差分阻抗、不需要額外的過孔;
(C) 帶狀線在信號間提供了更好的屏蔽。
2.3 差分線
(A)使用與傳輸媒質(zhì)的差分阻抗和終端電阻相匹配的受控阻抗線,并且使差分線對離開集成芯片后立刻盡可能地相互靠近(距離小于10mm),這樣能減少反射并能確保耦合到的噪聲為共模噪聲;
(B)使差分線對的長度相互匹配以減少信號扭曲,防止引起信號間的相位差而導致電磁輻射;
(C)不要僅僅依賴自動布線功能,而應仔細修改以實現(xiàn)差分阻抗匹配并實現(xiàn)差分線的隔離;
(D)盡量減少過孔和其它會引起線路不連續(xù)性的因素;
(E)避免將導致阻值不連續(xù)性的90°走線,使用圓弧或45°折線來代替;
(F)在差分線對內(nèi),兩條線之間的距離應盡可能短,以保持接收器的共模抑制能力。在印制板上,兩條差分線之間的距離應盡可能保持一致,以避免差分阻抗的不連續(xù)性。
2.4 終端
(A)使用終端電阻實現(xiàn)對差分傳輸線的最大匹配,阻值一般在90~130Ω之間,系統(tǒng)也需要此終端電阻來產(chǎn)生正常工作的差分電壓;
(B)最好使用精度1~2%的表面貼電阻跨接在差分線上,必要時也可使用兩個阻值各為50Ω的電阻,并在中間通過一個電容接地,以濾去共模噪聲。
2.5 未使用的管腳
所有未使用的LVDS接收器輸入管腳懸空,所有未使用的LVDS和TTL輸出管腳懸空,將未使用的TTL發(fā)送/驅(qū)動器輸入和控制/使能管腳接電源或地。
2.6 媒質(zhì)(電纜和連接器)選擇
(A)使用受控阻抗媒質(zhì),差分阻抗約為100Ω,不會引入較大的阻抗不連續(xù)性;
(B)僅就減少噪聲和提高信號質(zhì)量而言,平衡電纜(如雙絞線對)通常比非平衡電纜好;
(C)電纜長度小于0.5m時,大部分電纜都能有效工作,距離在0.5m~10m之間時,CAT 3(Categiory 3)雙絞線對電纜效果好、便宜并且容易買到,距離大于10m并且要求高速率時,建議使用CAT 5雙絞線對。
2.7 在噪聲環(huán)境中提高可靠性設計
LVDS 接收器在內(nèi)部提供了可靠性線路,用以保護在接收器輸入懸空、接收器輸入短路以及接收器輸入匹配等情況下輸出可靠。但是,當驅(qū)動器三態(tài)或者接收器上的電纜沒有連接到驅(qū)動器上時,它并沒有提供在噪聲環(huán)境中的可靠性保證。在此情況下,電纜就變成了浮動的天線,如果電纜感應到的噪聲超過LVDS內(nèi)部可靠性線路的容限時,接收器就會開關或振蕩。如果此種情況發(fā)生,建議使用平衡或屏蔽電纜。另外,也可以外加電阻來提高噪聲容限,如圖3所示。 圖中R1、R3是可選的外接電阻,用來提高噪聲容限,R2≈100Ω。
當然,如果使用內(nèi)嵌在芯片中的LVDS收發(fā)器,由于一般都有控制收發(fā)器是否工作的機制,因而這種懸置不會影響系統(tǒng)。
3 應用實例
LVDS技術目前在高速系統(tǒng)中應用的非常廣泛,本文給出一個簡單的例子來看一下具體的連線方式。加拿大PMC公司的DSLAM(數(shù)字用戶線接入模塊)方案中,利用LVDS技術實現(xiàn)點對點的單板互聯(lián),系統(tǒng)結構可擴展性非常好,實現(xiàn)了線卡上的高集成度,并且完全能夠滿足業(yè)務分散、控制集中帶來的大量業(yè)務數(shù)據(jù)和控制流通信的要求。 圖4描述了該系統(tǒng)線卡與線卡之間、線卡與背板之間的連線情形,使用的都是單工方式,所以需要兩對線來實現(xiàn)雙向通信。圖中示出了三種不同連接方式,從上到下分別為:存在對應連接芯片;跨機架時實現(xiàn)終端匹配;同層機框時實現(xiàn)終端匹配。在接收端串接一個變壓器可以減小干擾并避免LVDS驅(qū)動器和接收器地電位差較大的影響。
點擊查看原文
發(fā)表評論 閱讀全文(0) | 回復(0)
發(fā)表于 2010/4/17 9:28:15
FPGA設計流程(轉(zhuǎn)) 1.設計輸入
1)設計的行為或結構描述。
2)典型文本輸入工具有UltraEdit-32和Editplus.exe.。
3)典型圖形化輸入工具-Mentor的Renoir。
4)我認為UltraEdit-32最佳。
2.代碼調(diào)試
1)對設計輸入的文件做代碼調(diào)試,語法檢查。
2)典型工具為Debussy。
3.前仿真
1)功能仿真
2)驗證驗證邏輯模型(沒有使用時間延遲)。
3)典型工具有Mentor公司的ModelSim、Synopsys公司的VCS和VSS、Aldec公司的Active、Cadense公司的NC。
4)我認為做功能仿真Synopsys公司的VCS和VSS速度最快,并且調(diào)試器最好用,Mentor公司的ModelSim對于讀寫文件速度最快,波形窗口比較好用。
4.綜合
1)把設計翻譯成原始的目標工藝
2)最優(yōu)化
3)合適的面積要求和性能要求
4)典型工具有Mentor公司的LeonardoSpectrum、Synopsys公司的DC、Synplicity公司的Synplify。
5)推薦初學者使用Mentor公司的LeonardoSpectrum,由于它在只作簡單約束綜合后的速度和面積最優(yōu),如果你對綜合工具比較了解,可以使用Synplicity公司的
Synplify。
5.布局和布線
1)映射設計到目標工藝里指定位置
2)指定的布線資源應被使用
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)時序仿真
2)驗證設計一旦編程或配置將能在目標工藝里工作(使用時間延遲)。
3)所用工具同前仿真所用軟件。
7.時序分析
4)一般借助布局布線工具自帶的時序分析工具,也可以使用Synopsys公司的 PrimeTime軟件和Mentor Graphics公司的Tau timing analysis軟件。
8.驗證合乎性能規(guī)范
1)驗證合乎性能規(guī)范,如果不滿足,回到第一步。
9.版圖設計
1)驗證版版圖設計。
2)在板編程和測試器件。
點擊查看原文
發(fā)表評論 閱讀全文(34) | 回復(1)
發(fā)表于 2010/4/16 19:30:46
關于inout口的使用(轉(zhuǎn)) 見許多問這個問題的,總結一下,希望能對大家有點用處,如果有不對的地方,歡迎指出.
芯片外部引腳很多都使用inout類型的,為的是節(jié)省管腿。一般信號線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r候就要用到
INOUT類型了。就是一個端口同時做輸入和輸出。 inout在具體實現(xiàn)上一般用三態(tài)門來實現(xiàn)。三態(tài)門的第三個狀態(tài)就是高阻'Z'。 當inout端口不輸出時,將三態(tài)門置高阻。這樣信號就不會因為兩端同時輸出而出錯了,更詳細的內(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,可以通過組合邏輯或者時序邏輯根據(jù)data_in對其賦值.通過控制link_data的高低電平,從而設置data_inout是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時當作輸入端口使用.link_data可以通過相關電路來控制.
2 編寫測試模塊時,對于inout類型的端口,需要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區(qū)別的.
當上面例子中的data_inout用作輸入時,需要賦值給data_inout,其余情況可以斷開.此時可以用assign語句實現(xiàn):assign data_inout=link?data_in_t:1’bz;其中的link ,data_in_t是reg類型變量,在測試模塊中賦值.
另外,可以設置一個輸出端口觀察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,如果確實需要,那么用兩個port實現(xiàn),到頂層的時候再用三態(tài)實現(xiàn)。理由是:在非頂層模塊用雙向口的話,該雙向口必然有它的上層跟它相連。既然是雙向口,則上層至少有一個輸入口和一個輸出口聯(lián)到該雙向口上,則發(fā)生兩個內(nèi)部輸出單元連接到一起的情況出現(xiàn),這樣在綜合時往往會出錯。
舉例說明
輸入口din定義:input[7:0]din;當雙向端口
dinout作為輸出口時,我們從din端口輸入數(shù)據(jù)到
模塊中,讓數(shù)據(jù)從dinout口出來。
輸出口dout定義:output[7:0]dout;當雙向
端口dinout作為輸入口時,我們讓數(shù)據(jù)從dinout口
輸入,從輸出口dout輸出。
雙向端口dinout定義:inout[7:0]dinout;
三態(tài)門選通信號z:inputz;
當z=1時,把三態(tài)門置為高阻態(tài),這時dinout
作為輸入口用;當z=0時,開通三態(tài)門,這時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;
|