FPGA學(xué)習(xí)筆記day4
這節(jié)課學(xué)習(xí)聯(lián)合仿真
怎么理解聯(lián)合仿真?好像就是把仿真軟件和開發(fā)環(huán)境聯(lián)系到一起去
首先在quartus里面找到tools,option

然后在這里找一下modelsim的安裝路徑


然后去quartus的assignments里面選擇一下settings,在這里設(shè)置一下

然后還有下面的這個simulation,作用:在把tb文件寫好之后,需要在這里添加tb文件

可以把1ps改成1ns
然后在下面點(diǎn)擊testbench,然后點(diǎn)new,添加tb文件。以前寫tb文件都是需要正兒八經(jīng)的自己敲,這里有一個工具可以生成一個模板:

點(diǎn)完了之后,下面會提示你這個:

意思就是他成功的在你的par下面創(chuàng)建了一個simulation文件夾

打開可以看到里面有個后綴名.vt的文件

打開看一下

里面有很多沒有用的注釋,去掉即可

然后在相應(yīng)位置添加幾行代碼就行了

這個模板生成的文件,module的名字會加一個vlg_tst,不要忘了,剛才有一個添加tb文件的步驟,new什么的,在那里添加的名字是這個module的名字,而不是tb文件的名字

然后點(diǎn)ok

就可以了,有的時候仿真不通過主要存在兩個可能性
一個是文件名沒整對
一個是本身quartus編譯就沒通過
一個是quartus程序里面的時序?qū)Ψ抡嫦到y(tǒng)來說太慢了,比如流水燈,一秒鐘變一次狀態(tài)。但是仿真里面都是以ns為單位的。所以觀察不到變化。改改程序就完事了。
速學(xué)verilog
又開始講fpga,過一遍吧

HDL:hardware description language硬件描述語言
常見的有verilogHDL和VHDL
verilog歷史:

verilog與C語言的區(qū)別:

學(xué)一下基本語法:
1、基礎(chǔ)知識:

2、數(shù)字進(jìn)制格式:

需要注意一點(diǎn),這個我不知道,就是這個位寬實際上指的是二進(jìn)制數(shù)的位寬。參見csdn的一個文章的解釋:


3、標(biāo)識符
用于定義模塊名、端口名、信號名,可以是任意一組字母、數(shù)字、$、下劃線,第一個字符必須是字母或者下劃線。標(biāo)識符區(qū)分大小寫。
建議:命名信號的時候最好讓他有一定的含義
4、數(shù)據(jù)類型
寄存器數(shù)據(jù)類新給,線網(wǎng)數(shù)據(jù)類型、參數(shù)數(shù)據(jù)類型
reg。wire。parameter
reg:表示一個抽象的數(shù)據(jù)存儲單元,通過賦值語句可以改變寄存器存儲的值,reg數(shù)據(jù)類型的初始值默認(rèn)為不定值X
reg類型數(shù)據(jù)只能在always和initial語句中被賦值。
若always里面帶有時鐘信號,則該寄存器變量對應(yīng)為觸發(fā)器
若always里面沒有時鐘信號,則該寄存器變量對應(yīng)位硬件連線
wire:表示結(jié)構(gòu)實體之間的物理連線。這種的變量不能存儲值,他的值是由驅(qū)動它的原件決定的。
驅(qū)動線網(wǎng)類型變量的元器件有門、連續(xù)賦值語句、assign等
如果沒有驅(qū)動原件連接到線網(wǎng)類型的變量上,則該變量就是高阻的,值為z
線網(wǎng)數(shù)據(jù)類型包括wire和tri型,wire較為常用
parameter:就是個常量,有點(diǎn)像C里面的define,我們可以一次定義多個參數(shù),參數(shù)與參數(shù)之間需要用逗號隔開,每個參數(shù)定義的右邊必須是一個常數(shù)表達(dá)式。

參數(shù)型數(shù)據(jù)類型常用于定義狀態(tài)機(jī)的狀態(tài),數(shù)據(jù)位寬、延遲大小。采用標(biāo)識符來代表一個常量,可以提高可讀性。
5、運(yùn)算符
1算數(shù)運(yùn)算符:

模除其實就是求余數(shù)
2關(guān)系運(yùn)算符

3邏輯運(yùn)算符

4條件操作符

