7.3*3卷积核生成

news2024/11/18 2:52:24

1.卷积核

  在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。
  由于图像经过卷积操作后会减少两行两列,因此在生成卷积核的时候一般会对图像进行填充,填充的方式有加0,加1和复制边界三种方法。本文将会构建一个边沿复制的的卷积核模块,一个边沿填充0或者1的卷积核模块和一个边沿不填充的卷积核模块
在这里插入图片描述
在这里插入图片描述

2.边沿填充模式卷积核生成

2.1 具有边沿填充的卷积代码

  首先生成一个FWFT的FIFO模块,然后编写下面的卷积核模块

module 	padding_matrix #(
	parameter 	COL 	= 	1920 	 	,
	parameter 	ROW 	= 	1080 	 	,
	parameter 	PADDING = 	0 			
)(
 	input 	wire 			clk 		,
 	input 	wire 			rst_n 		,

 	input 	wire 	[7:0] 	data 		,
 	input 	wire 	 		data_de 	,
	input 	wire    [1:0] 	padding     , 

 	output 	wire  			matrix_de 	,
 	output 	reg 	[7:0] 	matrix11 	,
 	output 	reg 	[7:0] 	matrix12 	,
 	output 	reg 	[7:0] 	matrix13 	,
 	output 	reg 	[7:0] 	matrix21 	,
 	output 	reg 	[7:0] 	matrix22 	,
 	output 	reg 	[7:0] 	matrix23 	,
 	output 	reg 	[7:0] 	matrix31 	,
 	output 	reg 	[7:0] 	matrix32 	,
 	output 	reg 	[7:0] 	matrix33 	
);

reg 	[1:0] 	 data_de_r 	;
reg 	[7:0] 	 data_r1 	;
reg 	[7:0] 	 data_r2 	;

reg 	[15:0] 	 col_cnt 	;
reg 	[15:0] 	 row_cnt 	;	

reg 			data_valid 	;
reg 	[4:0]	data_valid_r;
reg 			fake_data_valid;

wire 	[7:0] 	row1_data 	;
wire 	[7:0] 	row2_data 	;
reg 	[7:0] 	row3_data 	;

always @(posedge clk )begin
	data_de_r <= {data_de_r[1:0],data_de};
	data_valid_r 	<= 	{data_valid_r[3:0],data_valid};
	data_r1 	<= 	data 		;
end
wire 	pos_data_de;
assign 	pos_data_de = {data_de_r[0],data_de} == 2'b01;

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		col_cnt 	<= 0;
	end
	else if(col_cnt == COL + 1)begin
		col_cnt 	<= 0;
	end
	else if(data_valid || fake_data_valid)begin
		col_cnt 	<= col_cnt + 1;
	end
end

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		row_cnt 	<= 0;
	end
	else if(col_cnt == COL + 1 && row_cnt == ROW )begin
		row_cnt	 	<= 0;
	end
	else if(col_cnt == COL + 1)begin
		row_cnt 	<= row_cnt + 1;
	end
end

always @(posedge clk or negedge rst_n) begin
	if (rst_n == 0) begin		
		fake_data_valid 	<= 0;
	end
	else if (data_valid_r[4] == 0 && row_cnt == ROW && col_cnt <= COL  ) begin
		fake_data_valid 	<= 1;
	end
	else begin
		fake_data_valid 	<= 	0;
	end
end

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		row3_data 	<= 0;
	end
	else if(col_cnt == 0 && pos_data_de && padding == 0)begin
		row3_data 	<= 0 ;
	end
	else if(col_cnt == 0 && pos_data_de && padding == 1)begin
		row3_data 	<= 8'hFF ;
	end
	else if(col_cnt == 0 && pos_data_de)begin
		row3_data 	<= data ;
	end
	else if(col_cnt == COL && data_de_r[1] && padding == 0)begin
		row3_data 	<= 0;
	end
	else if(col_cnt == COL && data_de_r[1] && padding == 1)begin
		row3_data 	<= 8'hFF;
	end
	else if(col_cnt == COL && data_de_r[1])begin
		row3_data 	<= row3_data;
	end
	else begin
		row3_data 	<= data_r1;
	end
end

