一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Verilog系統(tǒng)函數(shù)和邊沿檢測

FPGA之家 ? 來源:時(shí)沿科技 ? 作者:Nemo_Yxc ? 2022-03-15 13:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

“本文主要分享了在Verilog設(shè)計(jì)過程中一些經(jīng)驗(yàn)與知識(shí)點(diǎn),主要包括Verilog仿真時(shí)常用的系統(tǒng)任務(wù)、雙向端口的使用(inout)、邊沿檢測”

01

仿真時(shí)常用的系統(tǒng)任務(wù)($display,$fopen,$fscanf,$fwrite($fdisplay),$fclose,$random,$stop)

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

  • $display

這個(gè)函數(shù)系統(tǒng)任務(wù)的作用是用來在控制臺(tái)輸出信息。

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

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

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

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

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

具體代碼如下:

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

仿真結(jié)果如下圖所示:

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

在第五行展示了換行功能;為了驗(yàn)證系統(tǒng)仿真時(shí)間,筆者這邊用flag參數(shù)拉高來測試時(shí)間,時(shí)間結(jié)果如下圖顯示,和顯示時(shí)間一致;

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

  • $fopen

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

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

  • $fscanf

函數(shù)功能:讀取txt(.dat)文件數(shù)據(jù),具體代碼如下:
//******************************   讀文件  $fscanf  *******************************  //宏定義,定義數(shù)據(jù)長度  `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;  //讀取函數(shù)  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]); //讀取十進(jìn)制          $fscanf(data_file1,"%h",Sig1[i]); //讀取十六進(jìn)制        end      $fclose(data_file0); ////關(guān)閉這個(gè)句柄      $fclose(data_file1); ////關(guān)閉這個(gè)句柄    end

仿真結(jié)果如下圖所示:

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

  • $fwrite$fdisplay

代碼如下所示:

//**************************   寫文件  $fwrite($fdisplay)  *************************  //******  $fwrite  寫下一個(gè)數(shù)不會(huì)自動(dòng)轉(zhuǎn)行,所以要加
  //將讀取的Sig0,Sig1重新寫進(jìn)兩個(gè)新的txt中  //定義句柄  integer   data_wr0;  integer   data_wr1;  integer  m;  //讀取函數(shù)  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寫十進(jìn)制    寫下一個(gè)數(shù)不會(huì)自動(dòng)轉(zhuǎn)行,所以要加
          $fwrite(data_wr1,"%h
",Sig1[m]); //向txt寫十六進(jìn)制   寫下一個(gè)數(shù)不會(huì)自動(dòng)轉(zhuǎn)行,所以要加
end      //關(guān)閉這個(gè)句柄      $fclose(data_wr0);      $fclose(data_wr1);    end
仿真結(jié)果如下所示

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

$fwrite和$fdisplay的區(qū)別,$fwrite寫下一個(gè)數(shù)不會(huì)自動(dòng)轉(zhuǎn)行,可以加 來轉(zhuǎn)行,$fdisplay則會(huì)自動(dòng)轉(zhuǎn)行。
  • $fdisplay

代碼如下所示:
//******  $fdisplay  //將讀取的Sig0,Sig1重新寫進(jìn)兩個(gè)新的txt中  //定義句柄  integer   data_wr2;  integer   data_wr3;  integer  j;  //讀取函數(shù)  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寫十進(jìn)制    寫下一個(gè)數(shù)會(huì)自動(dòng)轉(zhuǎn)行,所以不需要加
          $fdisplay(data_wr3,"%h",Sig1[j]); //向txt寫十六進(jìn)制   寫下一個(gè)數(shù)會(huì)自動(dòng)轉(zhuǎn)行,所以不需要加
end      //關(guān)閉這個(gè)句柄      $fclose(data_wr2);      $fclose(data_wr3);    end
仿真結(jié)果如下圖所示:

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

  • $fclose

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

暫停仿真。

02

雙向端口的使用(inout)

根據(jù)Verilog的語法定義,IO的端口可以定義為三種類型input、output和inout,其中inout為雙向端口。雙向端口通過控制三態(tài)門來實(shí)現(xiàn),其結(jié)構(gòu)框圖如下所示。

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

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

  • 當(dāng)T為0的時(shí)候,IO端電平=I端電平=O端電平;

真值表如下:

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

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

參考: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  );
仿真結(jié)果如下:

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

可以看出:

  • 當(dāng)T=1的時(shí)候,O端電平=IO端電平;

  • 當(dāng)T=0的時(shí)候,O端電平=IO端電平=I端電平。

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

03

邊沿檢測

在程序設(shè)計(jì)過程中,經(jīng)常需要檢測一個(gè)脈沖信號(hào)的上升沿或者下降沿,下面給大家介紹如何使用Verilog實(shí)現(xiàn)對(duì)脈沖信號(hào)的邊沿進(jìn)行檢測。時(shí)鐘信號(hào)與脈沖信號(hào)如下圖所示。

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;//下降沿檢測//--------------------------------------------------------------------------------
上述程序經(jīng)過綜合后,其RTL結(jié)構(gòu)如下圖所示,由兩個(gè)D觸發(fā)器和兩個(gè)與門組成。

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

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

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

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    29

    文章

    1367

    瀏覽量

    112270
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70733

