在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

FPGA設計案例:數據緩存模塊設計與驗證實驗

電子設計 ? 來源:csdn ? 作者:沒落騎士 ? 2020-12-28 13:06 ? 次閱讀

本文設計思想采用明德揚至簡設計法。上一篇博文中定制了自定義MAC IP的結構,在用戶側需要位寬轉換及數據緩存。本文以TX方向為例,設計并驗證發送緩存模塊。這里定義該模塊可緩存4個最大長度數據包,用戶根據需求改動即可。

該模塊核心是利用異步FIFO進行跨時鐘域處理,位寬轉換由VerilogHDL實現。需要注意的是用戶數據包位寬32bit,因此包尾可能有無效字節,而轉換為8bit位寬數據幀后是要丟棄無效字節的。內部邏輯非常簡單,直接上代碼:
`timescale 1ns / 1ps

// Description: MAC IP TX方向用戶數據緩存及位寬轉換模塊
// 整體功能:將TX方向用戶32bit位寬的數據包轉換成8bit位寬數據包
//用戶側時鐘100MHZ,MAC側125MHZ
//緩存深度:保證能緩存4個最長數據包,TX方向用戶數據包包括
//目的MAC地址 源MAC地址 類型/長度 數據 最長1514byte

module tx_buffer#(parameter DATA_W = 32)//位寬不能改動
(

//全局信號
input rst_n,//保證拉低三個時鐘周期,否則FIF可能不會正確復位

//用戶側信號
input user_clk,
input [DATA_W-1:0] din,
input din_vld,
input din_sop,
input din_eop,
input [2-1:0] din_mod,
output rdy,

//MAC側信號
input eth_tx_clk,
output reg [8-1:0] dout,
output reg dout_sop,
output reg dout_eop,
output reg dout_vld
);

reg wr_en = 0;
reg [DATA_W+4-1:0] fifo_din = 0;
reg [ (2-1):0] rd_cnt = 0 ;
wire add_rd_cnt ;
wire end_rd_cnt ;
wire rd_en;
wire [DATA_W+4-1:0] fifo_dout;
wire rst;
reg [ (2-1):0] rst_cnt =0 ;
wire add_rst_cnt ;
wire end_rst_cnt ;
reg rst_flag = 0;
wire [11 : 0] wr_data_count;
wire empty;
wire full;

/****************************************寫側*************************************************/
always @(posedge user_clk or negedge rst_n)begin
if(rst_n==1'b0)begin
wr_en end
else if(rdy)
wr_en end

always @(posedge user_clk or negedge rst_n)begin
if(rst_n==1'b0)begin
fifo_din end
else begin//[35] din_sop [34] din_eop [33:32] din_mod [31:0] din
fifo_din end
end

assign rdy = wr_data_count

/****************************************讀側*************************************************/

always @(posedge eth_tx_clk or negedge rst_n) begin
if (rst_n==0) begin
rd_cnt end
else if(add_rd_cnt) begin
if(end_rd_cnt)
rd_cnt else
rd_cnt end
end
assign add_rd_cnt = (!empty);
assign end_rd_cnt = add_rd_cnt && rd_cnt == (4)-1 ;

assign rd_en = end_rd_cnt;

always @(posedge eth_tx_clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout end
else if(add_rd_cnt)begin
dout end
end

always @(posedge eth_tx_clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout_vld end
else if(add_rd_cnt && ((rd_cnt dout_vld end
else
dout_vld end

always @(posedge eth_tx_clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout_sop end
else if(add_rd_cnt && rd_cnt == 0 && fifo_dout[35])begin
dout_sop end
else
dout_sop end

always @(posedge eth_tx_clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout_eop end
else if(add_rd_cnt && rd_cnt == 3 - fifo_dout[33:32] && fifo_dout[34])begin
dout_eop end
else
dout_eop end

/******************************FIFO復位邏輯****************************************/
assign rst = !rst_n || rst_flag;

always @(posedge user_clk or negedge rst_n)begin
if(!rst_n)begin
rst_flag end
else if(end_rst_cnt)
rst_flag end

always @(posedge user_clk or negedge rst_n) begin
if (rst_n==0) begin
rst_cnt end
else if(add_rst_cnt) begin
if(end_rst_cnt)
rst_cnt else
rst_cnt end
end
assign add_rst_cnt = (rst_flag);
assign end_rst_cnt = add_rst_cnt && rst_cnt == (3)-1 ;

//FIFO位寬32bit 一幀數據最長1514byte,即379個16bit數據
//FIFO深度:379*4 = 1516 需要2048
//異步FIFO例化
fifo_generator_0 fifo (
.rst(rst), // input wire rst
.wr_clk(user_clk), // input wire wr_clk 100MHZ
.rd_clk(eth_tx_clk), // input wire rd_clk 125MHZ
.din(fifo_din), // input wire [33 : 0] din
.wr_en(wr_en), // input wire wr_en
.rd_en(rd_en), // input wire rd_en
.dout(fifo_dout), // output wire [33 : 0] dout
.full(full), // output wire full
.empty(empty), // output wire empty
.wr_data_count(wr_data_count) // output wire [11 : 0] wr_data_count
);

endmodule

tx_buffer

接下來是驗證部分,也就是本文的重點。以下的testbench包含了最基本的測試思想:發送測試激勵給UUT,將UUT輸出與黃金參考值進行比較,通過記分牌輸出比較結果。
`timescale 1ns / 1ps

