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源创计划”,欢迎正在阅读的你也加入,一块儿分享。