前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA乒乓操作你了解吗? 还不赶快来看

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

作者头像
瓜大三哥
发布2018-06-11 14:34:24
1.5K0
发布2018-06-11 14:34:24
举报
文章被收录于专栏:瓜大三哥瓜大三哥

什么是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

综合后顶层网表

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜大三哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档