欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

握手型接口的同步FIFO實(shí)現(xiàn)

冬至子 ? 來(lái)源:芯時(shí)代青年 ? 作者:尼德蘭的喵 ? 2023-12-04 14:03 ? 次閱讀

按照正常的思路,在前文完成前向時(shí)序優(yōu)化和后向時(shí)序優(yōu)化后,后面緊跟的應(yīng)該是雙向時(shí)序優(yōu)化策略了,不過不急,需要先實(shí)現(xiàn)一下握手型同步FIFO。本章所述的FIFO具備以下的特性:

1.寫入與讀出均采用握手型接口;
2.支持2的整數(shù)次與非整數(shù)次深度;
3.FIFO寫入數(shù)據(jù)至少一拍后才能讀出,不能bypass;
4.輸出邏輯為寄存器輸出;

接口

握手型同步FIFO,接口如下:

module sync_fifo #(
	parameter DEPTH = 8,
	parameter WIDTH = 32
)(
    input 		clk,
    input 		rst_n,
	
    input  		in_valid,
    input  [WIDTH -1:0] in_data,
    output 		in_ready,
	
    output		out_valid,
    output [WIDTH -1:0] out_data,
    input  		out_ready
);

localparam DP_WD = $clog2(DEPTH);

endmodule

鑒于并非所有的工具和版本都能很好的支持$clog2函數(shù),所以也可以將該函數(shù)展開來(lái)寫。

根據(jù)通常的設(shè)計(jì)要求,對(duì)外輸出的in_ready和out_valid最優(yōu)為寄存器輸出,以保證時(shí)序最優(yōu)。out_data雖然理論上要作為寄存器輸出,但是out_data可以接受有mux邏輯。不過這樣在深度較淺時(shí)時(shí)序會(huì)比較好,深度太深mux邏輯帶來(lái)的時(shí)序則不能忽略。

讀寫計(jì)數(shù)器

fifo采用傳統(tǒng)的讀寫兩個(gè)計(jì)數(shù)器模式,以寫計(jì)數(shù)器為例進(jìn)行說明,代碼如下:

//==================================================================
//寫入計(jì)數(shù)器
//==================================================================
reg  [DP_WD   :0]waddr;
wire             wenc;
wire             waddr_d_h;
wire [DP_WD -1:0]waddr_d_l;

assign wenc      = in_valid && in_ready;
assign waddr_d_h = (waddr[DP_WD-1:0] == DEPTH-1) ? ~waddr[DP_WD] : waddr[DP_WD];
assign waddr_d_l = (waddr[DP_WD-1:0] == DEPTH-1) ? {DP_WD{1'b0}} : waddr[DP_WD-1:0] + 1'b1;

always @(posedge clk or negedge rst_n)begin
	if(~rst_n)    waddr <= 0;
	else if(wenc) waddr <= {waddr_d_h, waddr_d_l};
end

地址指針waddr和raddr均比實(shí)際地址多一位,最高位用來(lái)指示套圈情況。當(dāng)waddr和raddr的最高位相同時(shí),fifo_cnt = waddr - raddr;當(dāng)waddr和raddr的最高位相反時(shí),fifo_cnt = DEPTH + waddr[ADDR_WIDTH-1:0] - raddr[ADDR_WIDTH-1:0]。

注意很多示意代碼會(huì)讓waddr一直累加翻轉(zhuǎn),這樣的做法對(duì)于2^N深度的FIFO是沒有問題的,而如果配置深度為非2^N深度則會(huì)出現(xiàn)跳轉(zhuǎn)錯(cuò)誤,因此在本代碼中將addr區(qū)分為H和L兩個(gè)區(qū)間,低位區(qū)間累加至DEPTH-1時(shí)高位區(qū)間翻轉(zhuǎn)。

讀出計(jì)數(shù)器的代碼同樣如此:

//==================================================================
//讀出計(jì)數(shù)器
//==================================================================
reg  [DP_WD   :0]raddr;
wire             renc;
wire             raddr_d_h;
wire [DP_WD -1:0]raddr_d_l;
assign renc = out_valid && out_ready;
assign raddr_d_h = (raddr[DP_WD-1:0] == DEPTH-1) ? ~raddr[DP_WD] : raddr[DP_WD];
assign raddr_d_l = (raddr[DP_WD-1:0] == DEPTH-1) ? {DP_WD{1'b0}} : raddr[DP_WD-1:0] + 1'b1;
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)    raddr <= 0;
	else if(renc) raddr <= {raddr_d_h, raddr_d_l};
end

深度計(jì)數(shù)器

通常FIFO的深度計(jì)數(shù)是通過waddr和raddr計(jì)算得到的,不過本文因?yàn)橄MP(guān)鍵輸出為寄存器輸出需要用到fifo_cnt_d,因此做了一個(gè)深度計(jì)數(shù)器:

//==================================================================
//深度計(jì)數(shù)器
//==================================================================
reg  [DP_WD :0]fifo_cnt_q;

wire [DP_WD :0]waddr_d = wenc ? {waddr_d_h, waddr_d_l} : waddr;
wire [DP_WD :0]raddr_d = renc ? {raddr_d_h, raddr_d_l} : raddr;
wire [DP_WD :0]fifo_cnt_d = (waddr_d[DP_WD] == raddr_d[DP_WD]) ? (waddr_d[DP_WD-1:0] - raddr_d[DP_WD-1:0]):
															     (waddr_d[DP_WD-1:0] + DEPTH - raddr_d[DP_WD-1:0]);
wire fifo_cnt_en = (wenc ^ renc);
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)    fifo_cnt_q <= 0;
	else if(fifo_cnt_en) fifo_cnt_q <= fifo_cnt_d;
end

數(shù)據(jù)寄存

數(shù)據(jù)寄存采用無(wú)復(fù)位寄存器以降低功耗,當(dāng)然也可以使用sram實(shí)現(xiàn),但是如果通過sram實(shí)現(xiàn)的話就需要考慮ram輸出的多一拍延遲了,如果深度不是很深的話,建議直接通過寄存器實(shí)現(xiàn)吧。

//==================================================================
//數(shù)據(jù)寄存
//==================================================================
reg [WIDTH -1:0]data[DEPTH];
always @(posedge clk or negedge rst_n)begin
	if(wenc) data[waddr[DP_WD-1:0]] <= in_data;
end
assign out_data = data[raddr[DP_WD-1:0]];

對(duì)外邏輯

in_ready實(shí)際就是常用FIFO的full信號(hào)取反,out_valid就是empty的取反,因此單純做邏輯是不難的。但是為了實(shí)現(xiàn)寄存器輸出,最后選擇了這樣的邏輯:

//==================================================================
//對(duì)外邏輯
//==================================================================
//assign in_ready  = (fifo_cnt_q < DEPTH);
//assign out_valid = (fifo_cnt_q > {DP_WD{1'b0}});
wire in_ready_en;
wire in_ready_d;
reg  in_ready_q;
assign in_ready_en = (out_valid && out_ready) || in_ready;
assign in_ready_d  = (fifo_cnt_d < DEPTH);
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)          in_ready_q <= 1;
	else if(in_ready_en)in_ready_q <= in_ready_d;