module tx_buffer_tb( );

parameter USER_CLK_CYC = 10,
ETH_CLK_CYC = 8,
RST_TIM = 3;

parameter SIM_TIM = 10_000;

reg user_clk;
reg rst_n;
reg [32-1:0] din;
reg din_vld,din_sop,din_eop;
reg [2-1:0] din_mod;
wire rdy;
reg eth_tx_clk;
wire [8-1:0] dout;
wire dout_sop,dout_eop,dout_vld;
reg [8-1:0] dout_buf [0:1024-1];
reg [16-1:0] len [0:100-1];
reg [2-1:0] mod [0:100-1];
reg err_flag = 0;

tx_buffer#(.DATA_W(32))//位寬不能改動
dut
(

//全局信號
.rst_n (rst_n) ,//保證拉低三個時鐘周期,否則FIF可能不會正確復位
.user_clk (user_clk) ,
.din (din) ,
.din_vld (din_vld) ,
.din_sop (din_sop) ,
.din_eop (din_eop) ,
.din_mod (din_mod) ,
.rdy (rdy) ,
.eth_tx_clk (eth_tx_clk) ,
.dout (dout) ,
.dout_sop (dout_sop) ,
.dout_eop (dout_eop) ,
.dout_vld (dout_vld)
);

/***********************************時鐘******************************************/
initial begin
user_clk = 1;
forever #(USER_CLK_CYC/2) user_clk = ~user_clk;
end

initial begin
eth_tx_clk = 1;
forever #(ETH_CLK_CYC/2) eth_tx_clk = ~eth_tx_clk;
end
/***********************************復位邏輯******************************************/
initial begin
rst_n = 1;
#1;
rst_n = 0;
#(RST_TIM*USER_CLK_CYC);
rst_n = 1;
end

/***********************************輸入激勵******************************************/
integer gen_time = 0;
initial begin
#1;
packet_initial;
#(RST_TIM*USER_CLK_CYC);
packet_gen(20,2);
#(USER_CLK_CYC*10);
packet_gen(30,1);
end

/***********************************輸出緩存與檢測******************************************/
integer j = 0;
integer chk_time = 0;
initial begin
forever begin
@(posedge eth_tx_clk)
if(dout_vld)begin
if(dout_sop)begin
dout_buf[0] = dout;
j = 1;
end
else if(dout_eop)begin
dout_buf[j] = dout;
j = j+1;
packet_check;
end
else begin
dout_buf[j] = dout;
j = j+1;
end
end
end
end

