ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FIFO法生成3*3阵列-----图像处理

2021-07-06 14:30:26  阅读:172  来源: 互联网

标签:matrix 阵列 FIFO sys 图像处理 ----- rst 数据


FIFO法生成3*3阵列-----图像处理

原理

采用两个FIFO对数据进行缓存,两个FIFO输出的数据加上原始的图像数据构成三行数据(目的是取出3 * 3阵列中的3行),然后再对三行数据分别进行打三拍操作(目的是取出3行中的每3列)。还是原理图好理解以一个5 *5的数据为例生成3 * 3阵列,如下图所示。
在这里插入图片描述

具体方法

步骤一

为了模拟一幅图片,我是从ROM中读取25个数据的.MIF文件作为模拟一个5*5图片。通过行列计数使其作为一贞图片。
行列计数如下所示

//行计数器对像素时钟计数
always @(posedge sys_clk or negedge sys_rst_n) begin         
    if (!sys_rst_n)
        cnt_h <= 6'd0;                                  
    else begin
        if(cnt_h < H_TOTAL - 1'b1)                                               
            cnt_h <= cnt_h + 1'b1;                               
        else 
            cnt_h <= 6'd0;  
    end
end

//列计数器对行计数
always @(posedge sys_clk or negedge sys_rst_n) begin         
    if (!sys_rst_n)
        cnt_v <= 6'd0;                                  
    else if(cnt_h == H_TOTAL - 1'b1) begin
        if(cnt_v < V_TOTAL - 1'b1)                                               
            cnt_v <= cnt_v + 1'b1;                               
        else 
            cnt_v <= 6'd0;  
    end
end	 

生成的一贞图片仿真如下
在这里插入图片描述

步骤二

FIFO_1写前四行数据,从第一行读取数据读到最后一行。FIFO_2写前三行数据,从第二行读取数据到最后一行。这样就产生三行数据了。具体代码如下所示(以两个FIFO读请求为例)。

//产生读使能
always @(posedge clk or negedge rst) begin         
    if (!rst)
      rdreq1   <=  1'd0         ;   
	 else if (( cnt_v >= 6'd1 )  &&  ( cnt_h <= 6'd4 )  )
      rdreq1   <=  1'd1         ; 
	 else
	   rdreq1   <=  1'd0         ; 
end

always @(posedge clk or negedge rst) begin         
    if (!rst)
      rdreq2   <=  1'd0         ;   
	 else if (( cnt_v >= 6'd2 )  &&  ( cnt_h <= 6'd4 )  )
      rdreq2   <=  1'd1         ;
	 else
	   rdreq2   <=  1'd0         ; 	
end

这样三行数据就产生了,从第2行开始就产生了三行数据。如下图所示。
在这里插入图片描述

步骤三

对每行数据打三拍取出每行三列数据

always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        {matrix_p11, matrix_p12, matrix_p13} <= 24'h0;
        {matrix_p21, matrix_p22, matrix_p23} <= 24'h0;
        {matrix_p31, matrix_p32, matrix_p33} <= 24'h0;
    end
    else begin
        {matrix_p11, matrix_p12, matrix_p13} <= {matrix_p12, matrix_p13, row2_data  };
        {matrix_p21, matrix_p22, matrix_p23} <= {matrix_p22, matrix_p23, row1_data  };
        {matrix_p31, matrix_p32, matrix_p33} <= {matrix_p32, matrix_p33, row3_data  };
        end
end

产生3*3矩阵如下图所示
在这里插入图片描述
可以看出生成了1 2 3;6 7 8;11 12 13;等3 *3阵列。

注意

在传输数据的时候数据是流动的,我刚开始整得时候寻思3*3的阵列不应该是一个矩阵吗,但是这个矩阵映射到实际数据中心就是9根数据线对应矩阵位置输出的数据。哈哈 自己解释的 望见谅
一定要理解这个啊 这个矩阵和MATLAB中的矩阵不一样,在实际进行各种滤波边缘检测的时候都得用到生成3 *3阵列啊 哈哈 。

这个代码写的不太好,在行间隔设置时为了方便就只间隔了一个时钟周期,导致后面一堆打拍操作间隔太小。后续会优化哈哈 。但是理论绝对没问题啊哈哈 欢迎大家跟我讨论啊 。

标签:matrix,阵列,FIFO,sys,图像处理,-----,rst,数据
来源: https://blog.csdn.net/weixin_44939178/article/details/118516420

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有