加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

從電路到Verilog | Verilog不難學(xué),聊聊時(shí)序邏輯那些事兒

2016/07/26
46
  • 1評(píng)論
閱讀需 53 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

?

施主們辛苦了,學(xué)習(xí)語(yǔ)言一貫是一個(gè)苦差事。學(xué) Verilog 還算好的,到底還是人工語(yǔ)言,有規(guī)律,還有《數(shù)字電子技術(shù)》這門(mén)課墊底(沒(méi)學(xué)好這門(mén)功課的同學(xué) ---- 學(xué)好與否,與您老的考試成績(jī)無(wú)關(guān) ---- 趕快回去找本教材好好看看)。如果是學(xué)習(xí)自然語(yǔ)言,那就更麻煩了。除了記憶還是記憶,這就是學(xué)習(xí)的規(guī)律,沒(méi)有捷徑的。


前面講解了組合邏輯的事情,從今天起老衲來(lái)說(shuō)說(shuō)時(shí)序邏輯的端倪。


數(shù)字電路理論中,時(shí)序邏輯電路是指電路任何時(shí)刻的穩(wěn)態(tài)輸出不僅取決于當(dāng)前的輸入,還與前一時(shí)刻輸入形成的狀態(tài)有關(guān)。 這跟組合邏輯電路相反,組合邏輯的輸出只會(huì)跟目前的輸入成一種函數(shù)關(guān)系。 換句話說(shuō),時(shí)序邏輯擁有儲(chǔ)存器件(內(nèi)存)來(lái)存儲(chǔ)信息,而組合邏輯則沒(méi)有。換句話說(shuō),是否存在存儲(chǔ)器件是判斷一個(gè)電路是否是時(shí)序邏輯電路的關(guān)鍵。


時(shí)序邏輯按照其中信號(hào)變化的時(shí)機(jī),又分為同步時(shí)序和異步時(shí)序兩種。


同步電路是一種由定時(shí)器產(chǎn)生的時(shí)鐘信號(hào)驅(qū)動(dòng)的電路。在一個(gè)同步電路中,它的各個(gè)期間中,邏輯信號(hào)的每一個(gè)變化都是同時(shí)的。所有信號(hào)變化都服從一個(gè)特別的同步信號(hào),稱為“時(shí)鐘”。不管邏輯的規(guī)模有多大,都假設(shè)對(duì)于時(shí)鐘信號(hào)而言,其他邏輯部分的變化的時(shí)延是微小的。所以,整個(gè)電路的行為 -- 無(wú)論任何一個(gè)信號(hào)—都可以在任何速度上精確地被預(yù)見(jiàn)。在實(shí)際電路中,時(shí)鐘源到達(dá)各個(gè)觸發(fā)器的網(wǎng)線長(zhǎng)度不同,因此需要使用時(shí)鐘緩存單元來(lái)盡量降低時(shí)鐘偏移的影響。


異步電路邏輯更加體現(xiàn)邏輯的本質(zhì),但是由于它的彈性關(guān)系,其也是設(shè)計(jì)上困難度最高的。 最基本的儲(chǔ)存組件是鎖存器。 鎖存器可以在任何時(shí)間改變它的狀態(tài),依照其他的鎖存器信號(hào)的變動(dòng),他們新的狀態(tài)就會(huì)被產(chǎn)生出來(lái)。 異步電路的復(fù)雜度隨著邏輯級(jí)數(shù)的增加,而復(fù)雜性也快速的增加,因此他們大部分僅僅使用在小的應(yīng)用。


在一般的設(shè)計(jì)中,會(huì)采用同步電路進(jìn)行設(shè)計(jì)。這是方便分析和設(shè)計(jì)的要求,一般設(shè)計(jì)人員的大腦只能把握這樣的范圍了。在自己可以控制的范圍內(nèi)設(shè)計(jì),這是一個(gè)行之有效的策略。