/***********************************score board******************************************/
integer fid;
initial begin
fid = $fopen("test.txt");
$fdisplay(fid," Start testing /n");
#SIM_TIM;
if(err_flag)
$fdisplay(fid,"Check is failed/n");
else
$fdisplay(fid,"Check is successful/n");
$fdisplay(fid," Testing is finished /n");
$fclose(fid);
$stop;
end

/***********************************子任務******************************************/
//包生成子任務
task packet_gen;
input [16-1:0] length;
input [2-1:0] invalid_byte;
integer i;
begin
len[gen_time] = length;
mod[gen_time] = invalid_byte;

for(i = 1;i if(rdy == 1)begin
din_vld = 1;
if(i==1)
din_sop = 1;
else if(i == length)begin
din_eop = 1;
din_mod = invalid_byte;
end
else begin
din_sop = 0;
din_eop = 0;
din_mod = 0;
end
din = i ;
end

else begin
din_sop = din_sop;
din_eop = din_eop;
din_vld = 0;
din_mod = din_mod;
din = din;
i = i - 1;
end

#(USER_CLK_CYC*1);
end
packet_initial;
gen_time = gen_time + 1;
end
endtask

task packet_initial;
begin
din_sop = 0;
din_eop = 0;
din_vld = 0;
din = 0;
din_mod = 0;
end
endtask

//包檢測子任務
task packet_check;
integer k;
integer num,packet_len;
begin
num = 1;
$fdisplay(fid,"%dth:Packet checking.../n",chk_time);
packet_len = 4*len[chk_time]-mod[chk_time];
if(j != packet_len)begin
$fdisplay(fid,"Length of the packet is wrong./n");
err_flag = 1;
disable packet_check;
end

for(k=0;k
if(k%4 == 3)begin
if(dout_buf[k] != num)begin
$fdisplay(fid,"Data of the packet is wrong!/n");
err_flag = 1;
end
num = num+1;
end
else if(dout_buf[k] != 0)begin
$fdisplay(fid,"Data of the packet is wrong,it should be zero!/n");
err_flag = 1;
end
end
chk_time = chk_time + 1;
end
endtask

endmodule

tx_buffer_tb

可見主要是task編寫及文件讀寫操作幫了大忙,如果都用眼睛看波形來驗證設計正確性,真的是要搞到眼瞎。為保證測試完備性,測試包生成task可通過輸入接口產生不同長度和無效字節數的遞增數據包。testbench中每檢測到輸出包尾指示信號eop即調用packet_check task對數值進行檢測。本文的testbench結構較具通用性,可以用來驗證任意對數據包進行處理的邏輯單元。

之前Modelsim獨立仿真帶有IP核的Vivado工程時經常報錯,只好使用Vivado自帶的仿真工具。一直很頭痛這個問題,這次終于有了進展!首先按照常規流程使用Vivado調用Modelsim進行行為仿真,啟動后會在工程目錄下產生些有用的文件,幫助我們脫離Vivado進行獨立仿真。

在新建Modelsim工程時,在紅框內選擇Vivado工程中
.sim -> sim_1 -> behav下的modelsim.ini文件。之后添加文件包括:待測試設計文件、testbench以及IP核可綜合文件。第三個文件在
.srcs -> sources_1 -> ip -> -> synth下。

o4YBAF9uIlCAEUzAAACig9pDNm4320.png

現在可以順利啟動仿真了。我們來看下仿真結果:

文件中信息打印情況:

從波形和打印信息的結果來看,基本可以證明數據緩存及位寬轉換模塊邏輯功能無誤。為充分驗證要進一步給出覆蓋率較高的測試數據集,后期通過編寫do文件批量仿真實現。在FPGAIC設計中,驗證占據大半開發周期,可見VerilogHDL的非綜合子集也是至關重要的,今后會多總結高效的驗證方法!

編輯:hfy


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

    關注

    1643

    文章

    21925

    瀏覽量

    612417
  • 數據緩存
    +關注

    關注

    0

    文章

    24

    瀏覽量

    7303
  • VerilogHDL
    +關注

    關注

    2

    文章

    39

    瀏覽量

    19300
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    MCU緩存設計

    MCU 設計通過優化指令與數據的訪問效率,顯著提升系統性能并降低功耗,其核心架構與實現策略如下: 一、緩存類型與結構 指令緩存(I-Cache)與數據
    的頭像 發表于 05-07 15:29 ?81次閱讀

    FPGA EDA軟件的位流驗證

    位流驗證,對于芯片研發是一個非常重要的測試手段,對于純軟件開發人員,最難理解的就是位流驗證。在FPGA芯片研發中,位流驗證是在做什么,在哪些階段需要做位流
    的頭像 發表于 04-25 09:42 ?389次閱讀
    <b class='flag-5'>FPGA</b> EDA軟件的位流<b class='flag-5'>驗證</b>

    FPGA開發任務

    流,增加FEC校驗,源時鐘同步,對數據編碼,輸出差分數字信號,通過連接器連接光電模塊,驅動光電模塊傳輸數據。 2)光電模塊輸出差分數字信號,
    發表于 04-22 18:46

    紫光同創FPGA教程:呼吸燈——盤古系列PGX-Nano開發板實驗例程

    用于數據緩存、DAC用于模擬信號測試驗證、esp32模組進行WIFI和藍牙透傳;預留豐富的擴展IO用于用戶驗證、測試外接模塊電路功能,一組串
    的頭像 發表于 04-14 09:59 ?200次閱讀
    紫光同創<b class='flag-5'>FPGA</b>教程:呼吸燈——盤古系列PGX-Nano開發板<b class='flag-5'>實驗</b>例程

    捕捉光的量子態:單光子信號驗證實驗揭秘

    傳統實驗設備的性能局限,打通量子理論教學與實驗驗證的“最后一公里”,構建直觀可靠的單光子觀測系統,成為推動量子技術普及的關鍵環節!某量子測控公司是一家專注于量子教
    的頭像 發表于 04-02 17:26 ?226次閱讀
    捕捉光的量子態:單光子信號<b class='flag-5'>驗證實驗</b>揭秘

    FPGA圖像處理基礎----實現緩存卷積窗口

    素行進行緩存與變換。由于在圖像處理過程中,經常會使用到卷積,因此需要對圖像進行開窗,然后將開窗得到的局部圖像與卷積核進行卷積,從而完成處理。 ??圖像數據一般按照一定的格式和時序進行傳輸,在我進行實驗的時候,處理圖像時,讓其以V
    的頭像 發表于 02-07 10:43 ?568次閱讀
    <b class='flag-5'>FPGA</b>圖像處理基礎----實現<b class='flag-5'>緩存</b>卷積窗口

    亞太區首座功率半導體動態可靠度驗證實驗室即將建立

    近日,艾默生測試與測量業務集團(前身為NI)與半導體封裝測試解決方案的專業品牌蔚華科技攜手宣布,雙方將共同建設亞太區首座功率半導體動態可靠度驗證實驗室。這一舉措旨在滿足亞太地區日益增長的功率半導體
    的頭像 發表于 01-15 16:48 ?560次閱讀

    蔚華科技與恩艾共建亞太首座功率半導體驗證實驗

    半導體封裝測試領域的知名品牌蔚華科技(TWSE: 3055)與經銷合作伙伴恩艾(由艾默生與NI聯合運營)近日宣布了一項重大合作計劃。雙方將攜手在亞太地區建立首座功率半導體動態可靠度驗證實驗室,旨在
    的頭像 發表于 01-14 14:34 ?404次閱讀

    基于Agilex 5 FPGA模塊系統介紹

    基于Agilex 5 FPGA模塊系統(SoM)是一種由英特爾的合作伙伴提供的生產就緒型解決方案,專門針對嵌入式應用。采用先進的Agilex 5 FPGA的SoM可以滿足邊緣應用日益增長的需求
    的頭像 發表于 12-19 17:10 ?604次閱讀
    基于Agilex 5 <b class='flag-5'>FPGA</b>的<b class='flag-5'>模塊</b>系統介紹

    緩存對大數據處理的影響分析

    緩存對大數據處理的影響顯著且重要,主要體現在以下幾個方面: 一、提高數據訪問速度 在大數據環境中,數據存儲通常采用分布式存儲系統,
    的頭像 發表于 12-18 09:45 ?530次閱讀

    HTTP緩存頭的使用 本地緩存與遠程緩存的區別

    :資源的特定版本標識,用于驗證資源是否被修改。 Last-Modified :資源最后修改時間,用于驗證資源是否被修改。 Vary :告訴緩存服務
    的頭像 發表于 12-18 09:41 ?347次閱讀

    緩存技術在軟件開發中的應用

    在現代軟件開發中,隨著數據量的爆炸性增長和用戶對響應速度的高要求,緩存技術成為了提升系統性能的重要手段。緩存技術通過將數據存儲在離用戶更近的位置,減少
    的頭像 發表于 12-18 09:32 ?575次閱讀

    探討移動設備中的緩存文件管理

    ? 本文發表于FAST 2022。 探討 緩存文件管理方法。本文 通過一個輕量級的基于機器學習的分類引擎來篩選和個性化管理緩存文件 ,實驗 在 華為P9 和 Mate30 兩部手機上進行 ,
    的頭像 發表于 11-28 11:50 ?880次閱讀
    探討移動設備中的<b class='flag-5'>緩存</b>文件管理

    緩存之美——如何選擇合適的本地緩存

    Guava cache是Google開發的Guava工具包中一套完善的JVM本地緩存框架,底層實現的數據結構類似于ConcurrentHashMap,但是進行了更多的能力拓展,包括緩存過期時間設置、
    的頭像 發表于 11-17 14:24 ?682次閱讀
    <b class='flag-5'>緩存</b>之美——如何選擇合適的本地<b class='flag-5'>緩存</b>?

    海靈犀FPGA基礎研學實驗

    海靈犀FPGA基礎研學實驗箱(EDU_H6_01_1V0)是由中科億海微電子科技(蘇州)有限公司(簡稱:中科億海微)自主研發設計的教學用具,由箱體、FPGA開發卡、LCD屏、USB下載線及相關
    的頭像 發表于 06-13 08:11 ?1191次閱讀
    海靈犀<b class='flag-5'>FPGA</b>基礎研學<b class='flag-5'>實驗</b>箱
    主站蜘蛛池模板: 黄色视屏在线免费播放 | 哪里可以看免费毛片 | 亚洲欧美日韩特级毛片 | 亚洲第一网站快活影院 | 日本免费色网站 | 97天天做天天爱夜夜爽 | 99久久99久久精品免费看子伦 | 香蕉视频在线观看国产 | 男人天堂网址 | 天天拍夜夜爽 | 色综合天天干 | 四虎影院免费在线 | 天天透天天射 | 久操视频在线免费观看 | 美女视频黄又黄又免费高清 | аⅴ资源中文在线天堂 | 欧美一级二级三级视频 | 国产精品欧美激情在线播放 | 久久女人网 | 色香蕉网站 | 三级欧美视频 | 亚洲www在线| 日本电影在线观看黄 | jizz 大全欧美 | 午夜视频www | 五月激情电影 | 四虎精品影院永久在线播放 | 一级特黄特色的免费大片视频 | 色综合激情 | 伊人丁香婷婷综合一区二区 | 俺去俺来也www色官网免费的 | www三级免费| 91免费视 | 成人高清毛片a | 天天摸天天看天天爽 | 亚洲五月激情 | 激情亚洲婷婷 | 日本黄色大全 | 天天骑天天干 | 四虎成人免费影院网址 | 成人网中文字幕色 |