always@(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		data_valid <= 0;
	end
	else if(data_de || data_de_r[1])begin
		data_valid <= 1'b1;
	end
	else begin
		data_valid <= 1'b0;
	end
end

wire 			rd_en 	;	

fifo_matrix_buf u1_fifo_matrix_buf (
	.rst 		(!rst_n		),  
	.wr_clk 	(clk  	 	),  
	.rd_clk 	(clk 	 	),  
	.din 		(row2_data 	),  
	.wr_en 		(data_valid ),  
	.rd_en 		(rd_en 	 	),  
	.dout 		(row1_data 	),  
	.full 		( 	 		),  
	.empty 		( 	 		)   
);

fifo_matrix_buf u2_fifo_matrix_buf (
	.rst 		(!rst_n		),  
	.wr_clk 	(clk  	 	),  
	.rd_clk 	(clk 	 	),  
	.din 		(row3_data 	),  
	.wr_en 		(data_valid ),  
	.rd_en 		(rd_en 		),  
	.dout 		(row2_data 	), 
	.full 		(   		),  
	.empty 		(    		)   
);

assign rd_en = (row_cnt > 0 & (data_valid | fake_data_valid) )? 1'b1 : 1'b0;

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		{matrix11,matrix12,matrix13} 	<= 	24'd0;
		{matrix21,matrix22,matrix23} 	<= 	24'd0;
		{matrix31,matrix32,matrix33} 	<= 	24'd0;
	end
	else if(rd_en)begin
 		if(row_cnt == 1)begin
			if (padding == 0) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,  	   0};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				
			end
			if (padding == 1) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,    8'hFF};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				
			end
			else begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row2_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				
			end
 		end	
 		else if (row_cnt == ROW) begin
			if (padding == 0) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,        0};				
			end
			else if(padding == 1) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,    8'hff};				
			end
			else begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row2_data};				
			end			
 		end
 		else begin
			{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
			{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
			{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};
 		end	
	end
end

reg 	[3:0] 	rd_en_r;
always @(posedge clk)begin
	rd_en_r 	<= 	{rd_en_r[2:0],rd_en};
end

assign 	matrix_de 	= 	rd_en_r[2] & rd_en_r[0] ;

endmodule 		

2.2 边沿填充的卷积核仿真代码

`timescale 1ns / 1ps

module img_gen
#(
 	parameter 	ACTIVE_IW 	= 	1920 	,
 	parameter 	ACTIVE_IH 	= 	1080 	,
 	parameter 	TOTAL_IW 	= 	2200 	,
 	parameter 	TOTAL_IH 	= 	1100 	,
 	parameter 	H_START 	= 	100 	,
 	parameter 	V_START 	= 	4 		 		
)(
	input 	wire 				clk 	,
	input 	wire 				rst_n 	,
	output 	reg 				vs 		,
	output 	reg  	 	 		de 		,
	output 	wire 	[7:0] 		data 	
);




reg 	[15:0] 	hcnt 	;
reg 	[15:0] 	vcnt 	;

reg 			h_de 	;
reg 			v_de  	;

reg  			index_de 	;
reg 	[31:0] 	index 	 	;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		hcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		hcnt <= 'd0;
	else 
		hcnt <= hcnt + 1'b1;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1 && vcnt == TOTAL_IH - 1)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		vcnt <= vcnt + 1'b1;
	else 
		vcnt <= vcnt;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vs <= 'd0;
	else if(vcnt>=2)
		vs <= 1'b1;
	else 
		vs <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		h_de <= 'd0;
	else if(hcnt >= H_START && hcnt < H_START + ACTIVE_IW)
		h_de <= 1'b1;
	else 
		h_de <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		v_de <= 'd0;
	else if(vcnt >= V_START && vcnt < V_START + ACTIVE_IH)
		v_de <= 1'b1;
	else 
		v_de <= 1'b0;


always @(posedge clk or negedge rst_n)
	if(!rst_n)
		index_de <= 'd0;
	else if(h_de == 1'b1 && v_de == 1'b1)
		index_de <= 1'b1;
	else 
		index_de <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		index <= 'd0;
	else if(index == ACTIVE_IW * ACTIVE_IH-1)
		index <= 0;
	else if(index_de == 1'b1)
		index <= index + 1;
	else 
		index <= index;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		de <= 'd0;
	else 
		de <= index_de;
assign 	data 	= index;
endmodule
`timescale 1ns / 1ps


module tb_matrix();

reg 	clk 	;
reg 	rst_n 	;

wire 	[7:0] 	data 	;
wire 			de  	;

wire 			vs  	;

wire 	[7:0] 	matrix11; 	
wire 	[7:0] 	matrix12; 	
wire 	[7:0] 	matrix13; 	
wire 	[7:0] 	matrix21; 	
wire 	[7:0] 	matrix22; 	
wire 	[7:0] 	matrix23; 	
wire 	[7:0] 	matrix31; 	
wire 	[7:0] 	matrix32; 	
wire 	[7:0] 	matrix33; 	

always #5 clk 	<= 	~clk;
initial 	begin
	clk 	<= 0;
	rst_n 	= 0;
	#2000
	rst_n 	= 1;
end

img_gen
#(
 	.ACTIVE_IW 	(5 	),
 	.ACTIVE_IH 	(5 	),
 	.TOTAL_IW 	(11 	),
 	.TOTAL_IH 	(11 	),
 	.H_START 	(4 	 	),
 	.V_START 	(4 	 	) 		
)u_img_gen(
	.clk 	 	(clk 	 	),
	.rst_n 	 	(rst_n 	 	),
	.vs 		(vs 		),
	.de 		(de 		),
	.data 	 	(data 	 	)
);

matrix #(
	.COL(5),
	.ROW(5)
)u_matrix(
 	.clk 	 	(clk 	 	),
 	.rst_n 	 	(rst_n 	 	),

 	.data 	 	(data 	 	),
 	.data_de  	(de 	  	),

 	.matrix11 	(matrix11 	),
 	.matrix12 	(matrix12 	),
 	.matrix13 	(matrix13 	),
 	.matrix21 	(matrix21 	),
 	.matrix22 	(matrix22 	),
 	.matrix23 	(matrix23 	),
 	.matrix31 	(matrix31 	),
 	.matrix32 	(matrix32 	),
 	.matrix33 	(matrix33 	)
);