end

wire out_valid_en;
wire out_valid_d;
reg  out_valid_q;
assign out_valid_en = (in_valid && in_ready) || out_valid;
assign out_valid_d  = (fifo_cnt_d > {DP_WD{1'b0}});
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)           out_valid_q <= 0;
	else if(out_valid_en)out_valid_q <= out_valid_d;
end

assign in_ready  = in_ready_q;
assign out_valid = out_valid_q;

好的所有代碼就是這些,auto_testbench的結(jié)果:

圖片

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

    關(guān)注

    31

    文章

    5368

    瀏覽量

    121241
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1369

    瀏覽量

    115049
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2274

    瀏覽量

    95032
  • Mux
    Mux
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    23466
  • FIFO電路
    +關(guān)注

    關(guān)注

    1

    文章

    4

    瀏覽量

    4931
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    同步FIFO設(shè)計(jì)詳解及代碼分享

    FIFO (先入先出, First In First Out )存儲(chǔ)器,在 FPGA 和數(shù)字 IC 設(shè)計(jì)中非常常用。 根據(jù)接入的時(shí)鐘信號(hào),可以分為同步 FIFO 和異步 FIFO 。
    發(fā)表于 06-27 10:24 ?2239次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>設(shè)計(jì)詳解及代碼分享

    基于PCI接口芯片外擴(kuò)FIFO的FPGA實(shí)現(xiàn)

    介紹了PCI 9054 接口芯片的性能及數(shù)據(jù)傳輸特點(diǎn),提出了一種基于PCI 9054 外擴(kuò)異步FIFO(先進(jìn)先出)的FPGA(現(xiàn)場(chǎng)可編程門陣列)實(shí)現(xiàn)方法。由于PCI 9054 內(nèi)部FIFO
    發(fā)表于 01-06 15:20 ?44次下載

    人和機(jī)器人握手同步控制

    摘要:為實(shí)現(xiàn)人和機(jī)器人握手運(yùn)動(dòng)的同步,提出基于神經(jīng)振動(dòng)子同步控制的方法,并將此方法應(yīng)用于人和機(jī)器人握手的研究中。在現(xiàn)有神經(jīng)振動(dòng)子的基礎(chǔ)上,設(shè)
    發(fā)表于 07-12 10:20 ?29次下載

    Camera Link接口的異步FIFO設(shè)計(jì)與實(shí)現(xiàn)

    介紹了異步FIFO在Camera Link接口中的應(yīng)用,將Camera Link接口中的幀有效信號(hào)FVAL和行有效信號(hào)LVAL引入到異步FIFO的設(shè)計(jì)中。分析了FPGA中設(shè)計(jì)異步
    發(fā)表于 07-28 16:08 ?32次下載

    基于VHDL和FPGA的非對(duì)稱同步FIFO設(shè)計(jì)實(shí)現(xiàn)

    本文采用VHDL描述語(yǔ)言,充分利用Xilinx公司Spartan II FPGA的系統(tǒng)資源,設(shè)計(jì)實(shí)現(xiàn)了一種非對(duì)稱同步FIFO,它不僅提供數(shù)據(jù)緩沖,而且能進(jìn)行數(shù)據(jù)總線寬度的轉(zhuǎn)換。
    發(fā)表于 01-13 11:33 ?1985次閱讀

    自定義fifo接口控制器

    自定義fifo接口控制器,利用sopc builder實(shí)現(xiàn)
    發(fā)表于 03-22 14:09 ?1次下載

    基于FIFO的高速A_D和DSP接口設(shè)計(jì)

    基于FIFO的高速A_D和DSP接口設(shè)計(jì)
    發(fā)表于 10-19 14:10 ?9次下載
    基于<b class='flag-5'>FIFO</b>的高速A_D和DSP<b class='flag-5'>接口</b>設(shè)計(jì)

    同步FIFO之Verilog實(shí)現(xiàn)

    FIFO的分類根均FIFO工作的時(shí)鐘域,可以將FIFO分為同步FIFO和異步FIFO
    的頭像 發(fā)表于 11-01 09:57 ?2070次閱讀

    異步FIFO之Verilog代碼實(shí)現(xiàn)案例

    同步FIFO的意思是說FIFO的讀寫時(shí)鐘是同一個(gè)時(shí)鐘,不同于異步FIFO,異步FIFO的讀寫時(shí)鐘是完全異步的。
    發(fā)表于 11-01 09:58 ?1740次閱讀

    FIFO設(shè)計(jì)—同步FIFO

    FIFO是異步數(shù)據(jù)傳輸時(shí)常用的存儲(chǔ)器,多bit數(shù)據(jù)異步傳輸時(shí),無(wú)論是從快時(shí)鐘域到慢時(shí)鐘域,還是從慢時(shí)鐘域到快時(shí)鐘域,都可以使用FIFO處理。
    發(fā)表于 05-26 16:12 ?1556次閱讀
    <b class='flag-5'>FIFO</b>設(shè)計(jì)—<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>

    一個(gè)簡(jiǎn)單的RTL同步FIFO設(shè)計(jì)

    FIFO 是FPGA設(shè)計(jì)中最有用的模塊之一。FIFO 在模塊之間提供簡(jiǎn)單的握手同步機(jī)制,是設(shè)計(jì)人員將數(shù)據(jù)從一個(gè)模塊傳輸?shù)搅硪粋€(gè)模塊的常用選擇。
    發(fā)表于 06-14 08:59 ?488次閱讀

    基于寄存器的同步FIFO

    ? FIFO 是FPGA設(shè)計(jì)中最有用的模塊之一。FIFO 在模塊之間提供簡(jiǎn)單的握手同步機(jī)制,是設(shè)計(jì)人員將數(shù)據(jù)從一個(gè)模塊傳輸?shù)搅硪粋€(gè)模塊的常用選擇。 在這篇文章中,展示了一個(gè)簡(jiǎn)單的 R
    的頭像 發(fā)表于 06-14 09:02 ?813次閱讀

    基于Verilog的同步FIFO的設(shè)計(jì)方法

    同步FIFO的設(shè)計(jì)主要包括讀寫地址的產(chǎn)生、數(shù)據(jù)的讀寫、以及狀態(tài)的控制。下面我們將分別介紹這三個(gè)方面的設(shè)計(jì)。
    發(fā)表于 08-31 12:53 ?933次閱讀

    同步FIFO設(shè)計(jì)分析

    模塊雖小但是要有新意,首先寫一個(gè)同步FIFO,這是一個(gè)爛大街的入門級(jí)項(xiàng)目,但是我肯定不會(huì)寫的那么簡(jiǎn)單
    的頭像 發(fā)表于 09-11 17:11 ?678次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>設(shè)計(jì)分析

    同步FIFO和異步FIFO的區(qū)別 同步FIFO和異步FIFO各在什么情況下應(yīng)用

    簡(jiǎn)單的一種,其特點(diǎn)是輸入和輸出都與時(shí)鐘信號(hào)同步,當(dāng)時(shí)鐘到來(lái)時(shí),數(shù)據(jù)總是處于穩(wěn)定狀態(tài),因此容易實(shí)現(xiàn)數(shù)據(jù)的傳輸和存儲(chǔ)。 而異步FIFO則是在波形的上升沿和下降沿上進(jìn)行處理,在輸入輸出端口處分別增加輸入和輸出指針,用于管理數(shù)據(jù)的讀寫。
    的頭像 發(fā)表于 10-18 15:23 ?1779次閱讀