很多情況下,目前大規(guī)模的數(shù)字電路系統(tǒng)里面,對(duì)應(yīng)不同功能部分,可能存在多個(gè)時(shí)鐘。但是,每一個(gè)部分一般由一個(gè)時(shí)鐘驅(qū)動(dòng),這個(gè)范圍內(nèi)可以視為同步電路。但是,因?yàn)椴煌瑫r(shí)鐘的頻率與相位的差別,不同部分之間的信號(hào)有無(wú)法滿足“邏輯信號(hào)的每一個(gè)變化都是同時(shí)”的要求。這是一種特殊的,但是常用的異步電路邏輯。對(duì)于這種電路后文書(shū)將會(huì)詳細(xì)介紹,但是這種電路的分析過(guò)程倒是更類(lèi)似于同步邏輯。


1. 時(shí)鐘啟動(dòng),節(jié)拍控制
在時(shí)序電路里面,再?gòu)?qiáng)調(diào)時(shí)鐘的作用也不為過(guò)的。一般而言,在一個(gè)系統(tǒng)里面只會(huì)采用一種類(lèi)型的器件。這樣設(shè)計(jì)起來(lái)簡(jiǎn)單,而且不會(huì)存在不能實(shí)現(xiàn)的情況。最常用的器件呢,就算是 D 觸發(fā)器了。這個(gè)器件使用起來(lái),類(lèi)似于對(duì)于信號(hào)的采樣,最簡(jiǎn)單不過(guò)。
D 觸發(fā)器的電氣符號(hào)里面,一般常用的有三組輸入信號(hào):數(shù)據(jù)輸入 D、復(fù)位 / 初值輸入 S 和 R 以及時(shí)鐘信號(hào) CLK。忽略掉復(fù)位 / 初值輸入 S 和 R 的影響,D 觸發(fā)器的真值表如表 1。其中,Qnext 為下一個(gè)有效時(shí)鐘沿的 Q 的值。從信號(hào)處理的角度,可以將 D 觸發(fā)器理解為在時(shí)鐘有效沿對(duì)于輸入采樣,并且延遲一個(gè)時(shí)鐘節(jié)拍輸出的單元。D 觸發(fā)器的時(shí)序圖如圖 1 所示。


表 1 D 觸發(fā)器的真值表

D

CLK

Q

Qnext

0

x

0

1

x

1

x

0/1

0

0

x

0/1

1

1


圖 1 D 觸發(fā)器的時(shí)序圖


正因?yàn)?D 觸發(fā)器有延時(shí)的作用,有時(shí)候?yàn)榱艘恍┫嚓P(guān)的數(shù)據(jù)到達(dá)時(shí)間對(duì)齊,會(huì)使用 D 觸發(fā)器對(duì)一些先到達(dá)的數(shù)據(jù)的延時(shí)操作。注意,D 觸發(fā)器能夠完成的時(shí)延一定是時(shí)鐘周期的整數(shù)倍。這個(gè)時(shí)候,工程上經(jīng)常說(shuō)的術(shù)語(yǔ)是“打 X 拍子”,X 是一個(gè)整數(shù)。這個(gè)嚴(yán)格來(lái)說(shuō)就是延遲 X 個(gè)時(shí)鐘周期的意思。打一拍子就用一個(gè) D 觸發(fā)器,打兩拍子就用兩個(gè) D 觸發(fā)器串聯(lián),以此類(lèi)推。打多個(gè)拍子的代碼實(shí)現(xiàn)方法,會(huì)在下一講中介紹,這里僅僅給大伙兒建立一個(gè)概念。

?


作為一個(gè)簡(jiǎn)單的例子,老衲推薦計(jì)數(shù)器。計(jì)數(shù)器,很多人見(jiàn)過(guò):大家坐飛機(jī)的時(shí)候,進(jìn)門(mén)前,空姐手里拿的,見(jiàn)一個(gè)人“咯嗒”按一下,上面的數(shù)字加一。這個(gè)計(jì)數(shù)器,用來(lái)統(tǒng)計(jì)最終進(jìn)入飛機(jī)的人數(shù)的,以備后用(某家就不再多說(shuō)了,不能烏鴉嘴。方丈告誡我:嘴下留德,勝造七級(jí)浮屠)。這里的計(jì)數(shù)器,功能和空姐手里的差不多,只不過(guò)她那是機(jī)械的,這里的是電子的。她那里的按鍵,在這里是使能信號(hào)“enable”。計(jì)數(shù)器的結(jié)構(gòu)如圖 2 所示,其中加入了溢出保護(hù)機(jī)制。其代碼如例 1,其中給出了帶溢出保護(hù)和不帶溢出保護(hù)的兩套代碼。