eg:result=(a>=b)?a:b
功能等同于always中的if-else語句。a是判斷條件,bc是執(zhí)行語句
5位運(yùn)算

6移位運(yùn)算


7拼接運(yùn)算符

舉例子:

優(yōu)先級:

6、verilog注釋
和C一樣
//和/*
7、verilog關(guān)鍵字
常用的:

8、verilog程序框架
基本設(shè)計單元是模塊(C的基本單元是函數(shù))一個模塊由兩個部分組成,一部分描述接口,一部分描述邏輯功能
每個verilog程序包括4個主要部分:
端口定義,IO說明,內(nèi)部信號聲明,功能定義

端口定義:就是block后面,括號里面那些。
IO說明:input、output
功能定義:
assign是給線網(wǎng)數(shù)據(jù)類型的變量賦值的一種方法。之前說了wire這個東西不能直接存儲變量,是需要其他東西驅(qū)動的。

功能定義部分有三種方法:
1、assign語句
2、always語句
3、例化實例元件

這個例化其實昨天寫tb文件的時候領(lǐng)教過了,還有一種新的方式:


以這個為例.sys_clk(sys_clk)
這個.+變量(變量)的含義就是括號外面那個變量名,是被調(diào)用的子模塊中的變量名。括號里面那個變量,就是要賦值給這個“被調(diào)用的子模塊中的變量名”的值。
然后來學(xué)結(jié)構(gòu)語句、賦值語句、條件語句
1、結(jié)構(gòu)語句
initial和always語句
initial語句在模塊中只執(zhí)行一次,常用于測試文件的編寫(tb),用來產(chǎn)生仿真測試信號,或者用于對存儲器變量賦初值
always語句一直在不斷地重復(fù)活動,但是只有和一定的時間控制結(jié)合在一起才有用。這里的時間控制可以是沿觸發(fā),也可以是電平觸發(fā)。可以是單個信號,也可以是多個信號。多個信號中間要用關(guān)鍵字or連接。
2、賦值語句
阻塞賦值:b=a
非阻塞賦值:b<=a

也就是說這里給出來的值是a=b=c=0
就是說這里的賦值過程是一個一個按照順序來的
非阻塞則是并行執(zhí)行的


3、條件語句
if語句

條件語句必須再過程塊中使用,也就是initial和always語句。
而且上述的表達(dá)式好像并不需要針對同一個對象。比方說右邊那個,表達(dá)式1可能說的是A的事,但是表達(dá)式2可以說B的事。
注意:

case語句(就類似switch)

casez:比較時不考慮表達(dá)式中的高阻值
casex:比較時不考慮高阻值和不定值
最后學(xué)狀態(tài)機(jī)
狀態(tài)機(jī)概念,狀態(tài)機(jī)模型,狀態(tài)機(jī)設(shè)計
應(yīng)用場景:

狀態(tài)機(jī)state machine
有限狀態(tài)機(jī)(Finite state machine)在有限個狀態(tài)之間按照一定規(guī)律轉(zhuǎn)換的時序電路
狀態(tài)機(jī)模型:
mealy狀態(tài)機(jī)

這個其實就是數(shù)電里面學(xué)的那個東西。就是時序邏輯電路。狀態(tài)轉(zhuǎn)換圖。

這個摩爾和米利其實也學(xué)過,在數(shù)電書里面講過,我去找找——數(shù)電書262頁

狀態(tài)機(jī)設(shè)計:

step1:狀態(tài)空間定義
兩部分工作,第一部分:把各個狀態(tài)用不同的二進(jìn)制數(shù)編碼。第二部分:定義兩個reg變量:現(xiàn)態(tài)和次態(tài)。需要注意的是,這兩個部分的位寬需要對應(yīng)上。

step2:狀態(tài)跳轉(zhuǎn):

在時序邏輯中必須使用非阻塞賦值
step3:下個狀態(tài)判斷(組合邏輯)

組合邏輯要用阻塞賦值
latch是一個鎖存器,會使得最后輸出的毛刺較多,影響時序分析。所以最好if和else要配對。case和default(還有endcase)配對
step4:各個狀態(tài)的動作(組合邏輯)

組合邏輯,用阻塞賦值
看個例子


always @ (*) begin含義

狀態(tài)機(jī)的最后可以再加一個輸出寄存器(時序邏輯)
作用:

完事
晚上做做第一個實驗