0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FPGA入門之功能描述-時序邏輯

jf_78858299 ? 來源:CSDN ? 作者:原來如此呀 ? 2023-03-21 10:47 ? 次閱讀

第6節(jié) 功能描述-時序邏輯

6.1 always 語句

時序邏輯的代碼一般有兩種: 同步復位的時序邏輯和異步復位的時序邏輯。在同步復位的時序邏輯中復位不是立即有效,而在時鐘上升沿時復位才有效。 其代碼結構如下:

在異步復位的時序邏輯中復位立即有效,與時鐘無關。 其代碼結構如下:

針對時序邏輯的 verilog 設計提出以下建議:

為了教學的方便代碼統(tǒng)一采用異步時鐘邏輯,建議同學們都采用此結構,這樣設計時只需考慮是用時序邏輯還是組合邏輯結構來進行代碼編寫即可。在 實際工作中請遵從公司的相應規(guī)范進行代碼設計(自行考慮是使用那種時序邏輯結構以及組合邏輯電路) 。

沒有復位信號的時序邏輯代碼設計是不規(guī)范的,建議不要這樣使用。

6.2 D 觸發(fā)器

數字電路中介紹了多種觸發(fā)器,如 JK 觸發(fā)器、 D 觸發(fā)器、 RS 觸發(fā)器、 T 觸發(fā)器等。在 FPGA中使用的是最簡單的觸發(fā)器——D 觸發(fā)器。

6.2.1 D 觸發(fā)器結構

圖 1.3- 37 是 D 觸發(fā)器的結構圖,可以將其視為一個芯片, 該芯片擁有 4 個管腳,其中 3 個是輸入管腳:時鐘 clk、復位 rst_n、信號 d; 1 個是輸出管腳: q。

該芯片的功能如下:當給管腳 rst_n 給低電平(復位有效), 即賦值為 0 時,輸出管腳 q 處于低電平狀態(tài)。如果管腳 rst_n 為高電平, 則觀察管腳 clk 的狀態(tài), 當 clk 信號由 0 變 1 即處于上升沿的時候,將此時 d 的值賦給 q。若 d 是低電平,則 q 也是低電平;若 d 是高電平,則 q 也是高電平。

6.2.2 D 觸發(fā)器波形

圖 1.3- 38 為 D 觸發(fā)器的功能波形圖, 該波形圖反映了 D 觸發(fā)器各個信號的變化情況,從左到右表示時間的走勢。 從圖中可以看到時鐘信號有規(guī)律地進行高低變化(初始的波形狀態(tài)是設想的并不代表實際波形,在后續(xù)的時鐘信號和復位信號給出后,波形才按照指令進行變換)。

按照從左向右的順序觀察波形圖可以發(fā)現:

開始狀態(tài)下, rst_n 等于 1, d 等于 0, q 等于 1。

隨后 rst_n 由 1 變 0,此時輸出信號 q 立即變成 0。對應的功能是:當給管腳 rst_n 低電平,也就是賦值為 0 時,輸出管腳 q 處于低電平狀態(tài)。

在 rst_n 為 0 期間,即使在有時鐘或信號 d 發(fā)生變化的情況下 q 仍然保持為低電平。

在 rst_n 由 0 變成 1 撤消復位后, q 沒有立刻發(fā)生變化。

在第 4 個時鐘上升沿時,此時 rst_n 等于 1,而 d 等于 1, 因此 q 變成了 1。

第 5 個時鐘上升沿,仍然是同樣情況, rst_n=1, d=1, 因此 q=1。

在第 6 個時鐘上升沿, rst_n=1, d=0, 因此 q=0。

第 7~10 個時鐘沿也是按同樣方式判斷。對應的功能是:如果管腳 rst_n 為高電平, 則觀察管腳 clk,在 clk 由 0 變 1 即上升沿的時候,將現在 d 的值賦給 q。若 d 是低電平, q 也是低電平;若 d 是高電平, q 也是高電平。

6.2.3 D 觸發(fā)器代碼

首先, 觀察如下這段時序邏輯的代碼:

從語法上分析該段代碼的功能為:該段代碼總是在“時鐘 clk 上升沿或者復位 rst_n 下降沿”的

時候執(zhí)行一次。具體執(zhí)行方式如下:

如果復位 rst_n=0,則 q 的值為 0;

如果復位 rst_n=1,則將 d 的值賦給 q(注意,前提條件是時鐘上升沿的時候)。

上例的功能與本案例的功能是相同的:當給管腳 rst_n 給低電平,也就是賦值為 0 時,輸出管腳q 就處于低電平狀態(tài)。如果管腳 rst_n 為高電平則觀察管腳 clk,在 clk 由 0 變 1 即上升沿的時候,將現在 d 的值賦給 q, d 是低電平, q 也是低電平, d 是高電平, q 也是高電平。

因此可以看出這段代碼的功能與 D 觸發(fā)器的功能是一樣的,即該代碼其實就是在描述一個 D 觸發(fā)器, 也就是 D 觸發(fā)器的代碼。

前文中已經講過在 FPGA 設計中可以用原理圖的形式來設計,也可以用硬件描述語言來設計。

當用原理圖來設計時幾個 D 觸發(fā)器還可以忍受,但如果出現幾千幾萬個 D 觸發(fā)器則必定是頭暈眼花,而用硬件描述語言 Verilog 則不存在這一問題。

6.2.4 怎么看 FPGA 波形

下面來討論如下圖所示的波形, 先觀察在第 4 個時鐘上升沿的時刻, 思考一下此時看到的信號 q的值是多少?是 0 還是 1? 或者觀察到的是 q 的上升沿?

首先明確一點: Verilog 代碼對應的是硬件,因此應該從硬件的角度來分析這個問題。再來理清一下代碼的因果關系:先有時鐘上升沿, 此為因, 然后再將 d 的值賦給 q,這才是結果。這個因果是有先后關系的,對于硬件來說這個“先后”無論是多么地迅速,也一定會占用一定時間,所以 q 的變化會稍后于 clk 的上升沿。例如下圖就是硬件的實際變化情況。

圖 1.3- 40 中就很容易看出,第 4 個時鐘上升沿時刻對應的 q 值為 0,也就是變化前的值。上面的波形雖然更將近于實際,但這樣畫圖使這一過程非常復雜, 且非必要操作。 因此建議只需掌握這種看波形規(guī)則,即 時鐘上升沿看信號,是看到變化之前的值 (由于時鐘變換需要時間,具有時延性)。

所以第 4 個時鐘上升沿時,看到 q 值為 0;在第 6 個時鐘上升沿時,看到 q 值為 1;在第 7 個時鐘上升沿時,看到 q 值為 0;在第 8 個時鐘上升沿時,看到 q 值為 1;在第 10 個時鐘上升沿時,看到 q 值為 0。注意一下,復位信號是在系統(tǒng)開始時刻或者出現異常時才使用,一般上電后就不會再次進行復位, 也可以認為復位是一種特殊情況。

下面考慮正常使用的情況:無論是從功能上還是波形上,都可以看到信號 q 只在時鐘上升沿才

變化, 而絕對不會在中間發(fā)生變化。在一般的數字系統(tǒng)中大部分信號之間的傳遞都是在同一個時鐘下進行的,即大部分都是同步電路(即在輸入信號的變化跟隨時鐘信號的上升沿進行相應的變化)??鐣r鐘的電路占比非常小,屬于特殊的異步電路。

下面具體分析每個時鐘下 q 信號的情況:

在 rst_n 由 1 變 0 時, q 立刻變成 0。

在第 2 個時鐘上升沿,看到 rst_n 為 0。按代碼功能, q 仍然為 0。

在第 3 個時鐘上升沿,看到 rst_n 為 0。按代碼功能, q 仍然為 0。

在第 4 個時鐘上升沿,看到 rst_n 為 1, d 值為 1, q 值為 0。按代碼功能, q 變成 1。

在第 5 個時鐘上升沿,看到 rst_n 為 1, d 值為 1, q 值為 1。按代碼功能, q 變成 1。

在第 6 個時鐘上升沿,看到 rst_n 為 1, d 值為 0, q 值為 1。按代碼功能, q 變成 0。

在第 7 個時鐘上升沿,看到 rst_n 為 1, d 值為 1, q 值為 0。按代碼功能, q 變成 1。

在第 8 個時鐘上升沿,看到 rst_n 為 1, d 值為 0, q 值為 1。按代碼功能, q 變成 0。

在第 9 個時鐘上升沿,看到 rst_n 為 1, d 值為 0, q 值為 0。按代碼功能, q 變成 0。

在第 10 個時鐘上升沿,看到 rst_n 為 1, d 值為 1, q 值為 0。按代碼功能, q 變成 1。

6.3 時鐘

時鐘信號是每隔固定時間上下變化的信號。本次上升沿和上一次上升沿之間占用的時間就是時鐘周期, 其倒數為時鐘頻率。高電平占整個時鐘周期的時間, 被稱為占空比。

FPGA 中時鐘的占空比一般是 50%,即高電平時間和低電平時間一樣。其實占空比在 FPGA 內部沒有太大的意義,因為 FPGA 使用的是時鐘上升沿來觸發(fā), 設計師們更加關心的是時鐘頻率。

如果時鐘的上升沿每秒出現一次,說明時鐘的時鐘周期為 1 秒,時鐘頻率為 1Hz。如果時鐘的

上升沿每 1 毫秒出現一次,說明時鐘的時鐘周期為 1 毫秒,時鐘頻率為 1000Hz,或寫成 1kHz。

現在普通 FPGA 器件所支持的時鐘頻率范圍一般不超過 150M,高端器件一般不超過 700M( 注意,該值為經驗值,實際時鐘的頻率與其具體器件和設計電路有關) , 所對應的時鐘周期在納秒級范圍。 因此在本教材中所有案例的時鐘頻率一般選定范圍是幾十至一百 M 左右。

下面列出本教材常用到的時鐘頻率以及所對應的時鐘周期,方便進行換算(1s = 1000000000ns)。

時鐘是 FPGA 中最重要的信號,其他所有信號在時鐘的上升沿統(tǒng)一變化,這就像軍隊里的令旗,所有軍隊在看到令旗到來的時刻執(zhí)行已經設定好的命令。

時鐘這塊令旗影響著整體電路的穩(wěn)定。首先,時鐘要非常穩(wěn)定地進行跳動。就如軍隊令旗, 如果時快時慢就會讓人無所適從,容易出錯。而如果令旗非常穩(wěn)定,每個人都知道令旗的指揮周期, 就可以判斷令旗到來前是否可以完成任務, 如果無法完成則進行改正(修改代碼), 從而避免系統(tǒng)出錯。

其次,一個高效的軍隊中令旗越少越好, 如果不同部隊對標不同的令旗,那么部隊協作就容易出現問題,整個軍隊無法高效的完成工作,容易出現錯誤。同樣的道理, FPGA 系統(tǒng)的時鐘必定是越少越好,最好只存在一個時鐘。

以上就是要求不要把信號放在時序邏輯敏感列表的原因。

FPGA時鐘信號總結,保證電路實際工作中的性能和穩(wěn)定性:

時鐘信號越少越好;

時鐘信號不能隨意變換;

實際應用中不要將產生的輸出信號作為時鐘信號;

6.4 時序邏輯代碼和硬件

先來分析一下下面這段代碼:

仍然從語法上分析該段代碼的功能。該段代碼總是在“時鐘 clk 上升沿或者復位 rst_n 下降沿”

的時候執(zhí)行一次。 具體執(zhí)行方法如下:

如果復位 rst_n=0,則 q 的值為 0;

