FPGA乒乓操作你了解吗? 还不赶快来看

什么是FPGA操作

你了解其中的奥秘吗

想知道更多?

跟小编一起来学习吧

乒乓操作的处理流程为:输入数据通过“输入数据选择单元"将数据等时分配到两个数据缓冲模块中,在第一个缓冲周期,将输入的数据流缓存到“数据缓冲模块1"中,在第二个缓冲周期,通过“输入数据单元”切换,将输入的数据缓存到“数据缓冲模块2’’,同时将“数据缓冲模块1”缓存的第一个周期数据通过“数据选择单元”的选择,送到“数据流运算处理模块’’进行处理,在第三个缓冲周期通过“输入数据选择单元"的再次切换,将输入的数据流缓存到“数据缓冲模块1”中,同时将“数据缓冲模块2”缓存的第二个周期的数据通过“输出数据选择单元”的切换,送到“数据流运算处理模块”进行运算处理。如此循环。

看完这段文字是否一脸茫然

别急,有更直观的处理流程图

这样是否更清楚了呢

话不多说

接下来,让我们一起来看几种框图吧

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)

原文发表时间:2018-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区