【Zedboard】FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现

本文主要是介绍【Zedboard】FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Zedboard】FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现

在项目开始到目前为止已经完成了在Zedboard的PL部分即FPGA上的对本视觉系统的所有工作。项目整体Block Design 图如下所示:
在这里插入图片描述
实物图:
在这里插入图片描述

灰度图显示
在这里插入图片描述
边缘提取对比RGB彩色图
在这里插入图片描述

(一)、配置摄像头传感器并完成完成图像实时采集:

(a)先介绍摄像头配置的模块:
本项目中使用的摄像头传感器芯片是OV5620,硬件接口上:支持标准的SCCB接口,兼容I2C接口,支持PMOD双排接口,本项目中使用的即为PMOD_5M双排接口。帧率:7.5—120fps。输出信号是10位的RGB RAW格式的图像数据。
OV5620的系统框图如图1-1所示:
图1-1
其Block Design模块如下图1-2所示:
1-2
按照OV5620数据手册,在配置摄像头模块中,采用的是I2C协议对OV5620的初始化寄存器进行配置。主要完成的配置信息如下:
图1-3
该配置信息,完成了对OV5620数据手册所描述的对RGB三色数据的增益、AWE增益、图像对比度增幅、输出图像分辨率大小的配置。I2C时序控制图入下图1-4所示。
图1-4
I2C_OV5620_Config模块的具体实现:

//
// Company: 
// Engineer: Tan junfu
// 
// Create Date: 2020/12/06 01:23:35
// Design Name: 
module I2C_OV5620_Config (	//	Host SideiCLK,iRST_N,//	I2C SideI2C_SCLK,I2C_SDAT	);
//	Host Side
input		iCLK;
input		iRST_N;
//	I2C Side
output		I2C_SCLK;
inout		I2C_SDAT;
//	Internal Registers/Wires
reg	[15:0]	mI2C_CLK_DIV;
reg	[23:0]	mI2C_DATA;
reg			mI2C_CTRL_CLK;
reg			mI2C_GO;
wire		mI2C_END;
wire		mI2C_ACK;
reg	[15:0]	LUT_DATA;
reg	[5:0]	LUT_INDEX;
reg	[3:0]	mSetup_ST;//	Clock Setting
parameter	CLK_Freq	=	50000000;	//	50	MHz
parameter	I2C_Freq	=	50000;		//	20	KHz
//	LUT Data Number
parameter	LUT_SIZE	=	18;/	I2C Control Clock	
always@(posedge iCLK or negedge iRST_N)
beginif(!iRST_N)beginmI2C_CTRL_CLK	<=	0;mI2C_CLK_DIV	<=	0;endelsebeginif( mI2C_CLK_DIV	< (CLK_Freq/I2C_Freq) )mI2C_CLK_DIV	<=	mI2C_CLK_DIV+1;elsebeginmI2C_CLK_DIV	<=	0;mI2C_CTRL_CLK	<=	~mI2C_CTRL_CLK;endend
end

I2C_Controller 	u0	(	.CLOCK(mI2C_CTRL_CLK),		//	Controller Work Clock.I2C_SCLK(I2C_SCLK),		//	I2C CLOCK.I2C_SDAT(I2C_SDAT),		//	I2C DATA.I2C_DATA(mI2C_DATA),		//	DATA:[SLAVE_ADDR,SUB_ADDR,DATA].GO(mI2C_GO),      			//	GO transfor.END(mI2C_END),				//	END transfor .ACK(mI2C_ACK),				//	ACK.RESET(iRST_N)	);

//	Config Control	
always@(posedge mI2C_CTRL_CLK or negedge iRST_N)
beginif(!iRST_N)beginLUT_INDEX	<=	0;mSetup_ST	<=	0;mI2C_GO		<=	0;endelsebeginif(LUT_INDEX<LUT_SIZE)begincase(mSetup_ST)0:	beginmI2C_DATA	<=	{8'h60,LUT_DATA};mI2C_GO		<=	1;mSetup_ST	<=	1;end1:	beginif(mI2C_END)/*beginif(!mI2C_ACK)mSetup_ST	<=	2;elsemSetup_ST	<=	0;							mI2C_GO		<=	0;*/begin//	mI2C_WR     <=	0;mI2C_GO		<=	0;if(~mI2C_ACK)			//ACK ACTIVEmSetup_ST	<=	2;	//INDEX ++elsemSetup_ST	<=	0;	//Repeat Transfer						endend2:	beginLUT_INDEX	<=	LUT_INDEX+1;mSetup_ST	<=	0;endendcaseendelsebegin//	Config_Done <= 1'b1;LUT_INDEX 	<= LUT_INDEX;mSetup_ST	<=	0;mI2C_GO		<=	0;//	mI2C_WR     <=	0;endend
end

/	Config Data LUT	  //	
always
begincase(LUT_INDEX)0	:	LUT_DATA	<=	16'h0000;1	:	LUT_DATA	<=	16'h1140;2	:	LUT_DATA	<=	16'h8107;//dsp	3	:	LUT_DATA	<=	16'hB8F0;//red Gain limit4	:	LUT_DATA	<=	16'hB9F0;//Green Gain limit5	:	LUT_DATA	<=	16'hBAF0;//blue Gain limit6	:	LUT_DATA	<=	16'h1620;//Green Gain7	:	LUT_DATA	<=	16'h0220;//Red Gain8	:	LUT_DATA	<=	16'h0120;//Blue Gain9	:	LUT_DATA	<=	16'h1240;//1280*96010	:	LUT_DATA	<=	16'h0cc8;//1280*960
//	11	:	LUT_DATA	<=	16'h1712;//H Start
//	12	:	LUT_DATA	<=	16'h18b4;//H End
//	13	:	LUT_DATA	<=	16'h1901;//V Start
//	14	:	LUT_DATA	<=	16'h1af4;//V End//9	:	LUT_DATA	<=	16'h1240;//1.3MEGA
default:		LUT_DATA	<=	16'dx ;endcase
end

endmodule

(二)、采集模块的设计

在这里插入图片描述

Capture_prepare模块是图像预处理模块,主要是由于寄存器配置好后或系统复位时会有1ms的延时(来自OV5620数据手册),并且前10帧数据也是不能使用的。因此该模块完成了采集延时处理与数据整合输出有效并且能够正确使用的图像数据。

constant模块是一些实际可调参数,比如画面分辨率,图像采集区域的坐标配置等。

CCD_Capture模块则是数据采集的主模块,完成下OV5620传感器像素时序下对原数据的采集与帧转化,并且标记每一帧的地址,与之后的缓存模块进行交互。

//
// Company: 
// Engineer: Tan junfu
// 
// Create Date: 2020/12/06 00:23:35
// Design Name: 
module CCD_Capture(	oDATA,oDVAL,oX_Cont,oY_Cont,oTX_Cont,oTY_Cont,oFrame_Cont,oSYNC,iX_POS,iY_POS,iDATA,iFVAL,iLVAL,iSTART,iEND,iCLK,iRST_N,ADDR);
//--------------------------------------------------//
parameter	DATA_SIZE	=	10;
//--------------------------------------------------//
input	[DATA_SIZE-1:0]	iDATA;
input			iFVAL;
input			iLVAL;
input			iSTART;
input			iEND;
input			iCLK;
input			iRST_N;
input		[15:0]	iX_POS;
input		[15:0]	iY_POS;
output	[DATA_SIZE-1:0]	oDATA;
output	[15:0]	oTX_Cont;
output	[15:0]	oTY_Cont;
output	[15:0]	oX_Cont;
output	[15:0]	oY_Cont;
output	[31:0]	oFrame_Cont;
output			oDVAL;
output			oSYNC;output reg  [18:0]  ADDR;reg		[15:0]	mX_POS;
reg		[15:0]	mY_POS;
reg				rSYNC;
reg	[15:0]	TX_Cont;
reg	[15:0]	TY_Cont;
reg	[15:0]	now_TX_Cont;
reg	[15:0]	now_TY_Cont;
reg				Pre_FVAL;
reg				Pre_LVAL;
reg				mCCD_FVAL;
reg				mCCD_LVAL;
reg				mPOS_VAL;
reg		[DATA_SIZE-1:0]	mCCD_DATA;
reg		[15:0]	X_Cont;
reg		[15:0]	Y_Cont;
reg		[31:0]	Frame_Cont;
reg				mSTART;assign	oX_Cont		=	X_Cont;
assign	oY_Cont		=	Y_Cont;
assign	oTX_Cont	=	TX_Cont;
assign	oTY_Cont	=	TY_Cont;
assign	oFrame_Cont	=	Frame_Cont;
assign	oDATA		=	mCCD_DATA;
assign	oDVAL		=	mCCD_FVAL&mCCD_LVAL&mPOS_VAL;
assign	oSYNC		=	rSYNC;always@(posedge iCLK or negedge iRST_N)
beginif(!iRST_N)mSTART	<=	0;elsebeginif(iSTART)mSTART	<=	1;if(iEND)mSTART	<=	0;		end
endreg [15:0] cnt;always@(posedge iCLK or negedge iRST_N)
beginif(!iRST_N)beginPre_FVAL	<=	0;mCCD_FVAL	<=	0;mCCD_LVAL	<=	0;mCCD_DATA	<=	0;X_Cont		<=	0;Y_Cont		<=	0;TX_Cont		<=	0;TY_Cont		<=	0;//mX_POS		<=iX_POS;//mY_POS		<=iY_POS;endelsebeginPre_FVAL	<=	iFVAL;Pre_LVAL	<=	iLVAL;if( ({Pre_FVAL,iFVAL}==2'b01) && mSTART )//if( ({Pre_FVAL,iFVAL}==2'b01))beginmCCD_FVAL	<=	1;rSYNC			<=	1;mX_POS		<=	iX_POS;mY_POS		<=	iY_POS;ADDR <= 0;endelse if({Pre_FVAL,iFVAL}==2'b10)beginmCCD_FVAL	<=	0;rSYNC		<=	0;if(cnt>10)begincnt<=0;TX_Cont<= now_TX_Cont;TY_Cont<= now_TY_Cont;endelse cnt<=cnt+1;endelse rSYNC		<=	0;mCCD_LVAL	<=	iLVAL;mCCD_DATA	<=	iDATA;if((X_Cont	>= mX_POS)	&&(X_Cont	<	mX_POS+640)&&	(Y_Cont	>=	mY_POS)	&&	(Y_Cont	<	mY_POS+480))beginmPOS_VAL	<=	1;ADDR <= ADDR +1;endelsemPOS_VAL	<=	0;if(Y_Cont	>=	mY_POS+480)ADDR<=0;if(mCCD_FVAL)beginrSYNC		<=	0;if(mCCD_LVAL)beginX_Cont	<=	X_Cont+1;now_TX_Cont<=X_Cont;
//				 if(ADDR<307199)
//				 if(TX_Cont<X_Cont)TX_Cont<=X_Cont;endelsebeginX_Cont	<=	0;endif({Pre_LVAL,iLVAL}==2'b01)  beginY_Cont	<=	Y_Cont+1;now_TY_Cont<=Y_Cont;if(TY_Cont<Y_Cont)TY_Cont<=Y_Cont;endendelse beginY_Cont<=0;endend
endalways@(posedge iCLK or negedge iRST_N)
beginif(!iRST_N)Frame_Cont	<=	0;elsebegin//if( ({Pre_FVAL,iFVAL}==2'b01) && mSTART )if( ({Pre_FVAL,iFVAL}==2'b01)  )Frame_Cont	<=	Frame_Cont+1;end
endendmodule

(三)、图像数据在DDR和BRAM中的两种缓存方案

本项目中两种技术方案均已实现,现在以BRAM为例说明:
Block Design图如下所示:
在这里插入图片描述
该模块完成了图像的帧缓存,采用双通道与流水线的设计,加快数据读写速度,提高了图像缓存的效率。由于Zedboard的VGA显示采用的是RGB444的格式,因此该RAM的深度也是12位。
使用多端口存储器并不能“真正意义”上地提高存储器的带宽,实际上,存储器的位宽和大小均没有发生变化。但是多端口存储器提供了多个存取接口,也就是多个数据总线和地址总线。多个端口可以同时提供读写功能,理论上将带宽提升了一倍。在本项目中使用多端口比不使用多端口快了1.56倍的读写速度。
为了提高时钟的利用效率,将存储器以一个与系统其他部分更高的速度运行,可以允许在一个系统时钟内对存储器进行两次或多次访问。存储器应该和时钟同步,这样能避免同步问题。双倍数据速率(DDR)存储器就是这样的一种存储器。它能在时钟的上升沿和下降沿各传送一次数据,即每个时钟周期传送两次数据。对于时钟速度较低或者具有高速存储器的系统来说,使用一个较高频率的RAM时钟才是可行的。
此外,当数据每隔几个时钟进入到流水线处理时,整个设计都能以较高的时钟速率运行。这种“多阶段”设计,时钟周期的数目或阶段与像素时钟有关。多阶段设计不仅增加了带宽,而且在不同阶段重复使用硬件而减少了计算硬件。
BRAM IP核配置过程:

在这里插入图片描述
在这里插入图片描述
模块例化:

frame_buffer u_fb (.clka(CMOS_PIXCLK),.wea(value_1),.addra(wr_address),.dina({mCMOS_R[9:6],mCMOS_G[9:6],mCMOS_B[9:6]}),.clkb(VGA_CTRL_CLK),.addrb(rd_address),.doutb({Image_Read_R[9:6],Image_Read_G[9:6],Image_Read_B[9:6]}));

(四)、图像处理

图像分析,主要完成了图像二值化、灰度图、边缘检测等分析算法。
二值化模块
在这里插入图片描述
灰度图模块
在这里插入图片描述

边缘检测模块
在这里插入图片描述
Sobel边缘提取核心代码

module SobelCore(input PCLK,input [11:0] VtcHCnt,input [10:0] VtcVCnt,input [23:0] RGB24, output reg[23:0] Sobel_Out);
reg Line_CLK;
wire [7:0] RED;
wire [7:0] GREEN;
wire [7:0] BLUE;
wire [7:0] GRAY;
wire [23:0] GRAY_reg;
reg [9:0] DOUT,DOUT_reg;
assign RED = RGB24[23:16];
assign GREEN = RGB24[15:8];
assign BLUE = RGB24[7:0];assign GRAY = RED*5/16 + GREEN*9/16 + BLUE*2/16;assign GRAY_reg ={GRAY,GRAY,GRAY};always@(posedge PCLK)beginif( VtcVCnt>0 && VtcVCnt<479) beginif(VtcHCnt==0)Line_CLK <= 1;elseLine_CLK <= 0;
end
endreg[1:0] state;
initial state = 0;always@(posedge Line_CLK)beginif(VtcVCnt==1)state <= 2'b00;else beginif(state == 2'b10)state <= 2'b00;else state <= state + 1;end
end reg[7:0]S_Window0;
reg[7:0]S_Window1;
reg[7:0]S_Window2;reg[7:0]LineBuffer0[639:0];
reg[7:0]LineBuffer1[639:0];
reg[7:0]LineBuffer2[639:0];always@(posedge PCLK)begincase(state)2'b00: beginLineBuffer0[VtcHCnt] <= GRAY;LineBuffer1[VtcHCnt] <= LineBuffer1[VtcHCnt];LineBuffer2[VtcHCnt] <= LineBuffer2[VtcHCnt];	S_Window0 <= GRAY;S_Window1 <= S_Window0;S_Window2 <= S_Window1;if(VtcHCnt>=2&&VtcVCnt>=3)beginif((S_Window0 + S_Window1*2 + S_Window2)>(LineBuffer1[VtcHCnt-2]+LineBuffer1[VtcHCnt-1]*2 +LineBuffer1[VtcHCnt]))DOUT_reg <= ((S_Window0 + S_Window1*2  + S_Window2 -LineBuffer1[VtcHCnt-2]-LineBuffer1[VtcHCnt-1]*2  -LineBuffer1[VtcHCnt]))/4;elseDOUT_reg <= (LineBuffer1[VtcHCnt-2]+LineBuffer1[VtcHCnt-1]*2  +LineBuffer1[VtcHCnt]-(S_Window0 + S_Window1*2  + S_Window2))/4;end end 2'b01: beginLineBuffer1[VtcHCnt] <= GRAY;LineBuffer0[VtcHCnt] <= LineBuffer0[VtcHCnt];LineBuffer2[VtcHCnt] <= LineBuffer2[VtcHCnt];		 S_Window0 <= GRAY;S_Window1 <= S_Window0;S_Window2 <= S_Window1;if(VtcHCnt>=2&&VtcVCnt>=3)beginif((S_Window0 + S_Window1 *2 + S_Window2)>(LineBuffer2[VtcHCnt-2]+LineBuffer2[VtcHCnt-1]*2  +LineBuffer2[VtcHCnt]))DOUT_reg <= ((S_Window0 + S_Window1*2  + S_Window2 -LineBuffer2[VtcHCnt-2]-LineBuffer2[VtcHCnt-1] *2 -LineBuffer2[VtcHCnt]))/4;elseDOUT_reg <= (LineBuffer2[VtcHCnt-2]+LineBuffer2[VtcHCnt-1] *2 +LineBuffer2[VtcHCnt]-(S_Window0 + S_Window1*2  + S_Window2))/4;	end		   end2'b10: beginLineBuffer2[VtcHCnt] <= GRAY;	 LineBuffer0[VtcHCnt] <= LineBuffer0[VtcHCnt];LineBuffer1[VtcHCnt] <= LineBuffer1[VtcHCnt];	S_Window0 <= GRAY;S_Window1 <= S_Window0;S_Window2 <= S_Window1;if(VtcHCnt>=2&&VtcVCnt>=3)beginif((S_Window0 + S_Window1*2  + S_Window2)>(LineBuffer0[VtcHCnt-2]+LineBuffer0[VtcHCnt-1] *2 +LineBuffer0[VtcHCnt]))DOUT_reg <= ((S_Window0 + S_Window1*2  + S_Window2 -LineBuffer0[VtcHCnt-2]-LineBuffer0[VtcHCnt-1]*2  -LineBuffer0[VtcHCnt]))/4;elseDOUT_reg <= (LineBuffer0[VtcHCnt-2]+LineBuffer0[VtcHCnt-1]*2  +LineBuffer0[VtcHCnt]-(S_Window0 + S_Window1*2  + S_Window2))/4;endenddefault:	beginDOUT_reg <= DOUT_reg;LineBuffer0[VtcHCnt] <= LineBuffer0[VtcHCnt];LineBuffer1[VtcHCnt] <= LineBuffer1[VtcHCnt];	LineBuffer2[VtcHCnt] <= LineBuffer2[VtcHCnt];	endendcaseend always@(*)beginSobel_Out = {DOUT_reg[7:0],DOUT_reg[7:0],DOUT_reg[7:0]};
endendmodule

最终经过RGB565转化到RGB444格式:
在这里插入图片描述

(五)、VGA显示

关于VGA_display模块的代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Tan junfu
// 
// Create Date: 2020/12/06 01:23:35
// Design Name: module                  vga_display(
input                   clk25              ,
output   [3:0]          vga_red             ,
output   [3:0]          vga_green           ,
output   [3:0]          vga_blue            ,
output                  vga_hsync           ,
output                  vga_vsync           ,
output   [9:0]          HCnt                ,
output   [9:0]          VCnt                ,
output   [18:0]         frame_addr          ,
input    [11:0]         frame_pixel);//parameters define
parameter hRez        = 640;      
parameter hStartSync  = 640+16;   
parameter hEndSync    = 640+16+96;
parameter hMaxCount   = 800;      parameter vRez        = 480;      
parameter vStartSync  = 480+10;   
parameter vEndSync    = 480+10+2; 
parameter vMaxCount   = 480+10+2+3;parameter hsync_active = 0;    
parameter vsync_active = 0;    reg [9:0]         hCounter=0 ;
reg [9:0]         vCounter=0	;
reg [18:0]        address =0;
reg               blank   =1; 
reg vga_hsync_reg           ;
reg vga_vsync_reg           ;assign frame_addr = address;
assign	HCnt = hCounter;
assign	VCnt = vCounter;always@(posedge clk25)beginif ( hCounter == hMaxCount-1) beginhCounter <= 0;if (vCounter == vMaxCount-1) vCounter <= 0;elsevCounter <= vCounter+1;end elsehCounter <= hCounter+1;endreg [3:0] vga_red_reg;
reg [3:0] vga_green_reg;
reg [3:0] vga_blue_reg;assign    vga_red    =   vga_red_reg  ;
assign    vga_green  =     vga_green_reg;
assign    vga_blue   =    vga_blue_reg   ;always@(posedge clk25)beginif(blank == 0 )beginvga_red_reg   <= frame_pixel[11:8];vga_green_reg <= frame_pixel[7:4];vga_blue_reg  <= frame_pixel[3:0];  endelse beginvga_red_reg  <= 4'b0000;vga_green_reg<= 4'b0000; vga_blue_reg <= 4'b0000; end
endalways@(posedge clk25)beginif (vCounter  >= vRez) beginaddress <= 0;blank <= 1;endelse beginif (hCounter < 640) beginblank <=0;address <= address+1;endelseblank <= 1;end 
end		always@(posedge clk25)beginif (hCounter > hStartSync && hCounter <= hEndSync) vga_hsync_reg <= hsync_active;elsevga_hsync_reg <= ~hsync_active;
end	always@(posedge clk25)beginif (vCounter >= vStartSync && vCounter < vEndSync) vga_vsync_reg <= vsync_active;elsevga_vsync_reg <= ~vsync_active;
end				assign vga_vsync =	vga_vsync_reg;	
assign vga_hsync =	vga_hsync_reg;	endmodule

(六)、最终图像显示效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(六)、项目中遇到的问题与解决方法

难题一:VGA成像失败,显示器呈花屏。
解决方法:认真检查数据位,最终发现是RGB处理模块映射后高低位需要转换。并且需要从RGB565取高位后到RGB444格式再传入VGA接口。转换模块如下:
在这里插入图片描述
难题二:采集失败,显示器呈黑屏,无数据。
解决方法:通过仿真得知,摄像头在初始化和复位后的前10~20帧数据是无效的,输出的数据并不是采集的真实图像数据。故做了延时模块,添加了帧计数器,并成功解决。
在这里插入图片描述
难题三:加入了算法模块即——二值化转换后画面混乱,无法正常观测图像。
解决方法:使用锁相环PLL时钟分频IP核,重新分配VGA显示模块与算法模块的时钟,因为从RAM中取出图像数据成像时,要使用独立时钟源。

约束文件

set_property PACKAGE_PIN W11 [get_ports CMOS_PIXCLK]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets {CMOS_PIXCLK}]
set_property IOSTANDARD LVCMOS33 [get_ports CMOS_PIXCLK]
set_property IOSTANDARD LVCMOS33 [get_ports CMOS_STANDBY]
set_property PACKAGE_PIN A4 [get_ports CMOS_STANDBY]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_CTRL_CLK]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {CMOS_DATA[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Blue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Blue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Blue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Blue[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Green[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Green[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Green[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Green[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Red[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Red[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Red[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_Red[0]}]
set_property PACKAGE_PIN Y11 [get_ports {CMOS_DATA[9]}]
set_property PACKAGE_PIN A11 [get_ports {CMOS_DATA[8]}]
set_property PACKAGE_PIN W12 [get_ports {CMOS_DATA[7]}]
set_property PACKAGE_PIN V12 [get_ports {CMOS_DATA[6]}]
set_property PACKAGE_PIN AA9 [get_ports {CMOS_DATA[5]}]
set_property PACKAGE_PIN AA8 [get_ports {CMOS_DATA[4]}]
set_property PACKAGE_PIN Y10 [get_ports {CMOS_DATA[3]}]
set_property PACKAGE_PIN AB9 [get_ports {CMOS_DATA[2]}]
set_property PACKAGE_PIN AA11 [get_ports {CMOS_DATA[1]}]
set_property PACKAGE_PIN AB10 [get_ports {CMOS_DATA[0]}]
set_property PACKAGE_PIN Y21 [get_ports {VGA_Blue[0]}]
set_property PACKAGE_PIN Y20 [get_ports {VGA_Blue[1]}]
set_property PACKAGE_PIN AB20 [get_ports {VGA_Blue[2]}]
set_property PACKAGE_PIN A19 [get_ports {VGA_Blue[3]}]
set_property PACKAGE_PIN A21 [get_ports {VGA_Green[3]}]
set_property PACKAGE_PIN AB21 [get_ports {VGA_Green[2]}]
set_property PACKAGE_PIN A22 [get_ports {VGA_Green[1]}]
set_property PACKAGE_PIN AB22 [get_ports {VGA_Green[0]}]
set_property PACKAGE_PIN V18 [get_ports {VGA_Red[3]}]
set_property PACKAGE_PIN V19 [get_ports {VGA_Red[2]}]
set_property PACKAGE_PIN U20 [get_ports {VGA_Red[1]}]
set_property PACKAGE_PIN V20 [get_ports {VGA_Red[0]}]
set_property PACKAGE_PIN T18 [get_ports rst_n]
set_property PACKAGE_PIN Y9 [get_ports clk_100]
set_property PACKAGE_PIN V9 [get_ports CMOS_FVAL]
set_property PACKAGE_PIN V10 [get_ports CMOS_LVAL]
set_property PACKAGE_PIN Y19 [get_ports VGA_VS]
set_property PACKAGE_PIN AA19 [get_ports VGA_HS]
set_property PACKAGE_PIN U4 [get_ports VGA_CTRL_CLK]
set_property PACKAGE_PIN W10 [get_ports CMOS_XCLK]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets {CMOS_XCLK}]
set_property PACKAGE_PIN V8 [get_ports I2C_SDAT]
set_property PACKAGE_PIN W8 [get_ports I2C_SCLK]
set_property IOSTANDARD LVCMOS33 [get_ports clk_100]
set_property IOSTANDARD LVCMOS33 [get_ports CMOS_FVAL]
set_property IOSTANDARD LVCMOS33 [get_ports CMOS_LVAL]
set_property IOSTANDARD LVCMOS33 [get_ports I2C_SCLK]
set_property IOSTANDARD LVCMOS33 [get_ports I2C_SDAT]
set_property IOSTANDARD LVCMOS33 [get_ports CMOS_XCLK]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_HS]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_VS]

//end

以上。需要完整工程代码的朋友请私信我。

这篇关于【Zedboard】FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802126

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount