01
系統框圖
什麼是FPGA操做web
你瞭解其中的奧祕嗎緩存
想知道更多?微信
跟小編一塊兒來學習吧編輯器
乒乓操做的處理流程爲:輸入數據經過「輸入數據選擇單元"將數據等時分配到兩個數據緩衝模塊中,在第一個緩衝週期,將輸入的數據流緩存到「數據緩衝模塊1"中,在第二個緩衝週期,經過「輸入數據單元」切換,將輸入的數據緩存到「數據緩衝模塊2’’,同時將「數據緩衝模塊1」緩存的第一個週期數據經過「數據選擇單元」的選擇,送到「數據流運算處理模塊’’進行處理,在第三個緩衝週期經過「輸入數據選擇單元"的再次切換,將輸入的數據流緩存到「數據緩衝模塊1」中,同時將「數據緩衝模塊2」緩存的第二個週期的數據經過「輸出數據選擇單元」的切換,送到「數據流運算處理模塊」進行運算處理。如此循環。學習
看完這段文字是否一臉茫然flex
別急,有更直觀的處理流程圖編碼
這樣是否更清楚了呢url
話很少說spa
接下來,讓咱們一塊兒來看幾種框圖吧.net
01
系統框圖
02
RTL級框圖
module pingpang( clk ,
rst_n ,
data_in , //輸入數據
data_out //輸出數據
);
input clk ;
input rst_n ;
input [7:0] data_in ;
output [7:0] data_out;
reg [7:0] data_out;
reg [7:0] buffer1 ; //緩存1
reg [7:0] buffer2 ; //緩存2
reg wr_flag ; //寫標誌, wr_flag = 0,寫buffer1,wr_flag = 1,寫buffer2
reg rd_flag ; //讀標誌, rd_flag = 0,讀buffer2,wr_flag = 1,讀buffer1
reg state ; //狀態機, 0:寫1讀2, 1:寫2讀1 ,狀態轉移和輸出分開編碼
always @ (posedge clk or negedge rst_n) //狀態轉移
begin
if(rst_n == 1'b0) state <= 1'b0;
else
begin
case(state)
1'b0 : state <= 1'b1;
1'b1 : state <= 1'b0;
default : state <= 1'b0;
endcase
end
end
always @ (state ) //狀態輸出
begin
case(state)
1'b0 : begin
wr_flag = 1'b0; //寫1
rd_flag = 1'b0; //讀2
end
1'b1 : begin
wr_flag = 1'b1; //寫2
rd_flag = 1'b1; //讀1
end
default : begin
wr_flag = 1'b0;
rd_flag = 1'b0;
end
endcase
end
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
buffer1 <= 8'b0;
buffer2 <= 8'b0;
end
else
begin
case(wr_flag)
1'b0 : buffer1 <= data_in; //wr_flag = 0 ,寫buffer1
2'b1 : buffer2 <= data_in; //wr_flag = 1 ,寫buffer2
default : begin
buffer1 <= 8'b0;
buffer2 <= 8'b0;
end
endcase
end
end
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0) data_out <= 8'b0;
else
begin
case(rd_flag)
1'b0 : data_out <= buffer2; //rd_flag = 0,讀buffer2
1'b1 : data_out <= buffer1; //rd_flag = 1,讀buffer1
default : data_out <= 8'b0 ;
endcase
end
end
endmodule
test bench:
module pingpang_tb_v;
// Inputs
reg clk ;
reg rst_n ;
reg [7:0] data_in;
// Outputs
wire [7:0] data_out;
// Instantiate the Unit Under Test (UUT)
pingpang uut (
.clk (clk ),
.rst_n (rst_n ),
.data_in (data_in ),
.data_out(data_out)
);
initial
begin
// Initialize Inputs
clk = 0;
rst_n = 0;
data_in = 0;
#100;
rst_n = 1;
end
always #10 clk = ~clk;
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0) data_in <= 8'b0;
else data_in <= data_in + 1'b1;
end
endmodule
03
綜合後頂層網表
本文分享自微信公衆號 - 瓜大三哥(xiguazai_tortoise)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。