圖 2 計(jì)數(shù)器的結(jié)構(gòu)圖


上圖中沒(méi)有給出時(shí)鐘 CLK 和復(fù)位 RST 信號(hào)的處理,這是一般時(shí)序邏輯結(jié)構(gòu)圖的慣例。這兩個(gè)信號(hào)的處理太一般了,所以被偷懶地省略了。


【例 1】計(jì)數(shù)器代碼

無(wú)溢出保護(hù)

具有溢出保護(hù)

module counter

? (

??? input CLK, input RST,

??? input enable,

??? output reg[7:0] counter,

? );

//Load other module(s)

//Definition for Variables in the module

//Logical

always @(posedge CLK, negedge RST)

begin

??? if (!RST)

??? //Reset

??? begin

?????? counter <= 8'h00;

??? end

??? else if(enable)

??? //Counter enabled

??? begin

??? ????counter <= ??counter + 8'h001;

end

else

begin

end

end

endmodule

module counter

? (

??? input CLK, input RST,

??? input enable,

??? output reg[7:0] counter,

? ??output reg overflow_flag

? );

//Load other module(s)

//Definition for Variables in the module

//Logical

always @(posedge CLK, negedge RST)

begin

??? if (!RST)

??? //Reset

??? begin

?????? {overflow_flag, counter} <= 9'h000;

??? end

??? else if (overflow_flag)

??? //Over flew and reset

??? begin

??????? {overflow_flag, counter} <= 9'h000;

??? end

??? else if(enable)

??? //Counter enabled

??? begin

??? {overflow_flag, counter} <= {overflow_flag, counter} + 9'h001;

end

else

begin

end

end

endmodule


不具有溢出保護(hù)的功能的計(jì)數(shù)器,在實(shí)際工程中是有問(wèn)題的。就按例子中 8 比特寬度的計(jì)數(shù)寬度為例,其最大計(jì)數(shù)值是 255。如果來(lái)了 256 個(gè)乘客,沒(méi)有溢出保護(hù)的代碼會(huì)顯示計(jì)數(shù)值為 0,這顯然會(huì)帶來(lái)誤解。


還有代碼中利用了組合操作“{ }”來(lái)簡(jiǎn)化的書(shū)寫(xiě),也請(qǐng)讀者注意這個(gè)技巧。

?


2. 循環(huán)串接,鏈狀傳遞
最簡(jiǎn)單的 D 觸發(fā)器組成的電路是什么?那一定是只有一個(gè) D 觸發(fā)器的、延遲一個(gè)時(shí)鐘節(jié)拍的電路了。這個(gè)老和尚上一講已經(jīng)介紹了,現(xiàn)在貧道在深入一步?!吧陨噪y一點(diǎn)的電路是什么呢?”參考圖 3.1 里面的一般化的數(shù)字邏輯系統(tǒng)架構(gòu),去掉各種組合邏輯之后,就是一個(gè)非常單調(diào)的、也是很簡(jiǎn)單的 D 觸發(fā)器鏈了。聰明!這就是這一節(jié)給大家介紹的第一種千層面:只有面。


這樣的一個(gè) D 觸發(fā)器鏈,在信號(hào)處理上也叫作延時(shí)鏈,結(jié)構(gòu)如圖 3 所示。


圖 3 延時(shí)鏈的結(jié)構(gòu)


大家會(huì)發(fā)現(xiàn)只是 4 個(gè) D 觸發(fā)器的例子,代碼已經(jīng)很長(zhǎng)了。那么如果是很多 D 觸發(fā)器呢,例如 16 個(gè) D 觸發(fā)器或者 32 個(gè) D 觸發(fā)器,那不就成了累傻孩子的活計(jì)了嗎?這里就要介紹唯一可以被綜合成電路的循環(huán)了:常數(shù)循環(huán)次數(shù)的 for 循環(huán)。


關(guān)鍵詞 for 的一般形式是:
for (variable = start_value; end_condition; circle_express)
begin
??? operations
end


