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

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

3天內不再提示

Verilog系統函數和邊沿檢測

FPGA之家 ? 來源:時沿科技 ? 作者:Nemo_Yxc ? 2022-03-15 13:34 ? 次閱讀

“本文主要分享了在Verilog設計過程中一些經驗與知識點,主要包括Verilog仿真時常用的系統任務、雙向端口的使用(inout)、邊沿檢測

01

仿真時常用的系統任務($display,$fopen,$fscanf,$fwrite($fdisplay),$fclose,$random,$stop)

在RTL設計過程中,仿真的時候需要用一些系統函數,這邊筆整理了部分Verilog設計中常用的系統函數:$display,$fopen,$fscanf,$fwrite($fdisplay),$fclose,$random,$stop。

  • $display

這個函數系統任務的作用是用來在控制臺輸出信息。

  • $display("!!! Start Simulation !!!");直接顯示字符串

  • $display("data_display = %h hex %d decimal",100, 100); //顯示data_display 的16進制 ,10進制

  • $display("data_display = %o otal %b binary",100, 100);//顯示data_display 的8進制 2進制

  • $display("data_display = %d otal next line %bbinary", 100, 100);//主要展示換行操作

  • $display("simulation time is %t",$time);//顯示系統仿真時間

具體代碼如下:

regflag;//******************************  系統顯示  $display  *******************************reg[31:0]data_display;  initial    begin      data_display  =  32'd100;      flag   =   0;          $display("!!! Start  Simulation !!!");      #10;        //顯示16進制  10進制        $display("data_display = %h hex %d decimal", 100, 100);      #10;        //顯示8進制   2進制        $display("data_display = %o otal %b binary", 100, 100);      #10;        //ASCII碼        $display("data_display has %c ascii character value",64);      #10;        //顯示10進制  換行 2進制        $display("data_display = %d otal next line 
 %b binary", 100, 100);      #10         //顯示系統仿真時間        $display("simulation time is %t",$time);      flag   =   1;      end

仿真結果如下圖所示:

a3351bf2-9199-11ec-952b-dac502259ad0.png

在第五行展示了換行功能;為了驗證系統仿真時間,筆者這邊用flag參數拉高來測試時間,時間結果如下圖顯示,和顯示時間一致;

a35253ca-9199-11ec-952b-dac502259ad0.png

  • $fopen

用法:<文件句柄>=$fopen("<文件名>"); 句柄就是任務$fopen返回的多通道描述符,默認為32位,最低位(第0位)默認被設置1,默認開放標準輸出通道,即transcript窗口。 每一次使用$fopen函數后都打開了一個新的通道,并且返回了一個設置為1的位相對應。默認應該是0001,以上每調用分別設置為0010 ,0100,1000(只考慮最低四位)。

a376a964-9199-11ec-952b-dac502259ad0.png

  • $fscanf

函數功能:讀取txt(.dat)文件數據,具體代碼如下:
//******************************   讀文件  $fscanf  *******************************  //宏定義,定義數據長度  `define  DATA_LENGTH 8  //定義RAM大小  reg  signed   [15:0]  Sig0  [`DATA_LENGTH-1:0];reg    [15:0]Sig1[`DATA_LENGTH-1:0];  //定義句柄  integer   data_file0;integerdata_file1;integeri;  //讀取函數  initial    begin      #200;      //打開句柄      data_file0 = $fopen("file/rd_data0_fpga.txt","r");       data_file1 = $fopen("file/rd_data1_fpga.txt","r");       for(i = 0;i < `DATA_LENGTH; i = i + 1)         begin          $fscanf(data_file0,"%d",Sig0[i]); //讀取十進制          $fscanf(data_file1,"%h",Sig1[i]); //讀取十六進制        end      $fclose(data_file0); ////關閉這個句柄      $fclose(data_file1); ////關閉這個句柄    end

仿真結果如下圖所示:

a38e896c-9199-11ec-952b-dac502259ad0.png

  • $fwrite$fdisplay

代碼如下所示:

//**************************   寫文件  $fwrite($fdisplay)  *************************  //******  $fwrite  寫下一個數不會自動轉行,所以要加
  //將讀取的Sig0,Sig1重新寫進兩個新的txt中  //定義句柄  integer   data_wr0;  integer   data_wr1;  integer  m;  //讀取函數  initial    begin#400;      //打開句柄      data_wr0 = $fopen("file/wr_data1_fpga.txt","w"); data_wr1=$fopen("file/wr_data2_fpga.txt","w");      for(m = 0;m < `DATA_LENGTH; m = m + 1)         begin          @(clk);          $fwrite(data_wr0,"%d
