哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

FPGA設(shè)計案例:數(shù)據(jù)緩存模塊設(shè)計與驗(yàn)證實(shí)驗(yàn)

電子設(shè)計 ? 來源:csdn ? 作者:沒落騎士 ? 2020-12-28 13:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文設(shè)計思想采用明德?lián)P至簡設(shè)計法。上一篇博文中定制了自定義MAC IP的結(jié)構(gòu),在用戶側(cè)需要位寬轉(zhuǎn)換及數(shù)據(jù)緩存。本文以TX方向?yàn)槔O(shè)計并驗(yàn)證發(fā)送緩存模塊。這里定義該模塊可緩存4個最大長度數(shù)據(jù)包,用戶根據(jù)需求改動即可。

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

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

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

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

//用戶側(cè)信號
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側(cè)信號
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;

/****************************************寫側(cè)*************************************************/
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

/****************************************讀側(cè)*************************************************/

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復(fù)位邏輯****************************************/
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 一幀數(shù)據(jù)最長1514byte,即379個16bit數(shù)據(jù)
//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

接下來是驗(yàn)證部分,也就是本文的重點(diǎn)。以下的testbench包含了最基本的測試思想:發(fā)送測試激勵給UUT,將UUT輸出與黃金參考值進(jìn)行比較,通過記分牌輸出比較結(jié)果。
`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可能不會正確復(fù)位
.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
/***********************************復(fù)位邏輯******************************************/
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

/***********************************子任務(wù)******************************************/
//包生成子任務(wù)
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

//包檢測子任務(wù)
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編寫及文件讀寫操作幫了大忙,如果都用眼睛看波形來驗(yàn)證設(shè)計正確性,真的是要搞到眼瞎。為保證測試完備性,測試包生成task可通過輸入接口產(chǎn)生不同長度和無效字節(jié)數(shù)的遞增數(shù)據(jù)包。testbench中每檢測到輸出包尾指示信號eop即調(diào)用packet_check task對數(shù)值進(jìn)行檢測。本文的testbench結(jié)構(gòu)較具通用性,可以用來驗(yàn)證任意對數(shù)據(jù)包進(jìn)行處理的邏輯單元。

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

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

o4YBAF9uIlCAEUzAAACig9pDNm4320.png

現(xiàn)在可以順利啟動仿真了。我們來看下仿真結(jié)果:

文件中信息打印情況:

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

編輯:hfy


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

    關(guān)注

    1664

    文章

    22501

    瀏覽量

    639009
  • 數(shù)據(jù)緩存
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    7416
  • VerilogHDL
    +關(guān)注

    關(guān)注

    2

    文章

    39

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    請教:6G 確定性通信原型驗(yàn)證,FPGA+SDR 方案該怎么搭?

    平臺選什么型號更適合做低時延空口驗(yàn)證? 原型驗(yàn)證階段,最小可行驗(yàn)證系統(tǒng)應(yīng)該包含哪些模塊? 有沒有類似確定性通信 / 硬實(shí)時通信的原型參考方案? 純技術(shù)探討,不涉及商業(yè)項(xiàng)目,希望做原型
    發(fā)表于 04-11 10:24

    京東緩存中間件架構(gòu)與緩存內(nèi)核優(yōu)化

    一、京東緩存中間件架構(gòu) 1、背景 在當(dāng)今高并發(fā)、分布式的系統(tǒng)架構(gòu)中,緩存已成為提升應(yīng)用性能、降低數(shù)據(jù)庫負(fù)載的核心組件。隨著業(yè)務(wù)規(guī)模的擴(kuò)大與系統(tǒng)復(fù)雜度的增加,緩存的使用和管理面臨諸多挑戰(zhàn)
    的頭像 發(fā)表于 04-03 16:18 ?1806次閱讀
    京東<b class='flag-5'>緩存</b>中間件架構(gòu)與<b class='flag-5'>緩存</b>內(nèi)核優(yōu)化

    IoT智能模塊高速緩存核心IS61WV204816ALL-12B

    ISSI 32Mbit SRAM IS61WV204816ALL-12B為IoT智能模塊提供高速數(shù)據(jù)緩存,憑借12ns訪問速度、1.6V超低功耗及工業(yè)級溫度范圍,確保設(shè)備在實(shí)時數(shù)據(jù)處理
    的頭像 發(fā)表于 02-02 09:57 ?463次閱讀
    IoT智能<b class='flag-5'>模塊</b>高速<b class='flag-5'>緩存</b>核心IS61WV204816ALL-12B

    纖納光電助力國家光伏儲能實(shí)證實(shí)驗(yàn)平臺(大慶基地)四期工程建設(shè)

    近日,纖納光電成功向國家光伏、儲能實(shí)證實(shí)驗(yàn)平臺(大慶基地)四期工程出貨鈣鈦礦/晶硅疊層組件。這是纖納光電又一次出貨疊層組件,標(biāo)志著鈣鈦礦/晶硅疊層技術(shù)于實(shí)際應(yīng)用領(lǐng)域取得了重要進(jìn)展。
    的頭像 發(fā)表于 12-16 17:34 ?1395次閱讀

    基于FPGA的高效內(nèi)存到串行數(shù)據(jù)傳輸模塊設(shè)計

    本文介紹了一個基于FPGA的內(nèi)存到串行數(shù)據(jù)傳輸模塊,該模塊設(shè)計用來高效地處理存儲器中的數(shù)據(jù)并傳輸至串行接口。項(xiàng)目中自定義的“datamove
    的頭像 發(fā)表于 11-12 14:31 ?4487次閱讀
    基于<b class='flag-5'>FPGA</b>的高效內(nèi)存到串行<b class='flag-5'>數(shù)據(jù)</b>傳輸<b class='flag-5'>模塊</b>設(shè)計

    數(shù)據(jù)預(yù)處理軟核加速模塊設(shè)計

    ,如果用ARM處理器或上位機(jī)來實(shí)現(xiàn)這個過程會十分耗時,利用FPGA的并行處理技術(shù)可以輕易實(shí)現(xiàn)這個功能,整理后的數(shù)據(jù)傳輸形式會為之后的設(shè)計產(chǎn)生便利。模塊用了20塊片內(nèi)雙口RAM來實(shí)現(xiàn)數(shù)據(jù)
    發(fā)表于 10-29 08:09

    FPGA原型驗(yàn)證實(shí)戰(zhàn):如何應(yīng)對外設(shè)連接問題

    在芯片設(shè)計驗(yàn)證中,我們常常面臨一些外設(shè)連接問題:速度不匹配,或者硬件不支持。例如運(yùn)行在硬件仿真器或FPGA原型平臺上的設(shè)計,其時鐘頻率通常只有幾十MHz,甚至低至1MHz以下;而真實(shí)世界中的外設(shè)
    的頭像 發(fā)表于 10-22 10:28 ?618次閱讀
    <b class='flag-5'>FPGA</b>原型<b class='flag-5'>驗(yàn)證實(shí)</b>戰(zhàn):如何應(yīng)對外設(shè)連接問題

    【TES807】青翼凌云科技基于 XCKU115 FPGA 的雙 FMC 接口萬兆光纖傳輸信號處理平臺

    作為主處理器,FPGA 外掛兩組 72 位 DDR4 SDRAM,用來實(shí)現(xiàn)超大容量數(shù)據(jù)緩存,DDR4 的最高數(shù)據(jù)緩存帶寬可以達(dá)到2400M
    的頭像 發(fā)表于 08-29 15:57 ?652次閱讀
    【TES807】青翼凌云科技基于 XCKU115 <b class='flag-5'>FPGA</b> 的雙 FMC 接口萬兆光纖傳輸信號處理平臺

    Redis緩存的經(jīng)典問題和解決方案

    用戶瘋狂查詢數(shù)據(jù)庫中不存在的數(shù)據(jù),每次查詢都繞過緩存直接打到數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫壓力驟增。
    的頭像 發(fā)表于 08-20 16:24 ?888次閱讀

    高性能緩存設(shè)計:如何解決緩存偽共享問題

    緩存行,引發(fā)無效化風(fēng)暴,使看似無關(guān)的變量操作拖慢整體效率。本文從緩存結(jié)構(gòu)原理出發(fā),通過實(shí)驗(yàn)代碼復(fù)現(xiàn)偽共享問題(耗時從3709ms優(yōu)化至473ms),解析其底層機(jī)制;同時深入剖析高性能緩存
    的頭像 發(fā)表于 07-01 15:01 ?880次閱讀
    高性能<b class='flag-5'>緩存</b>設(shè)計:如何解決<b class='flag-5'>緩存</b>偽共享問題

    【高云GW5AT-LV60 開發(fā)套件試用體驗(yàn)】SC130GScmos模塊與LVDS屏和HDMI輸出例程測試報告

    FPGA內(nèi)部II2C控制模塊對CMOS進(jìn)行參數(shù)配置,圖像數(shù)據(jù)經(jīng)過FPGA內(nèi)部IP進(jìn)行MIPI解析轉(zhuǎn)為DVP并口數(shù)據(jù),再通過DDR
    發(fā)表于 06-08 23:35

    MCU緩存設(shè)計

    MCU 設(shè)計通過優(yōu)化指令與數(shù)據(jù)的訪問效率,顯著提升系統(tǒng)性能并降低功耗,其核心架構(gòu)與實(shí)現(xiàn)策略如下: 一、緩存類型與結(jié)構(gòu) 指令緩存(I-Cache)與數(shù)據(jù)
    的頭像 發(fā)表于 05-07 15:29 ?1276次閱讀

    Nginx緩存配置詳解

    Nginx 是一個功能強(qiáng)大的 Web 服務(wù)器和反向代理服務(wù)器,它可以用于實(shí)現(xiàn)靜態(tài)內(nèi)容的緩存緩存可以分為客戶端緩存和服務(wù)端緩存。
    的頭像 發(fā)表于 05-07 14:03 ?1377次閱讀
    Nginx<b class='flag-5'>緩存</b>配置詳解

    FPGA EDA軟件的位流驗(yàn)證

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

    FPGA開發(fā)任務(wù)

    流,增加FEC校驗(yàn),源時鐘同步,對數(shù)據(jù)編碼,輸出差分?jǐn)?shù)字信號,通過連接器連接光電模塊,驅(qū)動光電模塊傳輸數(shù)據(jù)。 2)光電模塊輸出差分?jǐn)?shù)字信號,
    發(fā)表于 04-22 18:46
    云龙县| 额尔古纳市| 启东市| 洛阳市| 南岸区| 嘉祥县| 浦东新区| 内乡县| 衢州市| 静海县| 定西市| 南溪县| 岱山县| 新乐市| 彭山县| 肥东县| 前郭尔| 利津县| 东乡| 连州市| 普兰店市| 永德县| 分宜县| 灵台县| 天长市| 长宁县| 阳城县| 枣阳市| 夏河县| 霍州市| 公安县| 石景山区| 长岛县| 赫章县| 三都| 遂平县| 台南县| 安阳县| 太白县| 固安县| 佳木斯市|