其中,variable 是一個(gè)變量名;start_vlue 是變量的初始值;end_condition 是循環(huán)的條件;circle_expree 是每個(gè)循環(huán)的步進(jìn)操作;operations 是每次循環(huán)的操作。要想這個(gè)循環(huán)能被綜合,for 的循環(huán)次數(shù)必須確定,。捎帶說(shuō)明一下,最常見(jiàn)的是第一行的形式。


例 2 里面給出了 4 級(jí)觸發(fā)器鏈用 for 實(shí)現(xiàn)的代碼。只要改變里面的常數(shù),就是 1024 級(jí) D 觸發(fā)器鏈也不難實(shí)現(xiàn)。


【例 2】4 級(jí) D 觸發(fā)器鏈的 for 實(shí)現(xiàn)
module DFF_link_4_for
? (
??? input CLK, input RST,
??? input input_data,
??? output output_data
? );
?
//Load other module(s)

//Definition for Variables in the module
reg dff[3:0];
integer loop;

//Logical
assign output_data = dff[3];

always @(posedge CLK, negedge RST)
begin
??? if (!RST)
??? //Reset
??? begin
?????? for (loop = 0; loop <= 3; loop = loop + 1)
?????? begin
??????? dff[loop] <= 1'b0;
?????? end
??? end
??? else
??? begin
??? dff[0]<= input_data;
??? for (loop = 1; loop <= 3; loop = loop + 1)
??? begin
??????? dff[loop] <= dff[loop - 1];
???? end
??? end
end

endmodule


看到這里,很多人會(huì)把 Verilog 里面的 for 和其他程序語(yǔ)言里面的 for 混淆掉。這是一個(gè)十分嚴(yán)重的錯(cuò)誤。循環(huán)變量在電路的哪里體現(xiàn)呢?任憑您老“眼睛瞪的像銅鈴”,也找不到半分 loop 的影子吧?實(shí)話告訴您,這個(gè)循環(huán)變量是在綜合里面起作用的,告訴綜合軟件要重復(fù)幾遍 for 里面的操作。


如果大伙兒覺(jué)得一串 D 觸發(fā)器只能做個(gè)時(shí)延玩玩,那就錯(cuò)了。這里貧道給諸位一個(gè)例子:不用 RAM 來(lái)存儲(chǔ)一組數(shù)據(jù)。當(dāng)然了,這個(gè)存儲(chǔ)也是有代價(jià)的。數(shù)據(jù)不能像 RAM 一樣隨機(jī)讀寫(xiě),只能按照一定的時(shí)序讀取。

?


3. 各取所長(zhǎng),分工合作
完成一個(gè)組合邏輯的操作,會(huì)有時(shí)延嗎?這里的時(shí)延是指從輸入信號(hào)穩(wěn)定到獲得正確結(jié)果的時(shí)間間隔。對(duì)于行為仿真,宗師和黨魁說(shuō)的沒(méi)錯(cuò),還真是沒(méi)有時(shí)延的。但是到了時(shí)序仿真這里,就老母雞變鴨了,結(jié)果里面明明白白地出現(xiàn)了時(shí)延。有時(shí)延倒是叫一般人感覺(jué)靠譜一點(diǎn):天下沒(méi)有免費(fèi)的午餐。這個(gè)時(shí)延包含兩個(gè)部分,也就是前文書(shū)說(shuō)的可以優(yōu)化的兩個(gè)部分:降低布局布線造成的時(shí)延(DW)或者降低組合邏輯的時(shí)延(DC)。叫大伙兒建立一個(gè)概念:做任何事情都是要代價(jià)的,這才是天道。


回憶一下數(shù)電課程里面介紹過(guò)的 4 比特加法器鏈。假設(shè):每個(gè) 1 比特的加法環(huán)節(jié)需要的處理時(shí)間是 5 ns(當(dāng)然,實(shí)際電路如果這么慢,估計(jì)老夫敲一個(gè)字母計(jì)算機(jī)都要等上一分鐘來(lái)處理了。這個(gè)雖然不符合實(shí)際,但是計(jì)算方便啊。大伙兒就別抬杠了。)。那么,4 個(gè) 1 比特加法器環(huán)節(jié),一個(gè) 4 比特加法器的處理時(shí)間應(yīng)該是 20 ns 了。換句話說(shuō),在 20 ns 里面如果輸入輸出有變化,那么結(jié)果肯定有問(wèn)題。再換句話說(shuō),這個(gè) 4 比特加法器允許輸入數(shù)據(jù)的變化周期大于 20 ns,對(duì)應(yīng)最高的數(shù)據(jù)變化頻率為 50 MHz。注意這里還都是組合邏輯,不存在時(shí)鐘和時(shí)鐘頻率的概念。


