实验:FPGA计算3行同列数据之和

实验要求:PC机通过串口发送3行数据(一行有56个数据,3行共有56*3=168个数据)给FPGA,FPGA计算3行同一列数据的和,并将结果通过串口返回给上位机。

实现方法:使用两个FIFO IP Core,将串口接收到的数据进行缓存,当第一个FIFO1的数据存满后,将FIFO1的数据读出来给FIFO2,当FIFO2的数据存满时,当前两个FIFO的数据和串口正在接收的数据就可以看做为三行数据了。我们将3行数据同时读出,进行求和,然后用串口发送到上位机,这里要注意的是三个数据必须对齐,要不然是最终结果是不正确的。我这里为了验证方便,只生成了一行16个数据。

  本设计是为了基于FPGA的Sobel边缘检测做基础,使用2/3个FIFO将图片数据缓存成3x3矩阵,不过偶然发现Xilinx也有shift_ram IP Core,这个IP简直是为生成3x3矩阵而生的,不过为了学习FIFO的使用,还是在这里用FIFO实现,我这里使用的是Xilinx的Vivado开发套件调用FIFO IP Core流程如下:

点击如图所示图标

按上图所示配置即可,这里的full信号是当FIFO写满后full会为1,否则为0,empty是当FIFO为空时FIFO为1,否则为0。 

这里设置读写位宽和深度,添加复位信号,注意Xilinx的FIFO是高电平复位,设置复位类型为异步复位。剩下的按如图设置即可。其他均保持默认,点击OK。

点击generate生成IP Core。

生成好两个FIFO之后,按照系统流图,还需要添加串口接收和发送模块,这里我们可以把以前做过的串口代码直接拿过来用,代码都是可以移植的只需要稍微修改端口顶层例化即可。按照系统框图把顶层例化好之后,接下来就是仿真了,真是惭愧我到现在才学会了串口的仿真技巧,其实是自己悟到的,如下图,我这里的串口接收是以发送波特率的16倍进行接收的,在仿真时,波特率9600还是很慢,所以,我直接将接收波特率这里设置成50Mhz的两个时钟周期,那么发送也就是32个50Mhz的时钟周期,这里是50Mhz的原因是因为但是写串口接收发送这块的时候,使用的板子的系统时钟是50Mhz,这里移植的时候也要注意,最好使用PLL将系统时钟分频成50Mhz再给接收发送这两个模块。

 //串口接收模块波特率查找表
always @(posedge mclk or negedge rst_n) begin
if(!rst_n)
bps_DR <= ;
else begin
case(baud_set)
: bps_DR <= ;//bps_9600x16
//0: bps_DR <= 1;//bps_9600x16 just test
: bps_DR <= ;//bps_19200x16
: bps_DR <= ;//bps_38400x16
: bps_DR <= ;//bps_57600x16
: bps_DR <= ;//bps_115200x16
default: bps_DR <= ;//bps_9600x16
endcase
end
end
//串口发送模块波特率查找表DR_LUT
always @(posedge mclk or negedge rst_n)begin
if(!rst_n)
bps_DR <= 'b0;
else begin
case(baud_set)
: bps_DR <= ;//bps_9600
//0: bps_DR <= 31;//bps_9600 just test
: bps_DR <= ;//bps_19200
: bps_DR <= ;//bps_38400
: bps_DR <= ;//bps_57600
: bps_DR <= ;//bps_115200
default: bps_DR <= ;//bps_9600
endcase
end
end

  那么参数调整小了,仿真这块这么写呢?在test_bench文件中,我直接调用上面的工程顶层和串口发送模块,只需要将发送模块的数据给顶层模块,这样就方便了查看接收模块是否正确,

 uart_fifo_tx uut_uart_fifo_tx(
.clk (clk),//125Mhz
.rst_n (rst_n),
.rs232_rx (rs232_rx),
.rs232_tx (rs232_tx)
); always # clk = ~clk; always # mclk = ~mclk; UART_Byte_Tx uut_UART_Byte_Tx(
.mclk (mclk),
.rst_n (rst_n),
.send_en (send_en),//时钟分频使能
.baud_set ('b0),//选择波特率
.data_byte (data_byte),//需要发送的信号
.uart_state (),//串口状态
.tx_done (),//标志串口结束信号
.rs232_tx (rs232_rx)//串口信号输出
);

  然后是写激励,在工程代码中我们尽量少用for循环,但是在测试文件中便可以使用for循环来减少激励的书写量,提高仿真效率,这里的#7040是我在上面仿真的时候计算出来的,为什么是延时7040呢?这是因为上面串口发送模块波特率设置的是32个50Mhz时钟周期,那么它就是每隔7040ns会发送一次,同样的接收模块也是每隔7040ns接收一次,所以我这里每隔7040ns给一次数据,就可以实现仿真上连续发送了。

 integer i;

 initial begin
clk = ;
mclk = ;
rst_n = ;
send_en = ;
data_byte = ;
#; rst_n = 'b1;
send_en = ;
for(i = ; i <= ; i = i + )begin
# data_byte = i;
end
end

  测试文件写好之后,便是最令人抓狂的调试过程了,不过只要你掌握了仿真的调试技巧,所有问题都会迎刃而解的,我学习了FPGA一年了,才终于学会了仿真技巧能力,下面是我仿真这个实验的波形图,上面设置了很多不同颜色,增加了仿真效率,modelsim虽然好用,但是用vivado级联modelsim还是很慢的,所以还不如直接用vivado自带的仿真工具isim,只要掌握了使用isim的仿真技巧,再大的工程仿真起来也不怕!关于isim的使用技巧可以参考我的另一篇博客:Isim你不得不知道的技巧(整理)。这虽然是ISE那个版本的isim但是使用起来还是一样的!

  这可能是我做过最漂亮的仿真了!

  最后下载板子进行功能验证,发送3组00-0f的数据,最后由串口返回上位机的数据查看,三行数据一列求和的结果是完全正确的。至此实验结束,下面要进入基于FPGA的Sobel边缘检测实验了。