如果復位 rst_n=1,則將(a+d)的結果賦給 q(注意,前提條件是時鐘上升沿的時候)。

假設用信號 c 表示 a+d 的結果,則第 2 點可改為:如果復位 rst_n=1,則將 c 的值賦給 q(注意,前提條件是時鐘上升沿的時刻)。很明顯這是一個 D 觸發(fā)器,輸入信號為 d,輸出為 q,時鐘為 clk,復位為 rst_n,其電路示意圖如下圖所示:

可知 c 是 a+d 的結果, 因此其自然是通過一個加法器實現,畫出上面代碼所對應的電路結構圖,可以看出在 D 觸發(fā)器的基礎上增加了一個加法器。

很容易分析出上面電路的功能:信號 a 和信號 b 相加得到 c, c 連到 D 觸發(fā)器的輸入端。當 clk出現上升沿時,將 c 的值傳給 q。這與代碼功能是一致的。

下面是代碼和硬件所對應的波形圖。

先看信號 c 的波形: c 的產生只有與 a 和 d 有關,與 rst_n 和 clk 無關。 c 是 a+d 的結果,按照二進制加法: 0+0=0, 0+1=1, 1+1=0 可以畫出 c 的波形。

在第 1 個時鐘期間, a=0, d=0,所以 c=0+0=0;

在第 2 個時鐘期間, a=1, d=0,所以 c=1+0=1;

在第 3 個時鐘期間, a=1, d=1,所以 c=1+1=0;

在第 4 個時鐘期間, a=0, d=1,所以 c=0+1=1;

在第 5 到第 6 個時鐘期間, a=0, d=0,所以 c=0+0=0;

在第 7 個時鐘期間, a=1, d=1,所以 c=1+1=0;

在第 8 個時鐘期間, a=0, d=1,所以 c=0+1=1;

在第 9 個時鐘期間, a=0, d=0,所以 c=0+0=0;

在第 10 個時鐘期間, a=0, d=1,所以 c=0+1=1。

再看信號 q 的波形:q 是 D 觸發(fā)器的輸出, 其只在 rst_n 的下降沿或者 clk 的上升沿才變化,其他時刻不變化, 即 a、 d、 c 發(fā)生變化時, q 不會立刻發(fā)生改變。

下面具體分析每個時鐘下 q 信號的情況:

在 rst_n 由 1 變 0 時, q 立刻變成 0。

在第 2 個時鐘上升沿,看到 rst_n 為 0。按代碼功能, q 仍然為 0。

在第 3 個時鐘上升沿,看到 rst_n 為 0。按代碼功能, q 仍然為 0。

在第 4 個時鐘上升沿,看到 rst_n 為 1, c 值為 0, q 值為 0。按代碼功能, q 變成 0;

在第 5 個時鐘上升沿,看到 rst_n 為 1, c 值為 1, q 值為 0。按代碼功能, q 變成 1;

在第 6 個時鐘上升沿,看到 rst_n 為 1, c 值為 0, q 值為 1。按代碼功能, q 變成 0;

在第 7 個時鐘上升沿,看到 rst_n 為 1, c 值為 0, q 值為 0。按代碼功能, q 變成 0;

在第 8 個時鐘上升沿,看到 rst_n 為 1, c 值為 0, q 值為 0。按代碼功能, q 變成 0;

在第 9 個時鐘上升沿,看到 rst_n 為 1, c 值為 1, q 值為 0。按代碼功能, q 變成 1;

在第 10 個時鐘上升沿,看到 rst_n 為 1, c 值為 0, q 值為 1。按代碼功能, q 變成 0;

在第 11 個時鐘上升沿,看到 rst_n 為 1, c 值為 1, q 值為 0。按代碼功能, q 變成 1。

在討論時序邏輯的加法器時對加法器的輸出 c 和 D 觸發(fā)器的輸出 q 分開進行討論,就像兩塊獨立的電路。 同樣的道理, 在設計 Verilog 代碼時也可以將其分開來進行編寫。