如何能夠加快數(shù)據(jù)變化的頻率呢?


首先,“偷工減料”是不可取的。這位說(shuō):4 比特加法器是 50 MHz,那么 2 比特加法器就提高到 100 MHz 了。話是沒(méi)錯(cuò),但是這個(gè)比特位寬的減少,卻不是您老說(shuō)了算的。這個(gè)是一對(duì)算法什么的工程師計(jì)算、仿真的結(jié)果,減少了系統(tǒng)性能肯定受影響。


其次,“忍經(jīng)”在這里唱不得。這位又說(shuō)了:50 MHz 也不慢了,忍了吧。這話也沒(méi)錯(cuò),但是系統(tǒng)的數(shù)據(jù)輸入速度,是依賴于外部要求的,也不能變。


最后,依賴于模塊結(jié)構(gòu)的變化以及時(shí)序控制的引入,可以解決這個(gè)問(wèn)題?,F(xiàn)在我們就開(kāi)始這個(gè)過(guò)程。這里會(huì)很詳細(xì)的介紹設(shè)計(jì)過(guò)程,啰嗦是啰嗦了一點(diǎn),但是利于大伙兒把握和以后舉一反三。忍了吧!


忽略全加器半加器的區(qū)別,圖里面一共有四個(gè)一樣的 1 比特加法單元。一個(gè)簡(jiǎn)單、實(shí)用的想法是把這些加法器都隔離開(kāi),這樣每次運(yùn)算的時(shí)間就是 5 ns 了。那么自然而然的問(wèn)題來(lái)了:用什么器件來(lái)隔離呢?又是一個(gè)簡(jiǎn)單、實(shí)用的想法:D 觸發(fā)器。這個(gè)就是基本的思路了。這就是所謂流水線的思想了。


To be continued!


后面內(nèi)容更加精彩,大伙兒明晚早來(lái)占位!

與非網(wǎng)原創(chuàng)內(nèi)容,謝絕轉(zhuǎn)載!

系列匯總:

之一:溫故而知新:從電路里來(lái),到 Verilog 里去!

之二:Verilog 編程無(wú)法一蹴而就,語(yǔ)言層次講究“名正則言順”

之三:數(shù)字邏輯不容小窺,電路門(mén)一統(tǒng)江湖

之四:Verilog 語(yǔ)言:還真的是人格分裂的語(yǔ)言

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

本名:吳濤,通信專(zhuān)業(yè)博士,畢業(yè)后十多年從事無(wú)線通訊產(chǎn)品的研發(fā)工作。了解W-CDMA、TDS-CDMA和LTE的標(biāo)準(zhǔn)協(xié)議、接收機(jī)算法以及系統(tǒng)架構(gòu)和開(kāi)發(fā)。從事過(guò)關(guān)于W-CDMA的FPGA IP core設(shè)計(jì)工作,也完成過(guò)W-CDMA和TDS-CDMA的接收機(jī)理論研究和鏈路仿真工作。綜合上面的工作,最終選擇了無(wú)線通訊的系統(tǒng)設(shè)計(jì)和標(biāo)準(zhǔn)設(shè)計(jì)工作。目前擁有100多個(gè)已授權(quán)的發(fā)明專(zhuān)利,是某通訊行業(yè)標(biāo)準(zhǔn)文件的第一作者,亦有專(zhuān)利思想被寫(xiě)入3GPP協(xié)議。已出版FPGA設(shè)計(jì)專(zhuān)業(yè)著作《IP核芯志-數(shù)字邏輯設(shè)計(jì)思想》和《Verilog傳奇-從電路出發(fā)的HDL代碼設(shè)計(jì)》。