【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所示:

其Block Design模块如下图1-2所示:

按照OV5620数据手册,在配置摄像头模块中,采用的是I2C协议对OV5620的初始化寄存器进行配置。主要完成的配置信息如下:

该配置信息,完成了对OV5620数据手册所描述的对RGB三色数据的增益、AWE增益、图像对比度增幅、输出图像分辨率大小的配置。I2C时序控制图入下图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代码实现相关推荐

  1. 数字图像处理:图像平均/加法_OPT小讲堂 ∣ SciSmart图像增强之二值化

    图像二值化(Image Binarization)简单理解就是通过适当的高低阈值将256个亮度等级的图像转换为二值图.本文中提及的二值图像均指灰度值为0(黑色)或255(白色)的图像. 在数字图像处理 ...

  2. 基于旋转轮廓的点云局部浮点型和二值化特征描述(RCS)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本次介绍一个发表于Computer Vision and Image Understanding的经典 ...

  3. 基于C++(QT)的车牌识别实现——二值化处理

    文章目录 拟采用的技术路线 车牌图片打开 图片二值化 窗口UI实现 拟采用的技术路线 本次设计计划以最快的速度实现一个清晰车牌的识别,后续再增加识别精确度,故采取以下技术路线本篇文章主要讲述图像二值化 ...

  4. 图像处理之灰度图像转换与二值化

    灰度图像与二值化 问题描述:将彩色图像转换为灰度图像并进行二值化处理 代码如下(示例): #include <opencv2/opencv.hpp>cv::Mat BGR2GRAY(cv: ...

  5. 基于python的图像二值化处理(opencv)

    图像二值化处理 (python-opencv) 二值化 图像的二值化,在图像处理中是十分重要的一个步骤.是几乎所有后续的图像处理的基础和前提.只有根据不同场景选择不同的二值化处理,才能对一幅图片较好的 ...

  6. input自适应_【正点原子FPGA连载】第十一章基于OV5640的自适应二值化实验-领航者ZYNQ之HLS 开发指南...

    1)摘自[正点原子]领航者ZYNQ之HLS 开发指南 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手 ...

  7. linux 正点原子ov5640_【正点原子FPGA连载】第二十六章基于OV5640的二值化实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-26 16:21 编辑 QQ群头像.png (1.78 KB) 2020-10-24 10:50 上传5)关注正点原子公众号,获取最新资料 100846rel ...

  8. ZYNQ图像处理(4)——灰度图像转二值化图像

    1.二值化图像简介 前面已经完成了摄像头图像的采集和显示,以及RGB图像转灰度图.二值化图像在图像处理领域同样有广泛的应用,本节介绍如何用FPGA实现灰度转二值化图形.灰度实现二值化的原理很简单,只需 ...

  9. 图像处理 基于Visual C++编程 学习笔记 (3)显示灰度图像和二值化图像

    灰度图imggray 有了上面的基础,灰度图就相当简单了 彩色图转灰度方法: 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11  2.整数方法:Gray=(R*30+G*59+B*11) ...

最新文章

  1. 数字图像处理——第七章 小波和多分辨处理
  2. 谷歌“亲儿子”竟然成为了NLP革新者
  3. Scanner类、Random类、ArrayList类
  4. JavaFX控件ID:设置Label文本内容代码示例
  5. C++和 C 的区别
  6. kafka消费端慢慢延迟(网络带宽不足)
  7. 13.Axis创建webservice客户端和服务端
  8. C#LeetCode刷题之#641-设计循环双端队列(Design Circular Deque)
  9. JMeter中如何实现跨线程组关联
  10. 软件工程小组第八次会议记录
  11. 基于单片机智能交通灯控制系统设计外文文献_【设计图文】单片机实现的步进电机控制系统(开题报告+论文+文献综述+外文翻译+DWG图纸)...
  12. 下载应用 ipa 包,不妨试试这款开源工具
  13. sharp s2 android 9,夏普s2第三方ROM AOSP(Android P)v105
  14. c语言写测试地下水流速,《C语言》课程教学大纲 总学时:总学时64;理论44;实验20 学分:3.5 .doc...
  15. 安卓脚本判断运作的是不是root,su
  16. 三维空间内任意三点坐标求圆心、半径
  17. 完美收官 | IOTE第十八届国际物联网展精彩落幕,美格智能参展回顾
  18. 什么设备升级android9,三星升级Android 9 Pie设备公布:S9明年1月上线
  19. C语言中“pow”函数,关于使用编译器编译时产生pow未定义引用。
  20. 为什么推荐做印尼tiktok账号运营?

热门文章

  1. 2分钟让你搞懂 grid-template-areas
  2. HierarchyView
  3. hermit插值 matlab,分段线性插值和分段Hermit插值课程设计
  4. Electron基础
  5. u盘win7纯净版_系统u盘win10正版电脑系统重装u盘一键装机win7旗舰版win8.1纯净版XP远程安...
  6. BOM和DOM和事件
  7. 嵌入式驱动编写-LCD驱动程序
  8. C++中智能指针详解
  9. raspberry 使用EDUP无线网卡上网
  10. 2023新华为OD机试题 - 计算网络信号(JavaScript) | 刷完必过