精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

介紹Verilog的2大類時序控制方法

冬至子 ? 來源:數字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-06-02 11:44 ? 次閱讀

Verilog 提供了 2 大類時序控制方法:時延控制和事件控制。事件控制主要分為邊沿觸發事件控制與電平敏感事件控制。

時延控制

基于時延的時序控制出現在表達式中,它指定了語句從開始執行到執行完畢之間的時間間隔。

時延可以是數字、標識符或者表達式。

根據在表達式中的位置差異,時延控制又可以分為常規時延與內嵌時延。

◆常規時延

遇到常規延時時,該語句需要等待一定時間,然后將計算結果賦值給目標信號

格式為:#delay procedural_statement,例如:

reg  value_test ;
reg  value_general ;
#10  value_general    = value_test ;

該時延方式的另一種寫法是直接將井號 “#” 獨立成一個時延執行語句,例如:

#10 ;
value_ single         = value_test ;

◆內嵌時延

遇到內嵌延時時,該語句先將計算結果保存,然后等待一定的時間后賦值給目標信號。

內嵌時延控制加在賦值號之后。例如:

reg  value_test ;
reg  value_embed ;
value_embed        = #10 value_test ;

需要說明的是,這 2 種時延控制方式的效果是有所不同的。

當延時語句的賦值符號右端是常量時,2 種時延控制都能達到相同的延時賦值效果。

當延時語句的賦值符號右端是變量時,2 種時延控制可能會產生不同的延時賦值效果。

◆例如下面仿真代碼:

