国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

數(shù)字邏輯實踐4->面向硬件電路的設(shè)計思維--FPGA設(shè)計總述

番茄西紅柿 / 3279人閱讀

摘要:本文是對實驗課上講解的面向硬件電路的設(shè)計思維的總結(jié),結(jié)合數(shù)字邏輯課本,進行提煉和整理。可見阻塞賦值描述時序電路有風(fēng)險。

本文是對實驗課上講解的“面向硬件電路的設(shè)計思維”的總結(jié),結(jié)合數(shù)字邏輯課本,進行提煉和整理。

主要來源是課件與本人整理,部分參考了網(wǎng)絡(luò)大佬的博客。

本文主要介紹不同于之前軟件設(shè)計思維的硬件設(shè)計思維,從非阻塞賦值、并行、面積速度轉(zhuǎn)換、同步電路設(shè)計原則、模塊劃分設(shè)計、if-case對比等方面進行整理。

內(nèi)容太多,我整理了好幾天,在浩如煙海的網(wǎng)絡(luò)前有點無力,想想是自己的實踐不夠,有一些問題沒有親身體驗;也不能一蹴而就,得久久為功。所以這篇文章就當(dāng)作一個Verilog學(xué)習(xí)與FPGA設(shè)計的總述性文章,后續(xù)繼續(xù)學(xué)習(xí)我會加深對這些知識的理解。

00 阻塞賦值和非阻塞賦值

概念

