本(běn)节(jié)的(de)文(wén)檔編号(hào):001100000062
需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000071
1、本(běn)节(jié)主(zhǔ)要(yào)介紹,时(shí)序邏輯的(de)代(dài)碼,一(yī)般有(yǒu)两(liǎng)種(zhǒng):同(tóng)步複位时(shí)序邏輯和(hé)异(yì)步複位时(shí)序邏輯(本(běn)教学統一(yī)采用(yòng)异(yì)步时(shí)鐘(zhōng)邏輯);D型觸發(fà)器的(de)介紹,包(bāo)括:D觸發(fà)器的(de)結構、波(bō)形、代(dài)碼以(yǐ)及(jí)如(rú)何看(kàn)FPGA波(bō)形;时(shí)鐘(zhōng)的(de)介紹,时(shí)鐘(zhōng)的(de)意(yì)義,时(shí)鐘(zhōng)頻率和(hé)时(shí)鐘(zhōng)周期(qī)的(de)換算;时(shí)序邏輯代(dài)碼和(hé)硬(yìng)件(jiàn)的(de)關(guān)系(xì),即評估verilog代(dài)碼好(hǎo)壞的(de)最(zuì)基本(běn)标(biāo)準,不(bù)是(shì)看(kàn)代(dài)碼行數而(ér)是(shì)看(kàn)硬(yìng)件(jiàn);阻塞賦值和(hé)非(fēi)阻塞賦值,前(qián)者(zhě)位順序賦值,後(hòu)者(zhě)位同(tóng)时(shí)賦值。
2、这(zhè)是(shì)ALTERA和(hé)VIVADO文(wén)檔
6.4 时(shí)序邏輯代(dài)碼和(hé)硬(yìng)件(jiàn)
先(xiān)来(lái)分(fēn)析一(yī)下(xià)下(xià)面(miàn)这(zhè)段(duàn)代(dài)碼:
|
|
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
q <= 0;
end
else begin
q <= a + d;
end
end
|
仍然從語(yǔ)法上(shàng)分(fēn)析該段(duàn)代(dài)碼的(de)功能(néng)。該段(duàn)代(dài)碼總(zǒng)是(shì)在(zài)“时(shí)鐘(zhōng)clk上(shàng)升(shēng)沿或(huò)者(zhě)複位rst_n下(xià)降沿”的(de)时(shí)候執行一(yī)次(cì)。
具體(tǐ)執行方(fāng)法如(rú)下(xià):
1. 如(rú)果(guǒ)複位rst_n=0,則q的(de)值为(wèi)0;
2. 如(rú)果(guǒ)複位rst_n=1,則将(a+d)的(de)結果(guǒ)賦給(gěi)q(注意(yì),前(qián)提(tí)条(tiáo)件(jiàn)是(shì)时(shí)鐘(zhōng)上(shàng)升(shēng)沿的(de)时(shí)候)。
假設用(yòng)信(xìn)号(hào)c表(biǎo)示a+d的(de)結果(guǒ),則第(dì)2點(diǎn)可(kě)改为(wèi):如(rú)果(guǒ)複位rst_n=1,則将c的(de)值賦給(gěi)q(注意(yì),前(qián)提(tí)条(tiáo)件(jiàn)是(shì)时(shí)鐘(zhōng)上(shàng)升(shēng)沿的(de)时(shí)刻)。很明(míng)顯这(zhè)是(shì)一(yī)个(gè)D觸發(fà)器,輸入(rù)信(xìn)号(hào)为(wèi)d,輸出(chū)为(wèi)q,时(shí)鐘(zhōng)为(wèi)clk,複位为(wèi)rst_n,其電(diàn)路(lù)示意(yì)图(tú)如(rú)下(xià)图(tú)所(suǒ)示:
可(kě)知c是(shì)a+d的(de)結果(guǒ),因(yīn)此(cǐ)其自(zì)然是(shì)通(tòng)过(guò)一(yī)个(gè)加法器实現(xiàn),画(huà)出(chū)上(shàng)面(miàn)代(dài)碼所(suǒ)对(duì)應(yìng)的(de)電(diàn)路(lù)結構图(tú),可(kě)以(yǐ)看(kàn)出(chū)在(zài)D觸發(fà)器的(de)基礎上(shàng)增加了(le)一(yī)个(gè)加法器。
很容易分(fēn)析出(chū)上(shàng)面(miàn)電(diàn)路(lù)的(de)功能(néng):信(xìn)号(hào)a和(hé)信(xìn)号(hào)b相加得到(dào)c,c連(lián)到(dào)D觸發(fà)器的(de)輸入(rù)端。當clk出(chū)現(xiàn)上(shàng)升(shēng)沿时(shí),将c的(de)值傳給(gěi)q。这(zhè)與(yǔ)代(dài)碼功能(néng)是(shì)一(yī)致(zhì)的(de)。
下(xià)面(miàn)是(shì)代(dài)碼和(hé)硬(yìng)件(jiàn)所(suǒ)对(duì)應(yìng)的(de)波(bō)形图(tú)。
先(xiān)看(kàn)信(xìn)号(hào)c的(de)波(bō)形:c的(de)産生(shēng)只(zhī)有(yǒu)與(yǔ)a和(hé)d有(yǒu)關(guān),與(yǔ)rst_n和(hé)clk无關(guān)。c是(shì)a+d的(de)結果(guǒ),按照二(èr)進(jìn)制加法:0+0=0,0+1=1,1+1=0可(kě)以(yǐ)画(huà)出(chū)c的(de)波(bō)形。
在(zài)第(dì)1个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0,d=0,所(suǒ)以(yǐ)c=0+0=0;
在(zài)第(dì)2个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=1,d=0,所(suǒ)以(yǐ)c=1+0=1;
在(zài)第(dì)3个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=1,d=1,所(suǒ)以(yǐ)c=1+1=0;
在(zài)第(dì)4个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0,d=1,所(suǒ)以(yǐ)c=0+1=1;
在(zài)第(dì)5到(dào)第(dì)6个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0,d=0,所(suǒ)以(yǐ)c=0+0=0;
在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=1,d=1,所(suǒ)以(yǐ)c=1+1=0;
在(zài)第(dì)8个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0,d=1,所(suǒ)以(yǐ)c=0+1=1;
在(zài)第(dì)9个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0,d=0,所(suǒ)以(yǐ)c=0+0=0;
在(zài)第(dì)10个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0,d=1,所(suǒ)以(yǐ)c=0+1=1。
再看(kàn)信(xìn)号(hào)q的(de)波(bō)形:q是(shì)D觸發(fà)器的(de)輸出(chū),其只(zhī)在(zài)rst_n的(de)下(xià)降沿或(huò)者(zhě)clk的(de)上(shàng)升(shēng)沿才變(biàn)化(huà),其他(tā)时(shí)刻不(bù)變(biàn)化(huà),即a、d、c發(fà)生(shēng)變(biàn)化(huà)时(shí),q不(bù)会(huì)立刻發(fà)生(shēng)改變(biàn)。
下(xià)面(miàn)具體(tǐ)分(fēn)析每个(gè)时(shí)鐘(zhōng)下(xià)q信(xìn)号(hào)的(de)情(qíng)況:
在(zài)rst_n由(yóu)1變(biàn)0时(shí),q立刻變(biàn)成(chéng)0。
在(zài)第(dì)2个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)0。按代(dài)碼功能(néng),q仍然为(wèi)0。
在(zài)第(dì)3个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)0。按代(dài)碼功能(néng),q仍然为(wèi)0。
在(zài)第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)0,q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)0;
在(zài)第(dì)5个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)1,q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1;
在(zài)第(dì)6个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)0,q值为(wèi)1。按代(dài)碼功能(néng),q變(biàn)成(chéng)0;
在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)0,q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)0;
在(zài)第(dì)8个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)0,q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)0;
在(zài)第(dì)9个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)1,q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1;
在(zài)第(dì)10个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)0,q值为(wèi)1。按代(dài)碼功能(néng),q變(biàn)成(chéng)0;
在(zài)第(dì)11个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1,c值为(wèi)1,q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1。
在(zài)讨論时(shí)序邏輯的(de)加法器时(shí),笔(bǐ)者(zhě)对(duì)加法器的(de)輸出(chū)c和(hé)D觸發(fà)器的(de)輸出(chū)q分(fēn)開(kāi)進(jìn)行讨論,就(jiù)像两(liǎng)块(kuài)独立的(de)電(diàn)路(lù)。同(tóng)樣(yàng)的(de)道(dào)理,在(zài)設計(jì)Verilog代(dài)碼时(shí)也(yě)可(kě)以(yǐ)将其分(fēn)開(kāi)来(lái)進(jìn)行編写。
先(xiān)将下(xià)面(miàn)的(de)硬(yìng)件(jiàn)電(diàn)路(lù)用(yòng)Verilog描述出(chū)来(lái):
該電(diàn)路(lù)对(duì)應(yìng)的(de)電(diàn)路(lù)可(kě)以(yǐ)写成(chéng):
|
|
always @(*)begin
c = a + d;
end
|
也(yě)可(kě)以(yǐ)写成(chéng):
上(shàng)面(miàn)的(de)两(liǎng)段(duàn)代(dài)碼,都是(shì)描述同(tóng)一(yī)加法器硬(yìng)件(jiàn)電(diàn)路(lù)。接着用(yòng)Verilog对(duì)觸發(fà)器進(jìn)行描述。
其代(dài)碼的(de)写法如(rú)下(xià):
|
|
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
q <= 0;
end
else begin
q <= c;
end
end
|
最(zuì)後(hòu)可(kě)以(yǐ)看(kàn)到(dào),两(liǎng)段(duàn)代(dài)碼都有(yǒu)信(xìn)号(hào)c,说(shuō)明(míng)这(zhè)两(liǎng)段(duàn)代(dài)碼是(shì)相連(lián)的(de),利用(yòng)硬(yìng)件(jiàn)連(lián)接起来(lái)可(kě)以(yǐ)變(biàn)成(chéng)如(rú)下(xià)图(tú)所(suǒ)示的(de)電(diàn)路(lù)。
由(yóu)此(cǐ)可(kě)見(jiàn),下(xià)面(miàn)两(liǎng)段(duàn)代(dài)碼所(suǒ)对(duì)應(yìng)的(de)硬(yìng)件(jiàn)電(diàn)路(lù)是(shì)一(yī)模一(yī)樣(yàng)的(de)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
q <= 0;
end
else begin
q <= c;
end
end
always @(*)begin
c = a + d;
end
|
|
|
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
q <= 0;
end
else begin
q <= a + d;
end
end
|
有(yǒu)的(de)读(dú)者(zhě)也(yě)许会(huì)問(wèn):这(zhè)两(liǎng)種(zhǒng)代(dài)碼哪一(yī)種(zhǒng)比較好(hǎo)呢?答(dá)案(àn)是(shì)这(zhè)两(liǎng)段(duàn)代(dài)碼并无區(qū)别,因(yīn)为(wèi)两(liǎng)者(zhě)的(de)硬(yìng)件(jiàn)是(shì)相同(tóng)的(de)。由(yóu)此(cǐ)也(yě)可(kě)以(yǐ)得知評估verilog代(dài)碼好(hǎo)壞的(de)最(zuì)基本(běn)标(biāo)準,即不(bù)是(shì)看(kàn)代(dài)碼行數而(ér)是(shì)看(kàn)硬(yìng)件(jiàn)。