reg 	vs_r 	;

always @(posedge clk)
	if(rst_n == 0)
		vs_r 	<= 1'b0;
	else 
		vs_r 	<= vs;

always @(posedge clk)
	if(~vs&&vs_r)
		$stop;
endmodule

2.3 边沿填充的卷积核仿真波形

  边沿复制后的数据为
在这里插入图片描述
  仿真波形为:
在这里插入图片描述
  可以看到3X3卷积模板生成无误。
  无边沿填充的卷积核只需要将martex

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1550302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day 36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

一遍过。首先把区间按左端点排序&#xff0c;然后右端点有两种情况。 假设是a区间&#xff0c;b区间。。。这样排列的顺序&#xff0c;那么 假设a[1]>b[0],如果a[1]>b[1]&#xff0c;就应该以b[1]为准&#xff0c;否则以a[1]为准。 class Solution { public:static bo…

一个基于.NET Core构建的简单、跨平台、模块化的商城系统

前言 今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费&#xff08;MIT License&#xff09;的商城系统&#xff1a;Module Shop。 商城后台管理端功能 商品&#xff1a;分类、品牌、单位、选项&#xff08;销售属性&#xff09;、属性、属性模…

人脸68关键点与K210疲劳检测

目录 人脸68关键点检测 检测闭眼睁眼 双眼关键点检测 计算眼睛的闭合程度&#xff1a; 原理: 设置阈值进行判断 实时监测和更新 拓展&#xff1a;通过判断上下眼皮重合程度去判断是否闭眼 检测嘴巴是否闭合 提取嘴唇上下轮廓的关键点 计算嘴唇上下轮廓关键点之间的距…

LangChain入门:2.OpenAPI调用ChatGPT模型

快速入门 本篇文章正式进入LangChain的编码阶段&#xff0c;今天实现的功能是使用OpenAPI调用ChatGPT模型来进行文本问答。 1. 申请OpenAPI的访问令牌 这里介绍两种获取到OpenAPI访问令牌的方式&#xff0c;大家按照自己需求进行选择&#xff0c;之后的文章我会基于第二种选…

政安晨:【深度学习神经网络基础】(二)—— 神经元与层

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 神经元是深度学习神经网络中的基本单元&#xff0c;模拟了…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节&#xff0c;包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时&#xff0c;尤其是面对海量数据时&#xff0c;需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议&#xff1a; 请求示…

DevSecOps平台架构系列-互联网企业私有化DevSecOps平台典型架构

目录 一、概述 二、私有化DevSecOps平台建设思路 2.1 采用GitOps公有云建设 2.2 采用GitOps私有云建设 2.3 总结 三、GitOps及其生态组件 3.1 采用GitOps的好处 3.1.1 周边生态系统齐全 3.1.2 便于自动化的实现 3.1.3 开发人员属性GitOps 3.2 GitOps部分生态组件介绍…

