摘要:本文是對實(shí)驗(yàn)課上講解的面向硬件電路的設(shè)計(jì)思維的總結(jié),結(jié)合數(shù)字邏輯課本,進(jìn)行提煉和整理??梢娮枞x值描述時(shí)序電路有風(fēng)險(xiǎn)。
本文是對實(shí)驗(yàn)課上講解的“面向硬件電路的設(shè)計(jì)思維”的總結(jié),結(jié)合數(shù)字邏輯課本,進(jìn)行提煉和整理。
主要來源是課件與本人整理,部分參考了網(wǎng)絡(luò)大佬的博客。
本文主要介紹不同于之前軟件設(shè)計(jì)思維的硬件設(shè)計(jì)思維,從非阻塞賦值、并行、面積速度轉(zhuǎn)換、同步電路設(shè)計(jì)原則、模塊劃分設(shè)計(jì)、if-case對比等方面進(jìn)行整理。
內(nèi)容太多,我整理了好幾天,在浩如煙海的網(wǎng)絡(luò)前有點(diǎn)無力,想想是自己的實(shí)踐不夠,有一些問題沒有親身體驗(yàn);也不能一蹴而就,得久久為功。所以這篇文章就當(dāng)作一個(gè)Verilog學(xué)習(xí)與FPGA設(shè)計(jì)的總述性文章,后續(xù)繼續(xù)學(xué)習(xí)我會加深對這些知識的理解。
回憶一下課本上的相關(guān)內(nèi)容。
阻塞賦值:
"="
Verilog編譯器按照這些語句在always塊中的先后順序依次執(zhí)行。
如果一個(gè)變量通過阻塞賦值語句賦值,則這個(gè)新賦的值會在這個(gè)block中的后續(xù)語句中使用。
相當(dāng)于串行
非阻塞賦值:
"<="
always塊中所有非阻塞賦值的語句在求值時(shí)所用的值是最初進(jìn)入always時(shí)各個(gè)變量已經(jīng)具有的值。
換一個(gè)角度講,"<="左側(cè)的被賦值變量,只在always結(jié)束時(shí)統(tǒng)一被更新。
相當(dāng)于并行
先來看一看這段代碼:
1 module example5_5 (x1, x2, x3, Clock, f, g);2 input x1, x2, x3, Clock;3 output reg f, g;4 always @(posedgeClock)5 begin6 f=x1 & x2;7 g=f | x3;8end9endmodule
可以看到關(guān)鍵點(diǎn)是g的表達(dá)式,由于是阻塞賦值,所以相當(dāng)于:
g=(x1 & x2) | x3;
綜合出的電路如圖:
1 module example5_6 (x1, x2, x3, Clock, f, g);2 input x1, x2, x3, Clock;3 output reg f, g;4 always @(posedge Clock)5 begin6 f <=x1 &x2;7 g <=f | x3;8 end9 endmodule
這個(gè)區(qū)別之處就在于這個(gè)g,是x3與前一個(gè) f 進(jìn)行"|"運(yùn)算。
將阻塞賦值的示例代碼中的兩個(gè)執(zhí)行語句互換位置,會發(fā)生什么情況?
可以料見影響比較大。
可見阻塞賦值描述時(shí)序電路有風(fēng)險(xiǎn)。
相反的,如果我們要實(shí)現(xiàn) f=a1a0 + a2a1這樣一個(gè)函數(shù);
1 always @(A)2 begin3 f=A[1] & A[0];4 f=f | (A[2] & A[1]);5 end
1 always @(A)2 begin3 f <=A[1] & A[0];4 f <=f | (A[2] & A[1]);5 end
可見這段代碼有兩個(gè)特征;
非阻塞賦值的結(jié)果在always結(jié)束后才可以看到
多次賦值時(shí),后覆蓋前。
這兩個(gè)特征使得第二個(gè)f語句出現(xiàn)問題,因?yàn)榈诙€(gè)語句
f <=f | (A[2] & A[1]);
右側(cè)的f的值是不可見的。
對組合邏輯建模采用阻塞賦值
對時(shí)序邏輯建模采用非阻塞賦值
用多個(gè)always塊分別對組合和時(shí)序邏輯建模
盡量不要在一個(gè)always塊里面混合使用阻塞賦值和非阻塞賦值。如果在同一個(gè)塊即為組合邏輯又為時(shí)序邏輯,應(yīng)使用“非阻塞賦值”
這里給的例子沒怎么看懂。自己查了一下。
先說結(jié)論:
各個(gè)always塊是并行執(zhí)行的,
always塊和initial塊之間是并行執(zhí)行的,
begin-end塊內(nèi)是順序執(zhí)行的,
但是非阻塞賦值(<=)是并行執(zhí)行的,阻塞賦值(=)是順序執(zhí)行的,這條優(yōu)先。且硬件思想的集中體現(xiàn)就是前面提到過的非阻塞賦值帶來的并行執(zhí)行語句。
再回去看例子:
1 module test ( clk, reset, a, b ); 2 input clk; 3 input reset; 4 input [3:0 ] a; 5 output [ 3:0 ] b; 6 7 reg [ 3:0] tempa1, tempa2, b; 8 9 always @ ( posedge clk ) begin10 if ( ! reset ) begin11 tempa1<=0;12tempa2<=0;13 b<=0;14 end15 elsebegin16 tempa1<=a + 1’b1;17tempa2<=tempa1 + 1’b1;18 b<=tempa2 + 1’b1;19 end20 end21 endmodule
可以料見實(shí)現(xiàn)的電路:
下面借鑒了這篇文章
波形圖:
可以看到強(qiáng)調(diào)的還是上面說過的非阻塞賦值的特點(diǎn)。
實(shí)驗(yàn)任務(wù)里總有這么一句:“用可綜合的代碼......”
什么是可綜合性,什么又是不可綜合性呢?
下面學(xué)習(xí)了這篇文章
這篇文章講的挺多,但是我現(xiàn)在這個(gè)RTL級還沒搞明白的菜鳥用不到這么多,基本篩選如下:
不可綜合的Verilog語句:
initial
只能在test bench中使用,不能綜合。
assign 和deassign
不支持對reg 數(shù)據(jù)類型的assign或deassign進(jìn)行綜合,支持對wire數(shù)據(jù)類型的assign或deassign進(jìn)行綜合。
fork join 不可綜合,可以使用非塊語句達(dá)到同樣的效果。
這個(gè)塊是并行執(zhí)行的,但是不可綜合。
敏感列表里同時(shí)帶有posedge和negedge 如:(現(xiàn)在也碰不到
1 always@(posedge clk or negedge clk) 2 begin3 ...4 end
這里我們說的面積:設(shè)計(jì)所占用的FPGA邏輯資源數(shù)目,一般用所消耗的觸發(fā)器和查找表(還沒學(xué))來衡量。
速度:是指在芯片上可以穩(wěn)定運(yùn)行時(shí)能達(dá)到的最高頻率
兩者性能上的調(diào)配方法:
模塊復(fù)用
串并變換
可以看到這種串并轉(zhuǎn)換,用更大的面積(即多個(gè)子模塊并行),達(dá)到高頻率的效果。這一點(diǎn)后面還會再提到。
流水線
同步設(shè)計(jì)的優(yōu)點(diǎn):
可以有效避免毛刺的影響,提高設(shè)計(jì)的可靠性
可以簡化時(shí)序分析過程
可以減少工作環(huán)境對設(shè)計(jì)的影響
設(shè)計(jì)原則:
(由于應(yīng)用還不多,對這些體會還不深刻,簡單記錄:
單時(shí)鐘
全局時(shí)鐘網(wǎng)絡(luò)的時(shí)鐘是性能最優(yōu),最便于預(yù)測的時(shí)鐘,具有最強(qiáng)的驅(qū)動能力
單時(shí)鐘沿
混合時(shí)鐘會使時(shí)序分析復(fù)雜、電路工作頻率降低
避免使用門控時(shí)鐘
即時(shí)鐘不要與組合邏輯再進(jìn)行組合,如下:
可能引起毛刺、偏移
在模塊內(nèi)部不要再產(chǎn)生時(shí)鐘了。
這有點(diǎn)像C++的封裝。
上一層模塊只負(fù)責(zé)下一層模塊的依據(jù)(即原材料),而具體行為互不相關(guān)。
這樣就保證了各個(gè)模塊的相對獨(dú)立性和內(nèi)部結(jié)構(gòu)的合理性,便于維護(hù),也使得相同邏輯可以復(fù)用同一模塊。
在設(shè)計(jì)時(shí),應(yīng)盡量將模塊中的同步時(shí)序邏輯輸出信號以寄存器的形式送出,以便于綜合工具區(qū)分時(shí)序和組合邏輯;
并且時(shí)序輸出的寄存器應(yīng)符合流水線設(shè)計(jì)思路,能工作在更高的頻率,以極大地提高模塊吞吐量。
流水線設(shè)計(jì)思路是什么?
就是將組合邏輯系統(tǒng)地分割,并在各個(gè)部分(分級)之間插入寄存器,并暫存中間數(shù)據(jù)的方法。 目的是將一個(gè)大操作分解成若干的小操作,每一步小操作的時(shí)間較小,所以能提高頻率,各小操作能并行執(zhí)行,所以能提高數(shù)據(jù)吞吐率(提高處理速度)。
對于我這個(gè)初學(xué)者來說,邏輯復(fù)用和邏輯復(fù)制十分相似,了解后就知道確實(shí)不同,主要是涉及性能衡量尺度:速度和面積的統(tǒng)籌。
邏輯復(fù)用是通過提高工作頻率來節(jié)省面積的優(yōu)化方法,經(jīng)常用于存在多個(gè)資源可共享單元的設(shè)計(jì)中。
PS:相當(dāng)于為了節(jié)省人力,而讓一個(gè)人干三個(gè)人的活。
10MHZ乘法器
兩個(gè)5MHZ乘法器
邏輯復(fù)制——面積換速度
邏輯復(fù)用是通過增加面積而改善設(shè)計(jì)時(shí)序的優(yōu)化方法,經(jīng)常用于調(diào)整信號的扇出。
舉例就類似于上面的面積換速度
鏈狀結(jié)構(gòu)
樹狀結(jié)構(gòu)
If語句指定了一個(gè)有優(yōu)先級的編碼邏輯,
而case語句生成的邏輯是并行的,不具有優(yōu)先級。
這里的if的優(yōu)先級就引起一些其他問題:
1 always@(in0,in1,in2,in3) 2 begin 3 sel=2’b00 ; 4 if(in0) sel=2’b00 ; 5 else if(in1) sel=2’b01 ; 6 elseif(in2) sel=2’b10 ; 7 else if(in3) sel=2’b11 ; 8end 9//當(dāng)這里in0和in1都==1時(shí),se1=2b00而不是2b01;10 //這就是if-else的優(yōu)先邏輯。
而case是并行的,沒有優(yōu)先級。
if語句可以包含一系列的表達(dá)式;/有時(shí)甚至一個(gè)else就可以是一個(gè)二路選擇器。
而case語句比較的是一個(gè)公共的控制表達(dá)式。整個(gè)語句塊一起構(gòu)成了一個(gè)多路選擇器。
這個(gè)很好理解。
通常if-else結(jié)構(gòu)速度較慢,但占用的面積??;
case語句結(jié)構(gòu)速度較快,但占用的面積較大。
嵌套的if語句如果使用不當(dāng),就會導(dǎo)致設(shè)計(jì)的更長延時(shí)。
如果想利用if語句來實(shí)現(xiàn)那些對延時(shí)要求苛刻的路徑,應(yīng)將最高優(yōu)先級給最遲到達(dá)的關(guān)鍵信號。(最小生成樹思想)。
有時(shí)為了兼顧面積和速度,可以將if和case語句合用。
1 //if-else實(shí)現(xiàn)四選一 2 module sdata_if (clk, reset, x, s, y); 3 input clk; 4 input reset; 5 input[3:0] x; 6 input [1:0] s; 7 output y; 8 9 reg y;10 always@(posedge clk)begin11 if(!reset)begin12 y<=0;13 end14 else begin15 if(s==2b00)16 y<=x[0];17 else if (s==2b01)18 y<=x[1];19 else if (s==2b10)20 y<=x[2];21 else 22 y<=x[3];23 end24 end25 endmodule
想象一下是什么電路?
就是一個(gè)四選一,需要兩位的控制信號,這個(gè)控制信號就正好是s。
1 //case語句 2module sdata_if (clk, reset, x, s, y); 3 input clk; 4 input reset; 5 input[3:0] x; 6 input [1:0] s; 7 output y; 8 9 reg y;10 always@(posedge clk)begin11 if(!reset)begin12 y<=0;13 end14 else begin15 case(s)16 2b00: y<=x[0];17 2b01: y<=x[1];18 2b10: y<=x[2];19 2b11: y<=x[3];20 end21 end22 endmodule2324
實(shí)現(xiàn)電路也是類似上面的電路。
鎖存器在課本里學(xué)過,是用于存儲一位數(shù)據(jù)的元件,電平觸發(fā)。
其特點(diǎn)是:鎖存器在不鎖存數(shù)據(jù)時(shí),輸出隨輸入變化;但一旦數(shù)據(jù)鎖存時(shí),輸入對輸出不產(chǎn)生任何影響。
而我們在設(shè)計(jì)電路時(shí),應(yīng)該避免無意之間產(chǎn)生這種鎖存器,否則會導(dǎo)致一些邏輯上的錯(cuò)誤。
引起意外鎖存器的原因
翻閱了很多網(wǎng)上的總結(jié)。有一些規(guī)則比較復(fù)雜,考慮到我現(xiàn)在的水平,我只記錄對初入門水平夠用且好理解的方面。后續(xù)繼續(xù)學(xué)習(xí)可以深入了解更多。
if……else……結(jié)構(gòu)中缺少else
case結(jié)構(gòu)中的分支沒有包含所有情況且沒有default語句。
如果使用if語句,最好寫上else分支;
如果使用case語句,最好寫上default語句。
即使需要鎖存器,也通過else分支或default分支來顯式說明。而不要利用語言特性觸發(fā)生成(因?yàn)椴豢煽兀?/p>
內(nèi)容真的好多,一時(shí)間難以完全消化...
上傳于2021年11月25日23時(shí)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125363.html
摘要:將經(jīng)過仿真的設(shè)計(jì)下載到硬件實(shí)驗(yàn)箱進(jìn)行驗(yàn)證。流水燈控制電路仿真如圖所示實(shí)驗(yàn)引腳鎖定八個(gè)按鍵按鍵分別對應(yīng)上的引腳。 一、實(shí)驗(yàn)?zāi)康?(1)學(xué)習(xí)并掌握Quartus II的...
摘要:本章我們將使用高速芯片實(shí)現(xiàn)數(shù)模轉(zhuǎn)換,產(chǎn)生正弦波模擬電壓信號。實(shí)驗(yàn)任務(wù)本節(jié)實(shí)驗(yàn)任務(wù)是使用新起點(diǎn)開發(fā)板及雙路高速擴(kuò)展模塊模塊實(shí)現(xiàn)數(shù)模轉(zhuǎn)換。下載驗(yàn)證將雙路高速模塊插入新起點(diǎn)開發(fā)板的擴(kuò)展口,連接時(shí)注意擴(kuò)展口電源引腳方向和開發(fā)板電源引腳方向一致。 ...
摘要:本文就關(guān)于電子元件國產(chǎn)化的一些交流內(nèi)容進(jìn)行介紹。一些重要的工業(yè)領(lǐng)域的國產(chǎn)化要求越來越高,也會對高端的需求增加。 前幾天發(fā)表的工業(yè)控制領(lǐng)域電子元件全國產(chǎn)化替代解讀文章也有一些關(guān)注與討論,這個(gè)文章有人說是軟文,想想也像是軟文,不過里邊提到的任一個(gè)廠家都沒有給贊助,也是很無奈。文章主要目的是把我接...
摘要:為了應(yīng)對計(jì)算多元化的需求,越來越多的場景開始引入等硬件進(jìn)行加速,異構(gòu)計(jì)算應(yīng)運(yùn)而生。眾所周知,意味著對計(jì)算力的超高要求,目前以為代表的異構(gòu)計(jì)算已成為加速創(chuàng)新的新一代計(jì)算架構(gòu)。目前異構(gòu)計(jì)算使用最多的是利用來加速。在互聯(lián)網(wǎng)行業(yè),隨著信息化的普及,數(shù)據(jù)量的暴增使得人們對存儲空間又有了新要求,同時(shí),機(jī)器學(xué)習(xí)、人工智能、無人駕駛、工業(yè)仿真等領(lǐng)域的崛起,使得通用CPU在處理海量計(jì)算、海量數(shù)據(jù)/圖片時(shí)遇到越...
閱讀 740·2023-04-25 19:43
閱讀 3986·2021-11-30 14:52
閱讀 3816·2021-11-30 14:52
閱讀 3873·2021-11-29 11:00
閱讀 3809·2021-11-29 11:00
閱讀 3907·2021-11-29 11:00
閱讀 3584·2021-11-29 11:00
閱讀 6197·2021-11-29 11:00