先將下面的硬件電路用 Verilog 描述出來:

該電路對應的電路可以寫成:

也可以寫成:

上面的兩段代碼,都是描述同一加法器硬件電路。接著用 Verilog 對觸發(fā)器進行描述。

其代碼的寫法如下:

最后可以看到, 兩段代碼都有信號 c,說明這兩段代碼是相連的, 利用硬件連接起來可以變成如下圖所示的電路。

由此可見,下面兩段代碼所對應的硬件電路是一模一樣的。

那么這兩種代碼哪一種比較好呢?答案是這兩段代碼并無區(qū)別, 因為兩者的硬件是相同的。由此也可以得知評估 verilog 代碼好壞的最基本標準, 即不是看代碼行數而是看硬件。

利用D觸發(fā)器結合組合邏輯電路和基于D觸發(fā)器的代碼拓展總結:

從性能上來說:兩者所表述的功能是一樣的;

從代碼的可讀性上,前者更加直觀,能夠通過仿真工具將加法器具現,但如果代碼量比較多可以使用后者,減少代碼的冗余;

6.5 阻塞賦值和非阻塞賦值

在 always 語句塊中, Verilog 語言支持兩種類型的賦值:阻塞賦值和非阻塞賦值。阻塞賦值使用“=”語句;非阻塞賦值使用“ <=”語句。

阻塞賦值:在一個“ begin…end”的多行賦值語句,先執(zhí)行當前行的賦值語句,再執(zhí)行下一行的賦值語句。

非阻塞賦值:在一個“ begin…end”的多行賦值語句,在同一時間內同時賦值。

上面兩個例子中, 1 到 4 行部分是阻塞賦值,程序會先執(zhí)行第 2 行,得到結果后再執(zhí)行第 3 行。6 至 9 行這一段是非阻塞賦值,第 7 行和第 8 行的賦值語句是同時執(zhí)行的。

具體分析一下這兩段代碼這件的區(qū)別:假設當前 c 的值為 0, d 的值為 0, a 的新值為 1。阻塞賦值的執(zhí)行過程和結果為:程序先執(zhí)行第 2 行,此時 c 的值將更新為 1,然后再執(zhí)行 3 行,此時 c+a 也就是相當于 1+1=2, 即 d 的值為 2。

非阻塞賦值的執(zhí)行過程和結果為:程序同時執(zhí)行第 7 行和 8 行。需要特別注意是,在執(zhí)行第 8行的時候,第 7 行還并未執(zhí)行, 這也就意味著 c 的值還沒有發(fā)生變化,即此時 c 的值為 0。同時執(zhí)行的結果是, c 的值為 1, d 的值為 1。

根據VerilogHDL硬件描述語言規(guī)范要求,組合邏輯中應使用阻塞賦值“=”,時序邏輯中應使用非阻塞賦值“ <=”??梢詫⑦@個規(guī)則牢牢記住, 按照這一規(guī)則進行設計絕對不會發(fā)生錯誤。制定這個規(guī)范的原因并不是考慮語 法需要,而是為了正確的進行硬件描述。

原文鏈接:https://blog.csdn.net/Royalic/article/details/121196434

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4723

    瀏覽量

    68236
  • 時序邏輯
    +關注

    關注

    0

    文章

    39

    瀏覽量

    9134
  • 異步復位
    +關注

    關注

    0

    文章

    46

    瀏覽量

    13297
