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 条评论
登录 后参与评论

相关文章

来自专栏PaddlePaddle

PaddlePaddle发布v0.10.0版

我们非常高兴发布了PaddlePaddle V0.10.0版,并开放了新的Python API。 之前在v0.9.0版,完成一个训练或预测任务至少需要两份pyt...

3717
来自专栏macOS 开发学习

Mac开发跬步积累(一):Cocoa Drawing 之 NSImage imageNamed: 到底做了什么?

首先,NSImage提供了支持多种格式图像数据进行管理的api, 但是NSImage对被其管理的实际图像数据几乎是一无所知的,这是因为NSImage并没有直接与...

993
来自专栏lgp20151222

bootstrap的模态框

971
来自专栏云计算教程系列

如何在Ubuntu 14.04第1部分上查询Prometheus

Prometheus是一个开源监控系统和时间序列数据库。Prometheus最重要的一个方面是它的多维数据模型以及随附的查询语言。此查询语言允许您对维度数据进行...

1050
来自专栏性能与架构

Redis 内存优化案例

在Redis的配置文件中有这么两项配置: hash-max-ziplist-entries 512 hash-max-ziplist-value 64 其中...

3657

Ray:AI的分布式系统

随着机器学习算法和技术的进步,越来越多的机器学习应用程序需要多台机器,而且必须利用并行性。但是,在集群上进行机器学习的基础设施仍然是专门设置的。尽管针对特定用例...

42710
来自专栏文武兼修ing——机器学习与IC设计

P2P接口串行FIR设计

配置接口使用寄存器组实现,掉电丢失,因此每次使用之前需要进行配置FIR参数,配置接口时序如下所示:

1204
来自专栏大数据文摘

TensorFlow 1.2.0新版本发布:新增Intel MKL优化深度学习基元

3724
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 18 - TensorFlow 1.3.0安装手记

《TensorFlow从0到1》写到现在,TensorFlow的版本也从当时的1.1.0迭代到了8月初发布的1.3.0。可以预见在未来很长一段时间里,它仍会持...

3476
来自专栏ATYUN订阅号

将Keras深度学习模型部署为Web应用程序

建立一个很酷的机器学习项目确实很不错,但如果你希望其他人能够看到你的作品怎么办呢?当然,你可以将整个项目放在GitHub上,但这只能给程序员看,如果你想给自己家...

2281

扫码关注云+社区