2.數(shù)字系統(tǒng)的構(gòu)成: 傳感器 AD 數(shù)字處理器 DA 執(zhí)行部件
3.程序通在硬件上的執(zhí)行過程:
C語言(經(jīng)過編譯)-->該處理器的機(jī)器語言(放入存儲(chǔ)器)-->按時(shí)鐘的節(jié)拍,逐條取出指令、分析指令、執(zhí)行指令
4.DSP處理是個(gè)廣泛概念,統(tǒng)指在數(shù)字系統(tǒng)中做的變換(DFT)、濾波、編碼解碼、加密解密、壓縮解壓等處理
5.數(shù)字處理器包括兩部分:高速數(shù)據(jù)通道接口邏輯、高速算法電路邏輯
6.當(dāng)前,IC產(chǎn)業(yè)包括IC制造和IC設(shè)計(jì)兩部分,IC設(shè)計(jì)技術(shù)發(fā)展速度高于IC設(shè)計(jì)
7.FPGA設(shè)計(jì)的前續(xù)課程:數(shù)值分析、DSP、C語言、算法與數(shù)據(jù)結(jié)構(gòu)、數(shù)字電路、HDL語言 計(jì)算機(jī)微體系結(jié)構(gòu)
8.數(shù)字處理器處理性能的提高:軟件算法的優(yōu)化、微體系結(jié)構(gòu)的優(yōu)化
9.數(shù)字系統(tǒng)的實(shí)現(xiàn)方式:
編寫C程序,然后用編譯工具得到通用微處理器的機(jī)器指令代碼,在通用微處理器上運(yùn)行(如8051/ARM/PENTUIM)
專用DSP硬件處理器
用FPGA硬件邏輯實(shí)現(xiàn)算法,但性能不如ASIC
用ASIC實(shí)現(xiàn),經(jīng)費(fèi)充足、大批量的情況下使用,因?yàn)橥镀杀靖摺⒅芷陂L
10.FPGA設(shè)計(jì)方法: IP核重用、并行設(shè)計(jì)、層次化模塊化設(shè)計(jì)、top-down思想
FPGA設(shè)計(jì)分工:前端邏輯設(shè)計(jì)、后端電路實(shí)現(xiàn)、仿真驗(yàn)證
11.matlab的應(yīng)用:
matlab中有許多現(xiàn)成的數(shù)學(xué)函數(shù)可以利用,節(jié)省了復(fù)雜函數(shù)的編寫時(shí)間
matlab可以與C程序接口
做算法仿真和驗(yàn)證時(shí)能很快生成有用的數(shù)據(jù)文件和表格
DSP builder可以直接將simulink模型轉(zhuǎn)換成HDL代碼,跳過了中間的C語言改寫步驟
12.常規(guī)從算法到硬件電路的開發(fā)過程:
算法的開發(fā)
C語言的功能描述
并行結(jié)構(gòu)的C語言改寫
verilog的改寫
仿真、驗(yàn)證、修正
綜合、布局布線、投入實(shí)用
13.C語言改寫成verilog代碼的困難點(diǎn):
并行C語言的改寫,因?yàn)镃本身是順序執(zhí)行,而不是并行執(zhí)行
不使用C語言中的復(fù)雜數(shù)據(jù)結(jié)構(gòu),如指針
目前有將C語言轉(zhuǎn)換成verilog的工具?
14.HDL
HDL描述方法是從電路圖描述方法演化來的,相比來說更容易修改
符合IEEE標(biāo)準(zhǔn)的有verilog HDL和VHDL
VHDL由美國國防部開發(fā),有1987和1993兩個(gè)版本
verilog由cadence持有,有1995、2001、2005三個(gè)版本
verilog較VHDL更有前景:具有模擬電路描述能力、不僅可以開發(fā)電路還可以驗(yàn)證電路、門級以下描述比VHDL強(qiáng)
RTL級和門級的綜合已經(jīng)成熟,主要是注意行為級的綜合結(jié)果,使用可綜合的編程風(fēng)格
SYSTEM VERILOG是VERILOG的一種延伸
15.IP核的應(yīng)用:
軟核soft core: 功能經(jīng)過驗(yàn)證的、可綜合的、實(shí)現(xiàn)后門數(shù)在5K以上的HDL代碼
固核firm core: 功能經(jīng)過驗(yàn)證的、可綜合的、實(shí)現(xiàn)后門數(shù)在5K以上的電路結(jié)構(gòu)編碼文件,如edif,不可更改
硬核hard core: 功能經(jīng)過驗(yàn)證的、可綜合的、實(shí)現(xiàn)后門數(shù)在5K以上的電路結(jié)構(gòu)版圖,已帶工藝參數(shù),不可更改
16.HDL語言綜合后得到EDIF,這是一種標(biāo)準(zhǔn)電路網(wǎng)表
EDIF經(jīng)過具體工藝庫匹配、布局布線、延時(shí)計(jì)算后得到網(wǎng)表
EDIF不可更改,作為固核存在
17.verilog特點(diǎn):
區(qū)分大小寫,所有關(guān)鍵字都要求小寫
不是強(qiáng)類型語言,不同類型數(shù)據(jù)之間可以賦值和運(yùn)算
//是單行注釋 可以跨行注釋
描述風(fēng)格有系統(tǒng)級描述、行為級描述、RTL級描述、門級描述,其中RTL級和門級別與具體電路結(jié)構(gòu)有關(guān),行為級描述要遵守可綜合原則
門級描述使用門級模型或者用戶自定義模型UDP來代替具體基本元件,在IDE中針對不同F(xiàn)PGA器件已經(jīng)有對應(yīng)的基本元件原語
18.verlog語法要點(diǎn):
module endmodule之間由兩部分構(gòu)成:接口描述和邏輯功能描述
IO端口種類: input output inout
相同位寬的輸入輸出信號可以一起聲明, input[3:0] a,b; 不同位寬的必須分開寫
內(nèi)部信號為reg類型,內(nèi)部信號信號的狀態(tài): 0 1 x z, 3'bx1=3'bxx1 x/z會(huì)往左擴(kuò)展 3'b1=3'b001 數(shù)字不往左擴(kuò)展
邏輯功能描述中常用assign描述組合邏輯電路,always既可以描述組合邏輯電路又可以描述時(shí)序邏輯電路,還可以用元件調(diào)用方法描述邏輯功能
always之間、assign之間、實(shí)例引用之間以及它們之間都是并行執(zhí)行,always內(nèi)部是順序執(zhí)行
常量格式: <+/-><二進(jìn)制位寬><'><進(jìn)制><該進(jìn)制的數(shù)值>:
默認(rèn)進(jìn)制為10進(jìn)制
默認(rèn)位寬為32位
位寬是從二進(jìn)制寬度角度而言的
由位寬決定從低位截取二進(jìn)制數(shù)2'hFF=2'b11,通常由被賦值的reg變量位寬決定
parameter常用于定義延遲和變量位寬,可用常量或常量表達(dá)式定義
變量種類: wire reg memory
IO信號默認(rèn)為wire類型,除非指定為reg類型
wire可以用作任何輸入輸出端口
wire包括input output inout
wire不帶寄存功能
assign賦值語句中,被賦值的信號都是wire類型
assign之所以稱為連續(xù)賦值,是因?yàn)椴粩鄼z測表達(dá)式的變化
reg類型可以被賦值后再使用,而不是向wire一樣只能輸出,類似VHDL中的buffer端口
reg類型變量初始值為x (VHDL中初始值為本類型最小值,通常是0)
always模塊里被賦值的信號都必須定義為reg類型,因?yàn)閍lways可以反復(fù)執(zhí)行,而reg表示信號的寄存,可以保留上次執(zhí)行的值
reg類型變量與integer變量不同,即使賦負(fù)值,實(shí)質(zhì)上也是按二進(jìn)制無符號數(shù)存儲(chǔ)的,integer是有符號數(shù)
verilog中所有內(nèi)部信號都是靜態(tài)變量,因?yàn)樗鼈兊闹刀荚趓eg中存儲(chǔ)起來了
memory型只有一維數(shù)組,由reg型變量組成
memory初始化只能按地址賦值,不能一次性賦值
1*256的memory寫法: reg mema[255:0] mema[3]=0;
不同位寬的變量之間賦值,處理之前都以被賦值的變量位寬為準(zhǔn)擴(kuò)展或截取
A[a:b] 無論a b誰大,a總是實(shí)際電路的信號高位,b總是實(shí)際電路的信號低位
算術(shù)運(yùn)算中如果有X值則結(jié)果為X
for循環(huán)中的變量另外定義成integer,因?yàn)樗皇菍?shí)際信號,有正負(fù);reg則以無符號數(shù)存在
== 和!=只比較0、1,遇到z或x時(shí)結(jié)果都為x (x在if中算做假條件),結(jié)果可能是1、0、x
===和!==比較更加苛刻,包括x和z的精確比較,結(jié)果可能是0、1
&&的結(jié)果只有1'b1或1'b0兩種, A&A的結(jié)果位寬則是與A相同的
{1,0}為 64'h100000000,所以拼接運(yùn)算中各信號一定要指定位寬
移位運(yùn)算左移將保留 4'b1000<<1等于5'b10000,右移則舍棄 4'b0011等于4'b0001
數(shù)字電路里位運(yùn)算應(yīng)用普遍,包括按位邏輯運(yùn)算、移位運(yùn)算、拼接運(yùn)算、縮減運(yùn)算
非阻塞式賦值<=與阻塞式賦值=
阻塞:在同一個(gè)always過程中,后面的賦值語句要等待前一個(gè)賦值語句執(zhí)行完,后面的語句被該賦值語句阻塞
非阻塞:在同一個(gè)always過程中,非阻塞賦值語句是同時(shí)進(jìn)行的,排在后面的語句不會(huì)被該賦值語句阻塞
<=:
塊結(jié)束后才能完成賦值
塊內(nèi)所有<=語句在always塊結(jié)束時(shí)刻同時(shí)賦值
<=右邊各變量的值是上一次時(shí)鐘邊沿時(shí),這些變量當(dāng)時(shí)的值
用于描述可綜合的時(shí)序電路
=:
=語句結(jié)束之后過程always才可能結(jié)束
在always過程中,begin end塊內(nèi)按先后順序立即賦值,在fork join內(nèi)同時(shí)賦值(可能造成沖突)
與assign連用描述組合電路
begin end中阻塞的含義:begin ...@(A) B=C...; end 如果A事件不發(fā)生則永遠(yuǎn)不能執(zhí)行下去,被阻塞了
由于時(shí)鐘的延時(shí)(往往在ps級),多個(gè)always(posedge)之間究竟誰先執(zhí)行是個(gè)未知數(shù)
使用原則:同一個(gè)always過程塊內(nèi)建立時(shí)序電路用<=
純組合邏輯電路用=,生成的電路結(jié)構(gòu)最簡單,執(zhí)行速度最快
同一個(gè)always塊內(nèi)不要混用<=和=
不要在多個(gè)always塊內(nèi)對同一個(gè)變量賦值(多源驅(qū)動(dòng))
if else的三種形式,第三種形式適合描述優(yōu)先編碼器
if條件中0/x/z當(dāng)成假,1當(dāng)成真,非0的數(shù)值也當(dāng)成真
case語句的三種: case(四種狀態(tài)的比較) casez(忽略z) casex(忽略x和z,只看哪些位的信號有用)
case語句中所有表達(dá)式值的位寬必須相等,default中不能將n'bx用'bx代替
避免生成鎖存器的方法: 電平觸發(fā)時(shí)if后加else case中加default ?
使用casex會(huì)將不必要的狀態(tài)視為無關(guān)項(xiàng),使得綜合出來的電路最簡單
兩種特殊的括號: begin 順序語句... end fork 并行語句... join,其差別在于塊內(nèi)語句的起止時(shí)間、執(zhí)行順序、相對延時(shí)
塊被命名后,其內(nèi)部變量可以被調(diào)用,因?yàn)樽兞慷际庆o態(tài)的(調(diào)用信號:對應(yīng)電路中的一個(gè)信號線被引到另一處)
initial塊只無條件執(zhí)行一次 always塊在滿足條件時(shí)不斷執(zhí)行
initial常用來寫測試文件, always塊常用來寫電路描述
always既可以描述組合邏輯電路又可以描述時(shí)序邏輯電路
always如果后面有敏感信號列表則不能用wait語句
always既可以描述電平觸發(fā)又可以描述邊沿觸發(fā),wait只能描述電平觸發(fā)
assign常用于描述組合邏輯電路
測試文件中一般都是現(xiàn)initial 后always
生成語句:生成快的本質(zhì)是使用循環(huán)內(nèi)的一條語句代替多條重復(fù)的verilog語句,簡化了用戶的編程
genvar用于聲明生成變量,生成變量只能用在生成快之間
仿真時(shí),仿真器會(huì)將生成塊中的代碼展平,在確立后的方針代碼中,生成變量是不存在的
最好是先想象出來循環(huán)生成語句被展平后的電路樣子,再寫相關(guān)的描述語句
task和function的區(qū)別:
task可以定義自己的仿真時(shí)間單位,function與主模塊共用同一個(gè)仿真時(shí)間單位
函數(shù)不能啟動(dòng)任務(wù),任務(wù)能夠啟動(dòng)函數(shù)
函數(shù)至少要有一個(gè)輸入變量,任務(wù)沒有輸入變量
函數(shù)返回一個(gè)值,任務(wù)不返回值
一個(gè)模塊的設(shè)計(jì)包括3個(gè)部分: 電路模塊的設(shè)計(jì) 測試模塊的設(shè)計(jì) 設(shè)計(jì)文檔的編寫
設(shè)計(jì)者通過布局布線工具生成具有布線延遲的電路,再進(jìn)行后仿真,得到時(shí)序分析報(bào)告
從時(shí)序分析報(bào)告中可以知道電路的實(shí)際延遲t,同步電路內(nèi)每個(gè)時(shí)鐘周期要大于t,從而可確定該運(yùn)算邏輯的最高頻率
綜合器之所以能夠?qū)崿F(xiàn)加法器、乘法器是因?yàn)閹熘幸呀?jīng)存在可配置的參數(shù)化器件模型
FPGA內(nèi)總線寬度容易自定義,以便實(shí)現(xiàn)高速數(shù)據(jù)流,三態(tài)數(shù)據(jù)總線相當(dāng)于數(shù)據(jù)流的控制閥門
數(shù)字系統(tǒng)內(nèi)數(shù)據(jù)流的控制: 開關(guān)(或三態(tài)數(shù)據(jù)總線)、數(shù)據(jù)暫存部件(寄存器)、 同步狀態(tài)機(jī)控制(整個(gè)系統(tǒng)在一個(gè)時(shí)鐘域內(nèi))
流水線操作pipe line:
K級流水線就是從組合邏輯的輸入到輸出恰好有K個(gè)寄存器組,上一級的輸出是下一級的輸入
流水線操作獲得第一個(gè)結(jié)果的時(shí)間要比不用流水線操作的時(shí)間長,但以后結(jié)果獲得時(shí)間都只需要一個(gè)時(shí)鐘周期,提高了數(shù)據(jù)吞吐量
流水線操作的保證:Tclk>K*(組合邏輯延遲+觸發(fā)器的建立保持時(shí)間/觸發(fā)時(shí)間),即時(shí)間片段要長于最大路徑延遲
體現(xiàn)了面積換速度的思想,在綜合時(shí)考慮的是以面積小為主還是以速度為主
本質(zhì)上是一種同步邏輯
同步時(shí)序邏輯和異步時(shí)序邏輯:
同步時(shí)序邏輯指所有寄存器組由唯一時(shí)鐘觸發(fā) always@(posedge clk) 或always@(negedage clk)
異步時(shí)序邏輯指觸發(fā)條件不唯一,任意一個(gè)條件都會(huì)引起觸發(fā) always@(posedge clk or posedage reset)
目前的綜合器是以同步時(shí)序邏輯綜合的,因?yàn)橥綍r(shí)序邏輯較異步時(shí)序邏輯可靠
嚴(yán)格的同步要求時(shí)鐘信號傳遞速度遠(yuǎn)遠(yuǎn)大于各部分的延遲,實(shí)際中clk要單獨(dú)用線,而不要經(jīng)過反相器等部件
always @(posedge.. ) begin ...<=... end 表示同步時(shí)序邏輯(同時(shí)刻賦值)
不同速率數(shù)據(jù)接口的處理方法(異步數(shù)據(jù)的處理方法):幀同步 FIFO 雙端口RAM
同步狀態(tài)機(jī):
包括moore和mealy型兩種,及其反饋模型(是一種反饋控制系統(tǒng),當(dāng)前狀態(tài)就是其內(nèi)部狀態(tài)變量)
狀態(tài)機(jī)的開發(fā)步驟:
根據(jù)實(shí)際問題列出輸入輸出變量和狀態(tài)數(shù)
畫出狀態(tài)圖并化簡
寫出狀態(tài)轉(zhuǎn)移真值表得到邏輯表達(dá)式
用D觸發(fā)器或JK觸發(fā)器構(gòu)建電路(目前用D觸發(fā)器多)
verilog描述時(shí)只需要得到簡化的狀態(tài)圖就可以描述
狀態(tài)編碼方式: 獨(dú)熱碼 格雷碼
狀態(tài)機(jī)主體程序有單always描述方式和多always描述方式
采用case/casez/casex建立模型最好,因?yàn)閤是無關(guān)態(tài),生成的電路最簡單
default: state='bx與實(shí)際情況更一致,效果等同于 default: state<=idle
只有同步狀態(tài)機(jī)才能被目前的綜合
for語句會(huì)將所有變量的情況展開,占用巨量邏輯資源,替代辦法是用計(jì)數(shù)器和case語句說明所有情況
有優(yōu)先級的if else結(jié)構(gòu)會(huì)消耗更多資源,建議用無優(yōu)先級的case替代
模塊的復(fù)用往往比代碼上修改節(jié)省的資源多
PLL的分頻、倍頻、移相操作會(huì)增加設(shè)計(jì)精度
同步時(shí)序電路的延時(shí):#x通常用于仿真測試,實(shí)際硬件延時(shí)是:長延遲用計(jì)數(shù)器,小延遲用D觸發(fā)器,此方法用來取代延遲鏈
同步電路中,穩(wěn)定的數(shù)據(jù)采用必須滿足采樣寄存器的建立和保持時(shí)間
reg類型在always中不一定綜合成時(shí)序電路,也可能是組合邏輯電路
乒乓操作與作用 異步時(shí)鐘域同步問題
延遲包括門延遲和線延遲
組合邏輯產(chǎn)生的時(shí)鐘僅能應(yīng)用在時(shí)鐘頻率較低、精度要求不高的情況下
增減敏感信號得到的結(jié)果一樣
補(bǔ)充部分:
verilog HDL起初是作為寫testbench而產(chǎn)生的
verilog 有1995進(jìn)入IEEE標(biāo)準(zhǔn),為IEEE-1364, 于2001年進(jìn)行了擴(kuò)展,為IEEE 1364-2001;
verilog AMS可用于模擬電路和數(shù)字電路的綜合,目前正在不斷發(fā)展和完善中;
verilog的標(biāo)識符區(qū)分大小寫,關(guān)鍵字使用小寫;
用\\來進(jìn)行單行注釋,用\* *\來進(jìn)行跨行注釋;
標(biāo)識符由字母、數(shù)字、下劃線構(gòu)成,并以字母開頭;
關(guān)鍵字又叫保留字,只有小寫的關(guān)鍵字才是保留字;
信號的狀態(tài)有4種: 0 1 x z
x和z在描述電路時(shí)不區(qū)分大小寫,在仿真時(shí)大小寫有不同意義;
常量表達(dá)式中:
x z不區(qū)分大小寫;
進(jìn)制符號h o d b與H O D B不區(qū)分大小寫;
十六進(jìn)制中a~f不區(qū)分大小寫;
下劃線_用于提高可讀性;
?在數(shù)中可以代替z;
x和z的左端補(bǔ)位;
字符和字符串都以ASICII碼形式存在,也可以當(dāng)成電路內(nèi)的信號;
字符串必須包含在同一行,不能分成多行書寫;
如果表達(dá)式或者賦值語句中將字符串當(dāng)成操作數(shù),則字符串中的每個(gè)字符都被看成8位的ASCII值序列;
可綜合的信號類型:wire reg memory 它們用來描述數(shù)字電路
不可綜合的數(shù)據(jù)類型:integer real 它們只用仿真,位于testbench中
wire是連線的抽象模型,不能保存數(shù)據(jù),其值由驅(qū)動(dòng)元的值決定;
wire不能用在always或initial塊中;
wire的默認(rèn)值為高阻z;
wire的使用情形: 1.作為模塊的輸出端口 2.用連續(xù)賦值語句assign賦值;
reg是1位寄存器(觸發(fā)器)的抽象模型,可以保存數(shù)據(jù);
reg必須用在always或initial塊中;
reg的默認(rèn)值為x;
reg的使用情形:1.阻塞賦值<= 2.非阻塞賦值=
memory只能是一維的;
memory只能對每個(gè)單元分別初始化,方法:1.一個(gè)一個(gè)賦值 2. 通過系統(tǒng)任務(wù)$readmem賦值
reg[3:0] fc;//一個(gè)4位寄存器 reg fc[3:0] //4個(gè)一位寄存器
parameter的作用:仿真開始以前對其進(jìn)行賦值,整個(gè)仿真過程中保持其值不變;
關(guān)系運(yùn)算符將以邏輯1或邏輯0返回比較的結(jié)果;
== !=的返回值有0 1 x三種情況,=== !==的返回值只有0 1兩種情況;
verilog由于是描述電路的,用于位的操作較多,有: 位邏輯操作,移位操作,并置操作,歸約操作;
位邏輯運(yùn)算的結(jié)果中,位數(shù)與原操作數(shù)一樣多;
歸約符是在原操作數(shù)的所有位上進(jìn)行操作,并產(chǎn)生1位結(jié)果;
并置運(yùn)算可以發(fā)生在bit與bit之間 bit與矢量之間 矢量與矢量之間
用于仿真的系統(tǒng)任務(wù):
所有系統(tǒng)任務(wù)都必須在initial或always內(nèi);
所有系統(tǒng)任務(wù)都必須以$開頭;
常見系統(tǒng)任務(wù):
顯示任務(wù)($diplay系列和$write系列)
監(jiān)控任務(wù)($monitor系列)
探測任務(wù)($strobe系列)
文件打開、輸入、關(guān)閉任務(wù)(&fopen &fclose &fdisplay...)
讀取文件任務(wù)($readmemb $readmemh)
仿真結(jié)束控制任務(wù)($finish $stop)
隨即信號任務(wù)($random)
過程塊: initial塊和always塊
一個(gè)module內(nèi)可以包含多個(gè)initial或always模塊;
所有initial或always塊在0時(shí)刻開始并行執(zhí)行,各initial或always塊內(nèi)部順序執(zhí)行;
initial過程塊主要是面向testbench的,通常不具有可綜合性;
always過程塊在描述電路時(shí)既可以描述組合邏輯電路(電平敏感)又可以描述時(shí)序邏輯電路(邊沿敏感);
寫testbench時(shí)initial通常用于初始化以及順序波形的描述,always通常用于重復(fù)波形的描述;
任務(wù)task與函數(shù)function: 為了描述模塊中被多次執(zhí)行的部分以及為了增強(qiáng)代碼的易讀性
verilog中的高級程序語句如for循環(huán)語句只用在寫testbench中;
begin end和fork join是兩種特殊的括號
if語句的第三種形式適合描述優(yōu)先編碼器,case語句適合描述數(shù)據(jù)選擇器和狀態(tài)機(jī);
case的條件表達(dá)式如果與分支項(xiàng)表達(dá)式長度不同,則在比較前將所有表達(dá)式都統(tǒng)一為這些表達(dá)式的最長長度;
casez忽略z,casex忽略z和x;
assign語句只在右端表達(dá)式發(fā)生變化時(shí)才重新計(jì)算并重新賦值,其余時(shí)間都是連續(xù)賦值;
assign語句可以指定bit、vector或是任意拼接操作的結(jié)果;
assign語句是連續(xù)賦值的,用于驅(qū)動(dòng)網(wǎng)線wire, reg類型不需要連續(xù)賦值,reg類型一旦被賦值就會(huì)一直保存;
過程賦值語句有兩種:阻塞式=和非阻塞式<=,只能在過程塊initial和always中使用;
@對事件觸發(fā)的控制與wait語句不能同時(shí)使用;