Verilog生成矩阵一般是使用shift_ip核,但其实用两个FIFO也行。最近刚好学到这种方法,把原理总结一下。

要求

  现在有10x5的数据和对应数据有效指示信号,数据为0~49,要用FPGA对其生成3x3矩阵,以便后面进行一些矩阵运算。

第一步,计数器行列规划

  首先想到是计数,数据每来一个,cnt_col 就计1下,cnt_col 计满10下时再用cnt_row 计一下,cnt_row 共计5下,这样数据就变成了10x5,如下图所示:

第二步,FIFO形成三行数据

  用两个FIFO进行将数据进行缓存。数据来的时候FIFO_1就直接写入,最后两行则不写。来第二行数据的时候FIFO_2就写入,最后一行则不写。这里的行就是用到第一步的计数了。FIFO_1和FIFO_2共用读使能,来第三行数据时就一起读,这时第三行数据来了,配合FIFO_1和FIFO_2读出来的数据,刚好形成时序对齐的3行数据。

  如果所示,上图的FIFO_1写进的是0~29,从第三行开始读出的数据也依次是0~29,读到第5行的末尾刚好读干净全部数据。FIFO_2写进的是10~39,从第三行开始读出的数据也依次是10~39,读到第5行的末尾刚好读干净全部数据。

  即:FIFO_1写数据,最后两行数据不写进去;FIFO_2写数据,第一行数据和最后一行数据不写进去;FIFO_1和FIFO_2共用读使能,都从第三行数据刚开始时读。这时FIFO_1、FIFO_2、刚进来的din就形成了三行基本对齐的数据。这里形成了基本的对齐,可以直接进行仿真,看到不齐的地方再回来打拍是最好的方式,不断调整,最后完美对齐。例如你用的FIFO是Normal模式,那din打两拍后就是真正的完美对齐。

  这也给我一个看代码的启示,有时候看别人代码,这里打拍那里打拍,我绞尽脑汁的想也想不明白为什么,现在才知道很多地方的打拍没有那么多为什么,就是为了对齐时序,可能本来不齐,它打拍后就齐了。实在理解不来看看波形自然明白了。

  下面的仿真波形是形成三行数据后,每一列的三个数据进行相加,结果为dout。上面的紫色部分为输入信号,红色部分为计数信号,绿色部分为FIFO_1和FIFO_2的写相关信号,橙色部分为FIFO的读相关信号,下面的紫色部分是输出信号。可以看到din打了一拍后三行数据完美对齐:0、10、20,1、11、21......因为这里用的是Normal模式,所以最后输出时是先用rd_en打了一拍后才作为if条件输出dout,相加结果是完全正确的。仔细看波形,结合上面的示意图,发现FIFO的读写运用非常之完美,什么时候写,写多少个,什么时候读。这三个问题解决了答案就出来了。注意一下的是FIFO的深度是两行数据的个数,例如这里两行数据是20个,FIFO的深度选择比20更大的32就行了。不仅是这个10x5数据,就算是640x480这种大的像素数据也是一样的原理。