",Sig0[m]); //向txt寫十進制    寫下一個數不會自動轉行,所以要加
          $fwrite(data_wr1,"%h
",Sig1[m]); //向txt寫十六進制   寫下一個數不會自動轉行,所以要加
end      //關閉這個句柄      $fclose(data_wr0);      $fclose(data_wr1);    end
仿真結果如下所示

a3b20ed2-9199-11ec-952b-dac502259ad0.png

$fwrite和$fdisplay的區別,$fwrite寫下一個數不會自動轉行,可以加 來轉行,$fdisplay則會自動轉行。
  • $fdisplay

代碼如下所示:
//******  $fdisplay  //將讀取的Sig0,Sig1重新寫進兩個新的txt中  //定義句柄  integer   data_wr2;  integer   data_wr3;  integer  j;  //讀取函數  initial    begin#600;      //打開句柄      data_wr2 = $fopen("file/wr_data3_fpga.txt","w"); data_wr3=$fopen("file/wr_data4_fpga.txt","w");      for(j = 0;j < `DATA_LENGTH; j = j + 1)         begin          @(clk);          $fdisplay(data_wr2,"%d",Sig0[j]); //向txt寫十進制    寫下一個數會自動轉行,所以不需要加
          $fdisplay(data_wr3,"%h",Sig1[j]); //向txt寫十六進制   寫下一個數會自動轉行,所以不需要加
end      //關閉這個句柄      $fclose(data_wr2);      $fclose(data_wr3);    end
仿真結果如下圖所示:

a3df4e06-9199-11ec-952b-dac502259ad0.png

  • $fclose

fclose();關閉文件,為所獲得的句柄。
  • $stop

暫停仿真。

02

雙向端口的使用(inout)

根據Verilog的語法定義,IO的端口可以定義為三種類型input、output和inout,其中inout為雙向端口。雙向端口通過控制三態門來實現,其結構框圖如下所示。

a40af4d4-9199-11ec-952b-dac502259ad0.png

  • 當T為1的時候,I端忽略(高阻),O端電平 = IO端電平;

  • 當T為0的時候,IO端電平=I端電平=O端電平;

真值表如下:

a4241464-9199-11ec-952b-dac502259ad0.png

實現代碼如下:
  assign    io  = ( !t ) ? i : 1'bz ;  assign    o   =  io;
同樣,Xilinx也有三態門的源語

參考:Xilinx 7 Series FPGA Libraries Guide for HDL Design

  IOBUF #(    .DRIVE         (  12         ), // Specify the output drive strength    .IBUF_LOW_PWR  (  "TRUE"     ), // Low Power - "TRUE", High Performance = "FALSE"    .IOSTANDARD    (  "DEFAULT"  ), // Specify the I/O standard    .SLEW          (  "SLOW"     ) // Specify the output slew rate  ) IOBUF_inst (.O(o1 ),//Bufferoutput.IO(io),//Bufferinoutport(connectdirectlytotop-levelport).I(i1),//Bufferinput    .T             (  t          ) // 3-state enable input, high=input, low=output  );
仿真結果如下:

a443e83e-9199-11ec-952b-dac502259ad0.png

可以看出:

  • T=1的時候,O端電平=IO端電平;

  • T=0的時候,O端電平=IO端電平=I端電平。

高阻,即可以認為沒有輸出,作為輸出端口,對下級電路沒有任何影響。懸空,是針對輸入口而言,就是說沒有接輸入。在HDL語言中,高阻和懸空都是Z。

03

邊沿檢測

在程序設計過程中,經常需要檢測一個脈沖信號的上升沿或者下降沿,下面給大家介紹如何使用Verilog實現對脈沖信號的邊沿進行檢測。時鐘信號與脈沖信號如下圖所示。

a4601d10-9199-11ec-952b-dac502259ad0.png

Verilog代碼如下:

module edge_detection(  input        wire        clk,  input        wire        rst,  input        wire        sin_pulse,  output      wire        sout_r,  //上升沿檢測  output      wire        sout_f   //下降沿檢測    );//--------------------------------------------------------------------------------  reg              sin_reg0,sin_reg1;  //--------------------------------------------------------------------------------  always@(posedge  clk or posedge    rst)    begin      if(rst)        begin          sin_reg0 <= 0;          sin_reg1 <= 0;        end      else        begin          sin_reg0 <= sin_pulse;          sin_reg1 <= sin_reg0;        end    end//--------------------------------------------------------------------------------  assign  sout_r = sin_reg0 & (~sin_reg1); //上升沿檢測assignsout_f=(~sin_reg0)&sin_reg1;//下降沿檢測//--------------------------------------------------------------------------------
上述程序經過綜合后,其RTL結構如下圖所示,由兩個D觸發器和兩個與門組成。

a476de92-9199-11ec-952b-dac502259ad0.png

仿真后的結果如下圖所示,可以看出sout_r為上升沿檢測結果,sout_f為下降沿檢測結果。

a4901a2e-9199-11ec-952b-dac502259ad0.png

審核編輯:郭婷

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

    關注

    28

    文章

    1328

    瀏覽量

    109466
  • 代碼
    +關注

    關注

    30

    文章

    4575

    瀏覽量

    67135

原文標題:Verilog基礎知識學習筆記(一)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA設計經驗之邊沿檢測

    在同步電路設計中,邊沿檢測是必不可少的!
    發表于 03-01 09:59 ?4974次閱讀

    FPGA設計經驗:邊沿檢測

    在同步電路設計中,邊沿檢測是必不可少的!
    發表于 08-16 15:19 ?1809次閱讀
    FPGA設計經驗:<b class='flag-5'>邊沿</b><b class='flag-5'>檢測</b>

    verilog常用系統函數以及例子

    verilog常用系統函數以及例子
    發表于 08-15 15:49

    fpga應用篇(二):邊沿檢測

    `fpga應用篇(二):邊沿檢測上一篇介紹了阻塞賦值與非阻塞賦值,這次我們利用非阻塞賦值產生一個簡單的應用即邊沿檢測,邊沿
    發表于 04-06 21:28

    關于FPGA進行外部邊沿檢測,檢測不準確問題?

    程序邊沿檢測下降沿并統計數量(數量到達2后重新計數,并發送動作信號),但是最終發現檢測結果不準確,有時候能檢測到,有時候檢測不到。萬分感謝您
    發表于 08-21 12:58

    verilog實現定時器函數

    使用Verilog描述硬件的基本設計單元是模塊(module)。構建復雜的電子電路,主要是通過模塊的相互連接調用來實現的。模塊被包含在關鍵字module、endmodule之內。實際的電路元件。Verilog中的模塊類似C語言中的函數
    發表于 12-08 17:20 ?9842次閱讀

    邊沿檢測與提取-輪廓跟蹤知識詳解

    邊沿檢測與提取程序
    發表于 01-29 14:56 ?0次下載

    邊沿檢測的目的及電路原理分析

    邊沿檢測電路(edge detection circuit)是個常用的基本電路。所謂邊沿檢測就是對前一個clock狀態和目前clock狀態的比較,如果是由0變為1,能夠
    的頭像 發表于 11-19 07:09 ?1w次閱讀

    Verilog數字系統設計——任務和函數一(斐波那契數列)

    Verilog數字系統設計九任務和函數實驗1文章目錄Verilog數字系統設計九前言一、任務和函數
    發表于 12-05 19:06 ?9次下載
    <b class='flag-5'>Verilog</b>數字<b class='flag-5'>系統</b>設計——任務和<b class='flag-5'>函數</b>一(斐波那契數列)

    Verilog設計中函數和任務的作用分析

    任務和函數Verilog中用于描述常用的功能行為。與其在不同的地方復制相同的代碼,不如根據需求使用函數或任務,這是一種良好且常見的做法。為了便于代碼維護,最好使用子例程之類的函數或任
    的頭像 發表于 03-15 11:01 ?1558次閱讀

    FPGA學習-邊沿檢測技術

    所謂邊沿檢測,就是檢測輸入信號即上升沿或者下降沿的檢測。 邊沿檢測的電路很好實現:上一時刻為低電
    的頭像 發表于 11-26 10:20 ?1040次閱讀

    Verilog邊沿檢測的基本原理和代碼實現

    本文將從Verilog邊沿檢測的基本概念入手,介紹Verilog邊沿檢測的原理和應用代碼示例。
    的頭像 發表于 05-12 17:05 ?2547次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>邊沿</b><b class='flag-5'>檢測</b>的基本原理和代碼實現

    什么是邊沿檢測

    1、什么是邊沿檢測 邊沿檢測用于檢測信號的上升沿或下降沿,通常用于使能信號的捕捉等場景。 2、采用1級觸發器的
    的頭像 發表于 06-17 14:26 ?1725次閱讀
    什么是<b class='flag-5'>邊沿</b><b class='flag-5'>檢測</b>

    Verilog實現邊沿檢測的原理

    邊沿檢測大致分為:上升沿檢測,下降沿檢測和,雙沿檢測。原理都是通過比輸入信號快很多的時鐘去采集信號,當出現兩個連續的采集值不等的時候就是
    的頭像 發表于 06-28 15:19 ?1596次閱讀
    <b class='flag-5'>Verilog</b>實現<b class='flag-5'>邊沿</b><b class='flag-5'>檢測</b>的原理

    verilog function函數的用法

    Verilog 是一種硬件描述語言 (HDL),主要用于描述數字電子電路的行為和結構。在 Verilog 中,函數 (Function) 是一種用于執行特定任務并返回一個值的可重用代碼塊。函數
    的頭像 發表于 02-22 15:49 ?1936次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>