`timescale 1ns/1ns

module test ;
    reg  value_test ;
    reg  value_general, value_embed, value_single ;

    //signal source
    initial begin
        value_test        = 0 ;
        #25 ;      value_test        = 1 ;
        #35 ;      value_test        = 0 ;        //absolute 60ns
        #40 ;      value_test        = 1 ;        //absolute 100ns
        #10 ;      value_test        = 0 ;        //absolute 110ns
    end

    //(1)general delay control
    initial begin
        value_general     = 1;
        #10 value_general  = value_test ; //10ns, value_test=0
        #45 value_general  = value_test ; //55ns, value_test=1
        #30 value_general  = value_test ; //85ns, value_test=0
        #20 value_general  = value_test ; //105ns, value_test=1
    end

    //(2)embedded delay control
    initial begin
        value_embed       = 1;
        value_embed  = #10 value_test ; //0ns, value_test=0
        value_embed  = #45 value_test ; //10ns, value_test=0
        value_embed  = #30 value_test ; //55ns, value_test=1
        value_embed  = #20 value_test ; //85ns, value_test=0
    end

    //(3)single delay control
    initial begin
        value_single      = 1;
        #10 ;
        value_single = value_test ; //10ns, value_test=0
        #45 ;
        value_single = value_test ; //55ns, value_test=1
        #30 ;
        value_single = value_test ; //85ns, value_test=0
        #20 ;
        value_single = value_test ; //105ns, value_test=1
    end

    always begin
        #10;
        if ($time >= 150) begin
            $finish ;
        end
    end

endmodule

◆仿真結果如下,由圖可知:

(1)一般延時的兩種表達方式執行的結果都是一致的。

(2)一般時延賦值方式:遇到延遲語句后先延遲一定的時間,然后將當前操作數賦值給目標信號,并沒有“慣性延遲”的特點,不會漏掉相對較窄的脈沖。

(3)內嵌時延賦值方式:遇到延遲語句后,先計算出表達式右端的結果,然后再延遲一定的時間,賦值給目標信號。

圖片

◆下面分析下內嵌延時的賦值過程:

(1) value_embed = #10 value_test ; //0ns, value_test=0

0ns 時,執行此延時語句。

先將 0 賦值給信號 value_embed, 延遲 10ns 輸出為 0;

(2) value_embed = #45 value_test ; //10ns, value_test=0

10ns 時,執行此延時語句。

由于此時 value_test 仍然為 0,所以 value_embed 值不變。

即到 55ns 時,value_embed 值仍然保持為 0。

(3) value_embed = #30 value_test ; //55ns, value_test=1

同理,55ns 時,value_test 值為 1,將其賦值給 value_embed 并延遲 30ns 輸出。

所以 85ns 時,value_embed 輸出為 1。

(4) value_embed = #20 value_test ; //85ns, value_test=0

同理,105ns 時,value_embed 輸出為 0。

邊沿觸發事件控制

在 Verilog 中,事件是指某一個 reg 或 wire 型變量發生了值的變化。

基于事件觸發的時序控制又主要分為以下幾種。

◆一般事件控制

事件控制用符號 @ 表示。

語句執行的條件是信號的值發生特定的變化。

關鍵字 posedge 指信號發生邊沿正向跳變,negedge 指信號發生負向邊沿跳變,未指明跳變方向時,則 2 種情況的邊沿變化都會觸發相關事件。例如:

//信號clk只要發生變化,就執行q<=d,雙邊沿d觸發器模型< span="" >
always @(clk) q <= d ;               
//在信號clk上升沿時刻,執行q<=d,正邊沿d觸發器模型< span="" >
always @(posedge clk) q <= d ; 
//在信號clk下降沿時刻,執行q<=d,負邊沿d觸發器模型< span="" >
always @(negedge clk) q <= d ;
//立刻計算d的值,并在clk上升沿時刻賦值給q,不推薦這種寫法
q = @(posedge clk) d ;

◆命名事件控制

用戶可以聲明 event(事件)類型的變量,并觸發該變量來識別該事件是否發生。

命名事件用關鍵字 event 來聲明,觸發信號用 “->” 表示。例如:

event     start_receiving ;
always @( posedge clk_samp) begin
       - > start_receiving ;       //采樣時鐘上升沿作為時間觸發時刻
end

always @(start_receiving) begin
    data_buf = {data_if[0], data_if[1]} ; //觸發時刻,對多維數據整合
end

◆敏感列表

當多個信號或事件中任意一個發生變化都能夠觸發語句的執行時,Verilog 中使用“或”表達式來描述這種情況,用關鍵字 “or” 連接多個事件或信號。這些事件或信號組成的列表稱為“敏感列表”。當然,or 也可以用逗號 “,” 來代替。例如:

//帶有低有效復位端的D觸發器模型
always @(posedge clk or negedge rstn)    begin     
//always @(posedge clk , negedge rstn)    begin     
//也可以使用逗號陳列多個事件觸發
    if(! rstn)begin
           q <= 1’b ;     
       end
    else begin
        q <= d ;
    end
end

當組合邏輯輸入變量很多時,那么編寫敏感列表會很繁瑣。此時,更為簡潔的寫法是 @* 或@(*),表示對語句塊中的所有輸入變量的變化都是敏感的。例如:

always @(*) begin
//always @(a, b, c, d, e, f, g, h, i, j, k, l, m) begin 
//兩種寫法等價
    assign s = a? b+c : d ? e+f : g ? h+i : j ? k+l : m ;
end

電平敏感事件控制

前面所討論的事件控制都是需要等待信號值的變化或事件的觸發,使用 “@+敏感列表” 的方式來表示的。Verilog 中還支持使用電平作為敏感信號來控制時序,即后面語句的執行需要等待某個條件為真。Verilog 中使用關鍵字 wait 來表示這種電平敏感情況。例如:

initial begin
    wait (start_enable) ;      //等待 start 信號
    forever begin
           //start信號使能后,在clk_samp上升沿,對數據進行整合
        @(posedge clk_samp)  ;
        data_buf = {data_if[0], data_if[1]} ;      
       end
end
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1343

    瀏覽量

    109986
  • 觸發器
    +關注

    關注

    14

    文章

    1996

    瀏覽量

    61052
  • 時序控制器
    +關注

    關注

    0

    文章

    17

    瀏覽量

    11213
  • CLK
    CLK
    +關注

    關注

    0

    文章

    127

    瀏覽量

    17126
收藏 人收藏

    評論

    相關推薦

    C6678上電芯片時序控制,以及配置端口電平時序Verilog代碼

    請問能提供C6678上電芯片時序控制,以及配置端口電平和時序Verilog代碼嗎?
    發表于 06-21 04:32

    簡單而有效的電源時序控制方法介紹

    電源時序控制的優缺點,同時介紹利用ADP5134內部精密使能引腳實現時序控制的一種簡單而有效的方法
    發表于 07-03 08:15

    FPGA學習指南合集:Verilog HDL那些事兒(建模篇,時序篇,整合篇)

    控制精度。這顯然是非常“傳統”而且“古老”的方法,雖然有效但往往就是最費精神和時間的。相反的,主動式是一種講求在代碼上和想象上實現“精密控時”的設計方法。主動式的設計方法是基于“理想
    發表于 04-20 15:45

    STM32微控制器主要分為四大類

    STM32微控制器主要分為四大類:1、STM32 ARM Cortex 32位微控制器。2、STM32 ARM Cortex MPUs。3、STM8 8位MCU。4、經典MCU。如下圖
    發表于 08-11 07:42

    IIC總線時序啟動時序

    配合實現,傳輸速率包含標注準(100kps)、快速(400kps)、高速(3.4Mbps)三大類2. IIC總線時序啟動時序:當SCL為高電平時,SDA下降沿,表示啟動。...
    發表于 11-29 06:20

    Verilog HDL語言實現時序邏輯電路

    Verilog HDL語言實現時序邏輯電路 在Verilog HDL語言中,時序邏輯電路使用always語句塊來實現。例如,實現一個帶有異步復位信號的D觸發器
    發表于 02-08 11:46 ?4683次閱讀

    Verilog HDL語言的文件調用問題:include使用方法介紹

    本文簡單介紹在使用Verilog HDL語言時文件的調用問題之include使用方法介紹及舉例說明,詳見本文...
    發表于 01-24 14:40 ?6766次閱讀
    <b class='flag-5'>Verilog</b> HDL語言的文件調用問題:include使用<b class='flag-5'>方法</b><b class='flag-5'>介紹</b>

    時序圖和圖的關系

    圖和時序圖是在軟件系統設計中直接和程序代碼相關聯的圖,準確地說,程序代碼是由圖直接產生,而時序圖可以定義圖的
    發表于 10-29 11:21 ?6778次閱讀
    <b class='flag-5'>時序</b>圖和<b class='flag-5'>類</b>圖的關系

    如何使用Verilog-HDL做CPLD設計的時序邏輯電路的實現

    本文檔的主要內容詳細介紹的是如何使用Verilog-HDL做CPLD設計的時序邏輯電路的實現。
    發表于 12-12 16:25 ?9次下載
    如何使用<b class='flag-5'>Verilog</b>-HDL做CPLD設計的<b class='flag-5'>時序</b>邏輯電路的實現

    在寫Verilog時對時序約束的四大步驟的詳細資料說明

    本文檔的主要內容詳細介紹的是在寫Verilog時對時序約束的四大步驟的詳細資料說明包括了:一、 時鐘,二、 Input delays,三、 Output delays,四、 時序例外
    發表于 08-30 08:00 ?32次下載
    在寫<b class='flag-5'>Verilog</b>時對<b class='flag-5'>時序</b>約束的四大步驟的詳細資料說明

    面向時序事件的動態矩陣聚方法RDMC

    時間序列事件聚是研究事件分類及挖掘分析的基礎。現有聚方法多直接針對具有時間屬性且結構復雜的持續事件聚,未考慮聚對象的轉化,聚
    發表于 03-25 15:51 ?8次下載
    面向<b class='flag-5'>時序</b>事件的動態矩陣聚<b class='flag-5'>類</b><b class='flag-5'>方法</b>RDMC

    Verilog HDL提供了哪兩種類型的顯式時序控制

    Verilog HDL提供了兩種類型的顯式時序控制:一種是延遲控制,即定義執行語句的延遲時間;另一種是事件控制,只有當某一事件發生時才允許該
    的頭像 發表于 07-02 10:52 ?1748次閱讀

    Verilog的設計方法介紹

    Verilog 的設計多采用自上而下的設計方法(top-down)。即先定義頂層模塊功能,進而分析要構成頂層模塊的必要子模塊;
    的頭像 發表于 05-29 15:44 ?1423次閱讀
    <b class='flag-5'>Verilog</b>的設計<b class='flag-5'>方法</b><b class='flag-5'>介紹</b>

    電源時序控制的正確方法,你掌握了嗎?

    電源時序控制的正確方法,你掌握了嗎?
    的頭像 發表于 12-15 09:27 ?1307次閱讀
    電源<b class='flag-5'>時序</b><b class='flag-5'>控制</b>的正確<b class='flag-5'>方法</b>,你掌握了嗎?

    電源時序器的原理及使用方法是什么

    電源時序器是一種用于控制多個電源設備按照一定順序開啟或關閉的電子設備。它廣泛應用于音響、舞臺燈光、電視廣播、工業自動化等領域。本文將介紹電源時序器的原理及使用
    的頭像 發表于 07-08 14:16 ?2031次閱讀