第三步,打拍形成矩阵

  这步其实最好理解,形成矩阵只需要一起打拍就OK了。要注意的是:在什么条件下进行打拍?答案是可以是FIFO的共同读使能信号rd_en或者进来的数据有效指示信号din_vld。用rd_en打拍,则后面的运算时前两行的数据是默认丢弃的,这在图像处理上经常用到。用din_vld打拍,则前两行数据是看做补0,也是经常用到的方法。例如新进来的数据在对齐那打了一拍,变成data,FIFO_1、FIFO_2读出的数据是q_1,q_2,那么他们三个信号一起打三拍,就形成了一个对齐的矩阵了。

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        {data_r3, data_r2, data_r1} <= {'b0};
        { q_2_r3,  q_2_r2,  q_2_r1} <= {'b0};
        { q_1_r3,  q_1_r2,  q_1_r1} <= {'b0};
    end
    else if(good_en)begin
        {data_r3, data_r2, data_r1} <= {data_r2, data_r1, data};
        { q_2_r3,  q_2_r2,  q_2_r1} <= { q_2_r2,  q_2_r1, q_2 };
        { q_1_r3,  q_1_r2,  q_1_r1} <= { q_1_r2,  q_1_r1, q_1 };
    end
end

  具体的代码就不贴了,原理已经说的很清楚了。学会形成矩阵对我们后续的算法处理非常的有帮助,本设计也是为了做后面的Sobel边缘检测做基础。

  其实生成矩阵用Shift_ip核更简单,下次再总结吧!

参考资料:[1] 威三学院FPGA教程

       [2] NingHeChuan.FPGA计算3行同列数据之和

FIFO形成3x3矩阵的更多相关文章

  1. NX二次开发-通过3x3矩阵获取XYZ轴矢量

    函数:UF_CSYS_ask_wcs() 函数说明:通过3x3矩阵获取XYZ轴矢量 用法: 1 #include <uf.h> 2 #include <uf_mtx.h> 3 ...

  2. NX二次开发-将3X3矩阵修正为正交且长度为单位长度的矩阵

    函数:UF_MTX3_ortho_normalize() 函数说明:将矩阵修正为正交且xyz长度为单位长度的矩阵.下图中输入的矩阵为三条线段的端点,经过修正后,生成一个坐标系. 1 #include ...

  3. RAM-Based Shift Register (ALTSHIFT_TAPS) IP Core-实现3X3像素阵列存储

    最近想要实现CNN的FPGA加速处理,首先明确在CNN计算的过程中,因为卷积运算是最耗时间的,因此只要将卷积运算在FPGA上并行实现,即可完成部分运算的加速 那么对于卷积的FPGA实现首先要考虑的是卷 ...

  4. 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)

    一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ①    基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ②    固定大小矩阵类必须在编译期间就知晓其维 ...

  5. 3D数学 矩阵常用知识点整理

    1.矩阵了解 1)矩阵的维度和记法 (先数多少行,再数多少列) 2)矩阵的转置 行变成列,第一行变成第一列...矩阵的转置的转置就是原矩阵            即        3)矩阵和标量的乘法 ...

  6. opengl矩阵向量

    如何创建一个物体.着色.加入纹理,给它们一些细节的表现,但因为它们都还是静态的物体,仍是不够有趣.我们可以尝试着在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动,但这太繁琐了,而且会消耗很多的处理 ...

  7. 【矩阵】RQ/QR 分解

    Multiple View Geometry in Computer Vision A.4.1.1 (page 579) 将一个 3x3 矩阵 $ A $ 进行 RQ 分解是将其分解成为一个上三角阵 ...

  8. 关于opengl中的矩阵平移,矩阵旋转,推导过程理解 OpenGL计算机图形学的一些必要矩阵运算知识

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12166896.html 为什么引入齐次坐标的变换矩阵可以表示平移呢? - Yu Mao的回答 ...

  9. FPGA实现-shift_ram_3x3矩阵

    shift_ram_3x3-FPGA实现 实现的方法为方法二,可以参考上一节关于中值滤波的介绍 shift_ram核介绍 https://www.cnblogs.com/ninghechuan/p/6 ...

随机推荐

  1. Windows异常分发函数---KiUserExceptionDispatcher

    简介 KiUserExceptionDispatcher 是SEH分发器的用户模式的负责函数.当一个异常发生的时候,该异常将生成一个异常事件,内核检查该异常是否是由于执行用户模式代码导致的.如果是这样 ...

  2. repo源

    [sdata-base] name=Base baseurl=http://xx.xx.xx.xx:4507/repo/$releasever/$basearch/base enabled=1 gpg ...

  3. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  4. 洛谷 P4822 [BJWC2012]冻结 题解

    P4822 [BJWC2012]冻结 题目描述 "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于 ...

  5. 【JOISC2018|2019】【20190622】minerals

    题目 交互题 有\(2n\)个物品,编号为\(1-2n\),存在唯一的两两配对关系,即有\(n\)种物品 有一个盒子,初始为空,盒子上会显示里面存在的物品种类数\(C\) 你每次操作可以将一个物品从盒 ...

  6. CSP2019自闭记

    为什么我之前没有写呢,是因为我总是考的太lj,于是就不想写了. 这次不管考没考好都要强迫自己写,因为这是第一次参加提高组+第一次参加CSP. 当然什么初赛/复赛试题/答案什么的是不会出现的. Day ...

  7. GoCN每日新闻(2019-10-11)

    GoCN每日新闻(2019-10-11) GoCN每日新闻(2019-10-11) 1. golang 将数据库转换为gorm结构 https://studygolang.com/articles/2 ...

  8. Java连接excel实现:通过姓名查找id和通过id查找姓名

    注意每个方法结束都要关闭workbook: 还有getIdbyname()方法中字符串flag与name的比较,一定要用equals()方法!!!: 剩下的不多解释,注释都在代码中: import j ...

  9. Markdown文字添加颜色

    转自:原文地址 添加红色 效果: 写法: $\color{red}{red}$ 添加绿色 效果: 写法: $\color{green}{green}$ 添加蓝色 效果: 写法: $\color{blu ...

  10. fastq 转换为 fasta

    使用 awk awk '{if(NR%4 == 1){print ">" substr($0, 2)}}{if(NR%4 == 2){print}}' XXX.fastq & ...