原文標(biāo)題:Verilog基礎(chǔ)知識(shí)學(xué)習(xí)筆記(一)

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    FPGA設(shè)計(jì)經(jīng)驗(yàn)之邊沿檢測

    在同步電路設(shè)計(jì)中,邊沿檢測是必不可少的!
    發(fā)表于 03-01 09:59 ?5227次閱讀

    FPGA設(shè)計(jì)經(jīng)驗(yàn):邊沿檢測

    在同步電路設(shè)計(jì)中,邊沿檢測是必不可少的!
    發(fā)表于 08-16 15:19 ?2056次閱讀
    FPGA設(shè)計(jì)經(jīng)驗(yàn):<b class='flag-5'>邊沿</b><b class='flag-5'>檢測</b>

    verilog常用系統(tǒng)函數(shù)以及例子

    verilog常用系統(tǒng)函數(shù)以及例子
    發(fā)表于 08-15 15:49

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

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

    邊沿檢測設(shè)計(jì)報(bào)告

    邊沿檢測設(shè)計(jì)報(bào)告
    發(fā)表于 09-26 15:38

    關(guān)于FPGA進(jìn)行外部邊沿檢測,檢測不準(zhǔn)確問題?

    程序邊沿檢測下降沿并統(tǒng)計(jì)數(shù)量(數(shù)量到達(dá)2后重新計(jì)數(shù),并發(fā)送動(dòng)作信號(hào)),但是最終發(fā)現(xiàn)檢測結(jié)果不準(zhǔn)確,有時(shí)候能檢測到,有時(shí)候檢測不到。萬分感謝您
    發(fā)表于 08-21 12:58

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

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

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

    邊沿檢測電路(edge detection circuit)是個(gè)常用的基本電路。所謂邊沿檢測就是對(duì)前一個(gè)clock狀態(tài)和目前clock狀態(tài)的比較,如果是由0變?yōu)?,能夠
    的頭像 發(fā)表于 11-19 07:09 ?1.1w次閱讀

    Verilog HDL語言中任務(wù)與函數(shù)的比較

    其中,返回值的類型和位寬是可選項(xiàng),如果缺省會(huì)返回一位寄存器類型數(shù)據(jù)。Verilog HDL認(rèn)為函數(shù)的定義隱式地聲明了與函數(shù)同名的寄存器。函數(shù)的定義把
    的頭像 發(fā)表于 07-02 10:24 ?2652次閱讀

    剖析verilog2005的騷操作之對(duì)數(shù)函數(shù)

    小技巧分享: verilog下取對(duì)數(shù)其實(shí)可用$clog2這個(gè)系統(tǒng)函數(shù),和自己找代碼里面寫入function是同樣的效果,但是方便的多。這是verilog 2005就開始支持的標(biāo)準(zhǔn),所以
    的頭像 發(fā)表于 10-09 15:29 ?4848次閱讀
    剖析<b class='flag-5'>verilog</b>2005的騷操作之對(duì)數(shù)<b class='flag-5'>函數(shù)</b>

    FPGA學(xué)習(xí)-邊沿檢測技術(shù)

    所謂邊沿檢測,就是檢測輸入信號(hào)即上升沿或者下降沿的檢測。 邊沿檢測的電路很好實(shí)現(xiàn):上一時(shí)刻為低電
    的頭像 發(fā)表于 11-26 10:20 ?2226次閱讀

    Verilog邊沿檢測的基本原理和代碼實(shí)現(xiàn)

    本文將從Verilog邊沿檢測的基本概念入手,介紹Verilog邊沿檢測的原理和應(yīng)用代碼示例。
    的頭像 發(fā)表于 05-12 17:05 ?4907次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>邊沿</b><b class='flag-5'>檢測</b>的基本原理和代碼實(shí)現(xiàn)

    什么是邊沿檢測

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

    Verilog實(shí)現(xiàn)邊沿檢測的原理

    邊沿檢測大致分為:上升沿檢測,下降沿檢測和,雙沿檢測。原理都是通過比輸入信號(hào)快很多的時(shí)鐘去采集信號(hào),當(dāng)出現(xiàn)兩個(gè)連續(xù)的采集值不等的時(shí)候就是
    的頭像 發(fā)表于 06-28 15:19 ?3895次閱讀
    <b class='flag-5'>Verilog</b>實(shí)現(xiàn)<b class='flag-5'>邊沿</b><b class='flag-5'>檢測</b>的原理

    verilog function函數(shù)的用法

    Verilog 是一種硬件描述語言 (HDL),主要用于描述數(shù)字電子電路的行為和結(jié)構(gòu)。在 Verilog 中,函數(shù) (Function) 是一種用于執(zhí)行特定任務(wù)并返回一個(gè)值的可重用代碼塊。函數(shù)
    的頭像 發(fā)表于 02-22 15:49 ?7214次閱讀