转载请注明出处:NingHeChuan(宁河川)

个人微信订阅号:开源FPGANingHeChuan

如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/7261914.html

FPGA计算3行同列数据之和的更多相关文章

  1. Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法

    ☞ ░ 前往老猿Python博文目录 ░ 在前面老猿的文章中,<Python学习随笔:使用xlwings读取和操作Excel文件>.<Python学习随笔:使用xlwings读取和操 ...

  2. Excel 一张表最多能装下多少行多少列数据?

    一个工作簿可以装下255张,那么每张工作表可以装下多少行多少列数据呢? 1.任意打开或新建一个Excel文档. 2.在文档中,找到其左上角的"文件"按钮,点击选择"选项& ...

  3. 【面试总结-编程】多行两列数据,实现同key的value求和并输出

    一个文件,两列,多行. 第一列是字母,第二列是数字,同列数据之间通过空格分割. 统计首列字母相同的第二列之和. 样例输入: A 5 B 6 OO 7 A 6 A 2 OO 2 输出: A:13 B:6 ...

  4. Android Webservices 返回多行多列数据(Dataset)

    对于之前从事.net或者java开发人员,习惯了从后台获取网格数据(多行多列DataTable),但转行从事android开发,难免会不习惯 Android调用Webservice时,如果返回值是一个 ...

  5. easyUI datagrid 多行多列数据渲染异常缓慢原因以及解决方法

    原因 最近,在优化之前公司帮联想(外包)做的一个老的后台管理系统,由于项目是基于easy UI框架,页面是后台用jsp实现的,再加上在公司推行前后端分离的实践,大部分项目都基于vue采用前后端分离去实 ...

  6. mssql sqlserver 不固定行转列数据(动态列)

    转自:http://www.maomao365.com/?p=5471 摘要: 下文主要讲述动态行列转换语句,列名会根据行数据的不同, 动态的发生变化 ------------------------ ...

  7. oracle输出多行多列数据

    --方法一  匿名块中直接 dbms_output输出declare  v_sql    varchar2(200);  v_cursor sys_refcursor;  type v_type is ...

  8. linux 下awk后统计某一列数据之和简单的命令

    例如有文件test.txt格式如下: aaa:1 bbb:2 cat a|awk -F\: '{print"+"$2}'|xargs echo 0|bc -l

  9. postgresql 行转列,列转行后加入到一个整体数据

    这里行转列的基本思想就是使用max,因为其他列下面都是NULL,所以可以Max最后就只能得到有值的这行 普通的查询: SELECT icd , case when (ROW_NUMBER() OVER ...

随机推荐

  1. 带着问题写React Native原生控件--Android视频直播控件

    最近在做的采用React Native项目有一个需求,视频直播与直播流播放同一个布局中,带着问题去思考如何实现,能更容易找到问题关键点,下面分析这个控件解决方法: 现在条件:视频播放控件(开源的ijk ...

  2. Nmap脚本文件分析(AMQP协议为例)

    Nmap脚本文件分析(AMQP协议为例) 一.介绍 上两篇文章 Nmap脚本引擎原理   编写自己的Nmap(NSE)脚本,分析了Nmap脚本引擎的执行过程,以及脚本文件的编写,这篇文章将以解析AMQ ...

  3. java源码学习(二)Integer

    Integer类包含了一个原始基本类型int.Integer属性中就一个属性,它的类型就是int. 此外,这个类还提供了几个把int转成String和把String转成int的方法,同样也提供了其它跟 ...

  4. 【Android Developers Training】 85. 不要有冗余的下载

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 38. 文件共享需求

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. JavaScript面向对象轻松入门之多态(demo by ES5、ES6、TypeScript)

    多态(Polymorphism)按字面的意思就是"多种状态",同样的行为(方法)在不同对象上有不同的状态. 在OOP中很多地方都要用到多态的特性,比如同样是点击鼠标右键,点击快捷方 ...

  7. Unity 游戏框架搭建 (三) MonoBehaviour单例的模板

      上一篇文章讲述了如何设计C#单例的模板.也随之抛出了问题: 如何设计接收MonoBehaviour生命周期的单例的模板? 如何设计? 先分析下需求:   1.约束脚本实例对象的个数.   2.约束 ...

  8. 浅谈关于特征选择算法与Relief的实现

    一. 背景 1) 问题 在机器学习的实际应用中,特征数量可能较多,其中可能存在不相关的特征,特征之间也可能存在相关性,容易导致如下的后果: 1.     特征个数越多,分析特征.训练模型所需的时间就越 ...

  9. vue.js实现内部自定义指令和全局自定义指令------directive

    在Vue中,我们平时数据驱动视图时候,内部自带的指令有时候解决不了一些需求,这时候,Vue给我们一个很好用的东东 directive 这个单词是我们写自定义指令的关键字哦 之定义指令为我们提供了几个钩 ...

  10. 读书共享 Primer Plus C-part 8

    第十三章 文件输入/输出 fopen--fclose fopen 是文件的操作的开始 fclose是文件操作的结束 getc--putc getchar--putchar getc对应文件的获取单个字 ...