收藏 人收藏

    評論

    相關推薦

    FPGA入門:第一個工程實例之功能概述

    FPGA入門:第一個工程實例之功能概述 本文節(jié)選自特權同學的圖書《FPGA/CPLD邊練邊學——快速入門Verilog/VHDL》書中代碼請
    發(fā)表于 02-26 12:02

    Xilinx FPGA無痛入門,海量教程免費下載

    指南 -- Modelsim仿真驗證Lesson13 特權Xilinx FPGA SF-SP6入門指南 -- PWM蜂鳴器驅動之功能概述Lesson14 特權Xilinx FPGA S
    發(fā)表于 07-22 11:49

    Xilinx FPGA入門連載23:PLL實例之功能簡介

    `Xilinx FPGA入門連載23:PLL實例之功能簡介特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1jGjAhEm 1 PLL概述PLL
    發(fā)表于 11-10 08:44

    Xilinx FPGA入門連載39:SRAM讀寫測試之功能仿真

    `Xilinx FPGA入門連載39:SRAM讀寫測試之功能仿真特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1jGjAhEm 1 Xilinx庫設置
    發(fā)表于 12-23 15:06

    Xilinx FPGA入門連載43:FPGA片內ROM實例之功能概述

    Xilinx FPGA入門連載43:FPGA片內ROM實例之功能概述特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1jGjAhEm 1
    發(fā)表于 01-06 12:22

    Xilinx FPGA入門連載47:FPGA片內RAM實例之功能概述

    Xilinx FPGA入門連載47:FPGA片內RAM實例之功能概述特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1jGjAhEm 1
    發(fā)表于 01-20 12:28

    Xilinx FPGA入門連載51:FPGA片內FIFO實例之功能概述

    Xilinx FPGA入門連載51:FPGA片內FIFO實例之功能概述特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1jGjAhEm 1
    發(fā)表于 02-26 10:26

    Xilinx FPGA入門連載55:FPGA 片內異步FIFO實例之功能概述

    `Xilinx FPGA入門連載55:FPGA 片內異步FIFO實例之功能概述特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1jGjAhE
    發(fā)表于 03-07 11:32

    Xilinx FPGA入門連載59:FPGA 片內ROM FIFO RAM聯合實例之功能概述

    `Xilinx FPGA入門連載59:FPGA 片內ROM FIFO RAM聯合實例之功能概述特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s
    發(fā)表于 03-16 12:43

    勇敢的芯伴你玩轉Altera FPGA連載78:FPGA片內ROM實例之功能概述

    `勇敢的芯伴你玩轉Altera FPGA連載78:FPGA片內ROM實例之功能概述特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1i5LMUUD 該工程
    發(fā)表于 06-16 19:39

    勇敢的芯伴你玩轉Altera FPGA連載83:FPGA片內RAM實例之功能概述

    `勇敢的芯伴你玩轉Altera FPGA連載83:FPGA片內RAM實例之功能概述特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1i5LMUUD 該
    發(fā)表于 06-30 17:16

    時序邏輯電路分析有幾個步驟(同步時序邏輯電路的分析方法)

    分析時序邏輯電路也就是找出該時序邏輯電路的邏輯功能,即找出
    發(fā)表于 01-30 18:55 ?12.6w次閱讀
    <b class='flag-5'>時序</b><b class='flag-5'>邏輯</b>電路分析有幾個步驟(同步<b class='flag-5'>時序</b><b class='flag-5'>邏輯</b>電路的分析方法)

    FPGA入門之功能描述-組合邏輯

    assign 語句是連續(xù)賦值語句,一般是將一個變量的值不間斷地賦值給另一變量,兩個變量之間就類似于被導線連在了一起,習慣上當做連線用。 assign 語句的基本格式是:
    的頭像 發(fā)表于 03-21 10:45 ?530次閱讀

    時序邏輯電路的描述方法有哪些

    時序邏輯電路是數字電路中的一種重要類型,它具有存儲功能,能夠根據輸入信號和內部狀態(tài)的變化來改變其輸出。時序邏輯電路廣泛應用于計算機、通信、控
    的頭像 發(fā)表于 08-28 11:37 ?367次閱讀

    時序邏輯電路的五種描述方法

    時序邏輯電路是數字電路中的一種重要類型,它具有存儲和處理信息的能力。時序邏輯電路的描述方法有很多種,不同的方法適用于不同的設計和分析場景。以
    的頭像 發(fā)表于 08-28 11:39 ?591次閱讀