红黑树的Java实现

红黑树的Java实现 文章目录 红黑树的Java实现一、概述二、添加元素三、删除元素四、完整代码总结 一、概述 红黑树也是一种二叉平衡搜索树&#xff0c;向比与AVL树&#xff0c;是一种弱平衡树。因为AVL树是通过平衡因子&#xff0c;左右树的高度相差不能大于1来保证平衡&#…

实测梳理一下kafka分区分组的作用

清空topickafka-topics.sh --bootstrap-server localhost:9092 --delete --topic second创建分区kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic second发kafka-console-producer.sh --bootstrap-server localhos…

ospf实验

基础配置 如上图所示&#xff0c;按照上图所示的配置&#xff0c;俩个路由器之间按照12.12.12.X/30网段配置&#xff0c;左端的路由器和交换机之间按照192.168.1.X网段配置&#xff0c;右端的路由器和交换机之间按照192.168.2.X网段配置&#xff0c;下面的两个pc机按照所对应的…

Java 学习和实践笔记(48):怎样用二维数组来存储表格数据?

怎样用数组的方式&#xff0c;来存储下面这个表格的数据&#xff1f; 示例代码如下&#xff1a; import java.util.Arrays;public class Test001 {public static void main(String[] args) {/*object类对象是类层次结构的根。每个类都有Object作为超类。所有对象&#xff0c;包…

使用llamafile 构建本地大模型运用

安装 https://github.com/Mozilla-Ocho/llamafile 下载 大模型文件&#xff0c;选择列表中任意一个 wget https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4.llamafile?downloadtrue https://github.com/Mozilla-Ocho/llamafile?tabre…

软件部署资源计算工具:精确评估资源需求

软件部署资源计算工具&#xff1a;精确评估资源需求 在当今快速发展的信息技术时代&#xff0c;软件部署已成为企业运营不可或缺的一部分。然而&#xff0c;一个常见的挑战是如何精确评估软件部署所需的资源。资源评估不仅关系到软件的性能和稳定性&#xff0c;还直接影响到成…

区块链食品溯源案例实现(二)

引言 随着前端界面的完成&#xff0c;我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求&#xff0c;调用智能合约的方法获取食品溯源信息&#xff0c;并将结果返回给前端。 通过前后端的整合&#xff0c;我们可以构建一个食品溯源系统&#xf…

【第三方登录】Twitter

创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…

2018年亚马逊云科技推出基于Arm的定制芯片实例

2018年&#xff0c;亚马逊云技术推出了基于Arm的定制芯片。 据相关数据显示&#xff0c;基于Arm的性价比比基于x86的同类实例高出40%。 这打破了对 x86 的依赖&#xff0c;开创了架构的新时代&#xff0c;现在能够支持多种配置的密集计算任务。 这些举措为亚马逊云技术的其他创…

《数据结构学习笔记---第三篇》---单链表具体实现

目录 1.链表 1.1 链表的概念及结构 2.不带头单链表的实现 2.1创建头文件“SList.h” 2.2 创建具体接口实现文件SList.c 2.2.1打印 2.2.2申请链表结点 2.2.3创建一个长度为n的链表 2.2.4尾插尾删 2.2.5头插头删 2.2.6寻找x元素&#xff0c;返回pos 2.2.7插入和删除pos…

基于模糊控制算法的倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 对倒立摆模型进行模糊控制器simulink建模&#xff0c;利用倒立摆的摆角角度与小车的位置来控制小车的推力&#xff0c;控制了倒立摆的摆角问题&#xff0c;使得小车最终停在稳…

【Linux】Ubuntu20.04解决网卡、显卡驱动不正确的问题

文章目录 1、概述2、问题描述2.1、快捷栏无无线设置2.2、设置中无Wifi设置专栏2.3、接入外接屏幕无作用 3、网卡驱动解决方案3.1、在18.04的旧方法3.1.1、安装源更换3.1.1.1、备份原始安装源3.1.1.2、修改安装源地址3.1.1.3、更新源地址 3.1.2、安装依赖3.1.3、安装编译器3.1.3…

大模型精准度提升调研

如何让ChatGPT更靠谱 1. 预训练大模型概述 关于预训练 预训练&#xff08;Pre-training&#xff09;是深度学习中一种常见的技术&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;等领域中。它通常指在一个大型的、通常是…