回憶一下課本上的相關(guān)內(nèi)容。

  • 阻塞賦值:

    • "="

    • Verilog編譯器按照這些語句在always塊中的先后順序依次執(zhí)行。

    • 如果一個變量通過阻塞賦值語句賦值,則這個新賦的值會在這個block中的后續(xù)語句中使用。

    • 相當(dāng)于串行

  • 非阻塞賦值:

    • "<="

    • always塊中所有非阻塞賦值的語句在求值時所用的值是最初進入always時各個變量已經(jīng)具有的值。

    • 換一個角度講,"<="左側(cè)的被賦值變量,只在always結(jié)束時統(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)鍵點是g的表達式,由于是阻塞賦值,所以相當(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

這個區(qū)別之處就在于這個g,是x3與前一個 f 進行"|"運算。

思考

將阻塞賦值的示例代碼中的兩個執(zhí)行語句互換位置,會發(fā)生什么情況?

可以料見影響比較大。

可見阻塞賦值描述時序電路有風(fēng)險。

組合邏輯實例

相反的,如果我們要實現(xiàn) f=a1a0 + a2a1這樣一個函數(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

可見這段代碼有兩個特征;

  1. 非阻塞賦值的結(jié)果在always結(jié)束后才可以看到

  2. 多次賦值時,后覆蓋前。

這兩個特征使得第二個f語句出現(xiàn)問題,因為第二個語句

 f <=f | (A[2] & A[1]);

右側(cè)的f的值是不可見的。

總結(jié)

  • 對組合邏輯建模采用阻塞賦值

  • 對時序邏輯建模采用非阻塞賦值

  • 用多個always塊分別對組合和時序邏輯建模

  • 盡量不要在一個always塊里面混合使用阻塞賦值和非阻塞賦值。如果在同一個塊即為組合邏輯又為時序邏輯,應(yīng)使用“非阻塞賦值”

01 程序是并行執(zhí)行的

這里給的例子沒怎么看懂。自己查了一下。

先說結(jié)論:

  1. 各個always塊是并行執(zhí)行的,

  2. always塊和initial塊之間是并行執(zhí)行的,

  3. begin-end塊內(nèi)是順序執(zhí)行的,

  4. 但是非阻塞賦值(<=)是并行執(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

可以料見實現(xiàn)的電路:

下面借鑒了這篇文章

1.png

波形圖:

2.jpg

可以看到強調(diào)的還是上面說過的非阻塞賦值的特點。

02 程序的可綜合性

實驗任務(wù)里總有這么一句:“用可綜合的代碼......”

什么是可綜合性,什么又是不可綜合性呢?

下面學(xué)習(xí)了這篇文章

這篇文章講的挺多,但是我現(xiàn)在這個RTL級還沒搞明白的菜鳥用不到這么多,基本篩選如下:

不可綜合的Verilog語句:

  • initial

    只能在test bench中使用,不能綜合。

  • assign    和deassign

    不支持對reg    數(shù)據(jù)類型的assign或deassign進行綜合,支持對wire數(shù)據(jù)類型的assign或deassign進行綜合。

  • fork join 不可綜合,可以使用非塊語句達到同樣的效果。

    這個塊是并行執(zhí)行的,但是不可綜合。

    敏感列表里同時帶有posedge和negedge 如:(現(xiàn)在也碰不到

    1 always@(posedge clk or negedge clk) 2 begin3  ...4 end

03 面積和速度的轉(zhuǎn)換

這里我們說的面積:設(shè)計所占用的FPGA邏輯資源數(shù)目,一般用所消耗的觸發(fā)器和查找表(還沒學(xué))來衡量。

速度:是指在芯片上可以穩(wěn)定運行時能達到的最高頻率

兩者性能上的調(diào)配方法:

  1. 模塊復(fù)用

  2. 串并變換

     

     

    可以看到這種串并轉(zhuǎn)換,用更大的面積(即多個子模塊并行),達到高頻率的效果。這一點后面還會再提到。

  3. 流水線

后續(xù)學(xué)習(xí)入口

04 同步電路的設(shè)計原則

同步設(shè)計的優(yōu)點:

  1. 可以有效避免毛刺的影響,提高設(shè)計的可靠性

  2. 可以簡化時序分析過程

  3. 可以減少工作環(huán)境對設(shè)計的影響

設(shè)計原則:

(由于應(yīng)用還不多,對這些體會還不深刻,簡單記錄:

  • 單時鐘

    全局時鐘網(wǎng)絡(luò)的時鐘是性能最優(yōu),最便于預(yù)測的時鐘,具有最強的驅(qū)動能力

  • 單時鐘沿

    混合時鐘會使時序分析復(fù)雜、電路工作頻率降低

  • 避免使用門控時鐘

    • 即時鐘不要與組合邏輯再進行組合,如下:

    •  

       

    • 可能引起毛刺、偏移

  • 在模塊內(nèi)部不要再產(chǎn)生時鐘了。

     

05 模塊劃分的設(shè)計原則

封裝復(fù)用

這有點像C++的封裝。

上一層模塊只負(fù)責(zé)下一層模塊的依據(jù)(即原材料),而具體行為互不相關(guān)。

這樣就保證了各個模塊的相對獨立性和內(nèi)部結(jié)構(gòu)的合理性,便于維護,也使得相同邏輯可以復(fù)用同一模塊。

同步時序模塊的寄存器劃分原則

在設(shè)計時,應(yīng)盡量將模塊中的同步時序邏輯輸出信號以寄存器的形式送出,以便于綜合工具區(qū)分時序和組合邏輯;

并且時序輸出的寄存器應(yīng)符合流水線設(shè)計思路,能工作在更高的頻率,以極大地提高模塊吞吐量。

流水線設(shè)計思路是什么?

就是將組合邏輯系統(tǒng)地分割,并在各個部分(分級)之間插入寄存器,并暫存中間數(shù)據(jù)的方法。 目的是將一個大操作分解成若干的小操作,每一步小操作的時間較小,所以能提高頻率,各小操作能并行執(zhí)行,所以能提高數(shù)據(jù)吞吐率(提高處理速度)。

06 通用代碼風(fēng)格

邏輯復(fù)用與邏輯復(fù)制

對于我這個初學(xué)者來說,邏輯復(fù)用和邏輯復(fù)制十分相似,了解后就知道確實不同,主要是涉及性能衡量尺度:速度和面積的統(tǒng)籌。

  • 邏輯復(fù)用是通過提高工作頻率來節(jié)省面積的優(yōu)化方法,經(jīng)常用于存在多個資源可共享單元的設(shè)計中。

    • PS:相當(dāng)于為了節(jié)省人力,而讓一個人干三個人的活。

      • 10MHZ乘法器

      • 兩個5MHZ乘法器

  • 邏輯復(fù)制——面積換速度

    • 邏輯復(fù)用是通過增加面積而改善設(shè)計時序的優(yōu)化方法,經(jīng)常用于調(diào)整信號的扇出。

      • 舉例就類似于上面的面積換速度

邏輯結(jié)構(gòu)

  • 鏈狀結(jié)構(gòu)

  • 樹狀結(jié)構(gòu)

if和case語句的使用原則

  1. If語句指定了一個有優(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時,se1=2b00而不是2b01;10 //這就是if-else的優(yōu)先邏輯。

    而case是并行的,沒有優(yōu)先級。

  2. if語句可以包含一系列的表達式;/有時甚至一個else就可以是一個二路選擇器。

    而case語句比較的是一個公共的控制表達式。整個語句塊一起構(gòu)成了一個多路選擇器。

    這個很好理解。

  3. 通常if-else結(jié)構(gòu)速度較慢,但占用的面積小;

    case語句結(jié)構(gòu)速度較快,但占用的面積較大。

  4. 嵌套的if語句如果使用不當(dāng),就會導(dǎo)致設(shè)計的更長延時。

  5. 如果想利用if語句來實現(xiàn)那些對延時要求苛刻的路徑,應(yīng)將最高優(yōu)先級給最遲到達的關(guān)鍵信號。(最小生成樹思想)。

  6. 有時為了兼顧面積和速度,可以將if和case語句合用。

舉例

 1 //if-else實現(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

想象一下是什么電路?

就是一個四選一,需要兩位的控制信號,這個控制信號就正好是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

實現(xiàn)電路也是類似上面的電路。

避免意外鎖存器

鎖存器在課本里學(xué)過,是用于存儲一位數(shù)據(jù)的元件,電平觸發(fā)。

其特點是:鎖存器在不鎖存數(shù)據(jù)時,輸出隨輸入變化;但一旦數(shù)據(jù)鎖存時,輸入對輸出不產(chǎn)生任何影響。

而我們在設(shè)計電路時,應(yīng)該避免無意之間產(chǎn)生這種鎖存器,否則會導(dǎo)致一些邏輯上的錯誤。

引起意外鎖存器的原因

翻閱了很多網(wǎng)上的總結(jié)。有一些規(guī)則比較復(fù)雜,考慮到我現(xiàn)在的水平,我只記錄對初入門水平夠用且好理解的方面。后續(xù)繼續(xù)學(xué)習(xí)可以深入了解更多。

  • if……else……結(jié)構(gòu)中缺少else

  • case結(jié)構(gòu)中的分支沒有包含所有情況且沒有default語句。

建議

  1. 如果使用if語句,最好寫上else分支;

  2. 如果使用case語句,最好寫上default語句。

  3. 即使需要鎖存器,也通過else分支或default分支來顯式說明。而不要利用語言特性觸發(fā)生成(因為不可控)

內(nèi)容真的好多,一時間難以完全消化...

上傳于2021年11月25日23時

 

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/125363.html

相關(guān)文章

  • 流水燈電路設(shè)計實驗--VHDL

    摘要:將經(jīng)過仿真的設(shè)計下載到硬件實驗箱進行驗證。流水燈控制電路仿真如圖所示實驗引腳鎖定八個按鍵按鍵分別對應(yīng)上的引腳。 一、實驗?zāi)康?(1)學(xué)習(xí)并掌握Quartus II的...

    3fuyu 評論0 收藏0
  • 【正點原子FPGA連載】第三十六章雙路高速DA實驗 -摘自【正點原子】新起點之FPGA開發(fā)指南_V2

    摘要:本章我們將使用高速芯片實現(xiàn)數(shù)模轉(zhuǎn)換,產(chǎn)生正弦波模擬電壓信號。實驗任務(wù)本節(jié)實驗任務(wù)是使用新起點開發(fā)板及雙路高速擴展模塊模塊實現(xiàn)數(shù)模轉(zhuǎn)換。下載驗證將雙路高速模塊插入新起點開發(fā)板的擴展口,連接時注意擴展口電源引腳方向和開發(fā)板電源引腳方向一致。 ...

    李文鵬 評論0 收藏0
  • 針對工控領(lǐng)域電子元器件國產(chǎn)化討論內(nèi)容記錄及國產(chǎn)FPGA廠家介紹

    摘要:本文就關(guān)于電子元件國產(chǎn)化的一些交流內(nèi)容進行介紹。一些重要的工業(yè)領(lǐng)域的國產(chǎn)化要求越來越高,也會對高端的需求增加。 前幾天發(fā)表的工業(yè)控制領(lǐng)域電子元件全國產(chǎn)化替代解讀文章也有一些關(guān)注與討論,這個文章有人說是軟文,想想也像是軟文,不過里邊提到的任一個廠家都沒有給贊助,也是很無奈。文章主要目的是把我接...

    Shimmer 評論0 收藏0
  • 步入計算多元化時代 異構(gòu)計算為什么發(fā)展空間巨大?

    摘要:為了應(yīng)對計算多元化的需求,越來越多的場景開始引入等硬件進行加速,異構(gòu)計算應(yīng)運而生。眾所周知,意味著對計算力的超高要求,目前以為代表的異構(gòu)計算已成為加速創(chuàng)新的新一代計算架構(gòu)。目前異構(gòu)計算使用最多的是利用來加速。在互聯(lián)網(wǎng)行業(yè),隨著信息化的普及,數(shù)據(jù)量的暴增使得人們對存儲空間又有了新要求,同時,機器學(xué)習(xí)、人工智能、無人駕駛、工業(yè)仿真等領(lǐng)域的崛起,使得通用CPU在處理海量計算、海量數(shù)據(jù)/圖片時遇到越...

    gghyoo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<