功能描述-組合邏輯
本節(jié)的文檔編號(hào):001100000061
需要看對(duì)應(yīng)的視頻,請(qǐng)點(diǎn)擊視頻編號(hào):?001100000053
1、本節(jié)主要進(jìn)行組合邏輯的介紹,包括:程序語句(assign語句、always語句),數(shù)字進(jìn)制(二進(jìn)制、不定態(tài)、高阻態(tài)),算數(shù)運(yùn)算符(加、減、乘、除運(yùn)算符),邏輯運(yùn)算符(邏輯與、或、非運(yùn)算符),按位邏輯運(yùn)算符(單目按位與、或、非運(yùn)算符,雙目按位與、或、異或運(yùn)算符),關(guān)系運(yùn)算符,移位運(yùn)算符(左移、右移運(yùn)算符),條件運(yùn)算符(三目運(yùn)算符、if語句、case語句、選擇語句等),拼接運(yùn)算符;
2、ALTERA和VIVADO文檔
第5節(jié)?功能描述-組合邏輯
5.1?程序語句
5.1.1assign語句
? ? assign語句是連續(xù)賦值語句,一般是將一個(gè)變量的值不間斷地賦值給另一變量,兩個(gè)變量之間就類似于被導(dǎo)線連在了一起,
習(xí)慣上當(dāng)做連線用。assign語句的基本格式是:
assign a = b?(邏輯運(yùn)算符)c …;
assign語句的功能屬于組合邏輯的范疇,應(yīng)用范圍可以概括為一下幾點(diǎn):
(1)持續(xù)賦值;
(2)連線;
(3)對(duì)wire型變量賦值,wire是線網(wǎng),相當(dāng)于實(shí)際的連接線,
如果要用assign直接連接,就用wire型變量,wire型變量的值隨時(shí)發(fā)生變化。
需要說明的是,多條assign連續(xù)賦值語句之間互相獨(dú)立、并行執(zhí)行。
5.1.2always語句
? ? always?語句是條件循環(huán)語句,執(zhí)行機(jī)制是通過對(duì)一個(gè)稱為敏感變量表的事件驅(qū)動(dòng)來實(shí)現(xiàn)的,
下面會(huì)具體講到。always?語句的基本格式是:
always @(敏感事件)begin
? ?? ??程序語句
end
always是“一直、總是”的意思,@后面跟著事件。整個(gè)always的意思是:當(dāng)敏感事件的條件滿足時(shí),
就執(zhí)行一次“程序語句”。敏感事件每滿足一次,就執(zhí)行“程序語句”一次。

這段程序的意思是:當(dāng)信號(hào)a或者信號(hào)b或者信號(hào)d發(fā)生變化時(shí),就執(zhí)行一次下面語句。
在執(zhí)行該段語句時(shí),首先判斷信號(hào)sel是否為0,如果為0,則執(zhí)行第3行代碼。如果sel不為0,則執(zhí)行第5行代碼。
需要強(qiáng)調(diào)的是,a、b、c任意一個(gè)發(fā)生變化一次,2行至5行也只執(zhí)行一次,不會(huì)執(zhí)行第二次。
此處需要注意,僅僅sel這個(gè)信號(hào)發(fā)生變化是不會(huì)執(zhí)行第2行到5行代碼的,通常這并不符合設(shè)計(jì)者的想法。
例如,一般設(shè)計(jì)者的想法是:當(dāng)sel為0時(shí)c的結(jié)果是a+b;當(dāng)sel不為0時(shí)c的結(jié)果是a+d。
但如果觸發(fā)條件沒有發(fā)生改變,雖然sel由0變1,但此時(shí)c的結(jié)果仍是a+b。因此,這并不是一個(gè)規(guī)范的設(shè)計(jì)思維。
因此,按照設(shè)計(jì)者的想法重新對(duì)代碼進(jìn)行設(shè)計(jì):當(dāng)信號(hào)a或者信號(hào)b或者信號(hào)d或者信號(hào)sel發(fā)生變化時(shí),
就執(zhí)行2行至5行。這樣就可以確保sel信號(hào)值為0時(shí),c的結(jié)果一定為a+b,當(dāng)sel不為0時(shí),c的結(jié)果一定是a+d。
因此要在敏感列表中加入sel,其代碼如下所示。

當(dāng)敏感信號(hào)非常多時(shí)很容易就會(huì)把敏感信號(hào)遺漏,為避免這種情況可以用“*”來代替。
這個(gè)“*”是指“程序語句”中所有的條件信號(hào),即a、b、d、sel(不包括c),筆者也推薦這種寫法,
其具體代碼如下所示。

這種條件信號(hào)變化結(jié)果立即變化的always語句被稱為“組合邏輯”。

上述代碼敏感列表是“posedge clk”,其中posedge表示上升沿。也就是說,
當(dāng)clk由0變成1的瞬間執(zhí)行一次程序代碼,即第2至5行,其他時(shí)刻c的值保持不變。
要特別強(qiáng)調(diào)的是:如果clk沒有由0變成1,那么即使a、b、d、sel發(fā)生變化,c的值也是不變的。

可以看到上述代碼的敏感列表是“negedge clk”,其中negedge表示下降沿。
也就是說,當(dāng)clk由1變成0的瞬間執(zhí)行一次程序代碼,即第2至5行,其他時(shí)刻c的值保持不變。
要特別強(qiáng)調(diào)的是,如果clk沒有由1變成0,那么即使a、b、d、sel發(fā)生變化,c的值也是不變的。

上述代碼的敏感列表是“posedge clk or negedge rst_n”,也就是說,當(dāng)clk由0變成1的瞬間,
或者rst_n由1變化0的瞬間,執(zhí)行一次程序代碼,即第2至8行,其他時(shí)刻c的值保持不變。
這種信號(hào)邊沿觸發(fā),即信號(hào)上升沿或者下降沿才變化的always,被稱為“時(shí)序邏輯”,
此時(shí)信號(hào)clk是時(shí)鐘。注意:識(shí)別信號(hào)是不是時(shí)鐘不是看名稱,而是看這個(gè)信號(hào)放在哪里,
只有放在敏感列表并且是邊沿觸發(fā)的才是時(shí)鐘。而信號(hào)rst_n是復(fù)位信號(hào),同樣也不是看名字來判斷,
而是放在敏感列表中且同樣邊沿觸發(fā),更關(guān)鍵的是“程序語句”首先判斷了rst_n的值,
這表示rst_n優(yōu)先級(jí)最高,一般都是用于復(fù)位。
設(shè)計(jì)時(shí)需要注意以下幾點(diǎn):
1、組合邏輯的always?語句中敏感變量必須寫全,或者用“*”代替。
2、組合邏輯器件的賦值采用阻塞賦值“=,時(shí)序邏輯器件的賦值語句采用非阻塞賦值“<=”,
具體原因見“阻塞賦值和非阻塞賦值”一節(jié)內(nèi)容。
相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=7
相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=7