紫光同创PGL22G开发平台试用连载(3)——驱动OV5640 摄像头实现sobel算子边缘检测算法

FPGA开发圈 2020-11-21 00:00

通过近一个月的学习,紫光同创PGL22Gfpga已经和spartan6和kintex7不相上下了,紫光EDA生态也趋于完善。EDA是FPGA皇冠上的明珠。FPGA更大的逻辑规模和更高的性能,意味着指数级增长的软件算法复杂度。Pango Design Suite是紫光同创基于多年FPGA开发软件技术攻关与工程实践经验而研发的一款拥有国产自主知识产权的大规模FPGA开发软件,已经可以支持数千万门级FPGA器件的设计,并可实现从RTL综合到配置数据流生成下载的全套操作,形成了完全自主知识产权的FPGA开发工具套件,更适合国内研发需要,某些方面比Altera 和Xilinx公司Quartus II Vivado和ISE更加人性化。

边缘检测算法是图像处理中最为基本的问题。其目的是标志图像出亮度变化明显的点,从而反映出图像中重要变化。边缘是图像最基本的特征,其在计算机视觉、图像分析等应用中起着重要的作用,这是因为图像的边缘包含了用于识别的有用信息,是图像分析和模式识别的主要特征提取手段。在图像中,“边缘”指的是临界的意思。一幅图像的“临界”表示为图像上亮度显著变化的地方,边缘指的是一个区域的结束,也是另一个区域的开始。“边缘点”指的是图像中具有坐标[x,y],且处在强度显著变化的位置上的点。常用的边缘检测算法大多是以原始图像灰度值为基础,通过考察图像的每个像素的某个邻域内灰度的变化,利用边缘一阶或二阶导数的规律来检测边缘。
    
实现边缘检测有很多不同的方法,也一直是图像处理中的研究热点,人们期望找到一种抗噪强、定位准、不漏检、不误检的检测算法。边缘检测算子,一阶:Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,罗盘算子;二阶:Marr-Hildreth,在梯度方向的二阶导数过零点,Canny算子,Laplacian算子。其中 Sobel 算子效果较好,边缘检测算法比较简单,实际应用中效率比 canny 边缘检测效率要高,但是边缘不如 Canny 检测的准确,但是很多实际应用的场合, sobel 边缘却是首选,尤其是对效率要求较高,而对细纹理不太关心的时候。采用 Sobel 的算法来实现视频图像的边缘检测。Sobel 算子是像素图像边缘检测中最重要的算子之一,该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如下图,Gx和Gy分别是在横向及纵向的灰度偏导的近似值。 为了在一副图像f的(x,y)位置处寻找边缘的强度和方向,所选择的工具就是梯度,向量定义为:

公式

Sobel算法:

1、把图像每三行三列的数据分别乘上算子中对应位置的值再相加。然后进行如下运算,得到相应方向(x和y)的Dx和Dy。
Dx=(a3-a1)+(b3-b1)*2+c3-c1;
Dy=(a1-c1)+(a2-c2)*2+a3-c3;

2、对上面求得的Dx和Dy做平方和的平方根,再取近似值Dx和Dy的绝对值的和得到Dxy:
Dxy=Dx2+Dy2=(∣Dx∣+∣Dy∣)Dxy = \sqrt{Dx^2+Dy^2} =(\left|Dx\right|+\left|Dy\right|)Dxy=Dx2+Dy2=(∣Dx∣+∣Dy∣)

3、如果Dxy的值大于一个阈值,表示该点为边界点,就让VGA显示一个白点,否则显示黑点。

4、把计算的结果通过vga显示,显示器会把是边界点的以白色像素显示,不是边界点的以黑色像素点显示,于是得到了一幅图像的轮廓。

sobel 算法的实现,首先需要一个 3x3 的像素窗口,本实验利用 xilinx 提供的VHDL 程序,做了一个 3 行的图像缓存,这样就可以轻松实现 3x3 的窗口。
然后按照简化公式,采用绝对值的方式计算 sobel。

架构

module sobel (

input rst,

input pclk,

input[7:0] threshold,

input de,

input[7:0] data_in,

output reg[7:0] data_out

);

reg[7:0] p11,p12,p13;

reg[7:0] p21,p22,p23;

reg[7:0] p31,p32,p33;

wire[7:0] p1,p2,p3;

reg[9:0] x1,x3;

reg[9:0] y1,y3;

reg[9:0] abs_x,abs_y;

reg[10:0] abs_g;

linebuffer_Wapper#

(

.no_of_lines(3),

.samples_per_line(1024),

.data_width(8)

)

linebuffer_Wapper_m0(

.ce (1'b1 ),

.wr_clk (pclk ),

.wr_en (de ),

.wr_rst (rst ),

.data_in (data_in),

.rd_en (de ),

.rd_clk (pclk ),

.rd_rst (rst ),

.data_out ({p3,p2,p1} )

);

always@(posedge pclk)

begin

p11 <= p1;

p21 <= p2;

p31 <= p3;

 

p12 <= p11;

p22 <= p21;

p32 <= p31;

 

p13 <= p12;

p23 <= p22;

p33 <= p32;

end

 

always@(posedge pclk)

begin

x1 <= {2'b00,p11} + {2'b00,p31} + {1'b0,p21,1'b0};

x3 <= {2'b00,p13} + {2'b00,p33} + {1'b0,p23,1'b0};

 

y1 <= {2'b00,p11} + {2'b00,p13} + {1'b0,p12,1'b0};

y3 <= {2'b00,p31} + {2'b00,p33} + {1'b0,p32,1'b0};

end

 

always@(posedge pclk)

begin

abs_x <= (x1 > x3) ? x1 - x3 : x3 - x1;

abs_y <= (y1 > y3) ? y1 - y3 : y3 - y1;

abs_g <= abs_x + abs_y;

end

 

always@(posedge pclk)

begin

data_out <= (abs_g > threshold) ? 8'h00 : 8'hff;

end

 

endmodule

module top(

input sys_clk,

input rst_n,

inout cmos_scl,

inout cmos_sda,

input cmos_vsync,

input cmos_href,

input cmos_pclk,

output cmos_xclk,

input [7:0] cmos_db,

//ddr

input pad_loop_in ,

input pad_loop_in_h ,

output pad_rstn_ch0 ,

output pad_ddr_clk_w ,

output pad_ddr_clkn_w ,

output pad_csn_ch0 ,

output [15:0] pad_addr_ch0 ,

inout [16-1:0] pad_dq_ch0 ,

inout [16/8-1:0] pad_dqs_ch0 ,

inout [16/8-1:0] pad_dqsn_ch0 ,

output [16/8-1:0] pad_dm_rdqs_ch0 ,

output pad_cke_ch0 ,

output pad_odt_ch0 ,

output pad_rasn_ch0 ,

output pad_casn_ch0 ,

output pad_wen_ch0 ,

output [2:0] pad_ba_ch0 ,

output pad_loop_out ,

output pad_loop_out_h ,

//hdmi output

output tmds_clk_p,

output tmds_clk_n,

output [2:0] tmds_data_p,

output [2:0] tmds_data_n

);

 

parameter MEM_DATA_BITS = 64; //external memory user interface data width

parameter ADDR_BITS = 25; //external memory user interface address width

parameter BUSRT_BITS = 10; //external memory user interface burst width

wire wr_burst_data_req;

wire wr_burst_finish;

wire rd_burst_finish;

wire rd_burst_req;

wire wr_burst_req;

wire[BUSRT_BITS - 1:0] rd_burst_len;

wire[BUSRT_BITS - 1:0] wr_burst_len;

wire[ADDR_BITS - 1:0] rd_burst_addr;

wire[ADDR_BITS - 1:0] wr_burst_addr;

wire rd_burst_data_valid;

wire[MEM_DATA_BITS - 1 : 0] rd_burst_data;

wire[MEM_DATA_BITS - 1 : 0] wr_burst_data;

wire read_req;

wire read_req_ack;

wire read_en;

wire[15:0] read_data;

wire write_en;

wire[15:0] write_data;

wire write_req;

wire write_req_ack;

wire video_clk; //video pixel clock

wire video_clk5x;

wire hs;

wire vs;

wire de;

wire[15:0] vout_data;

wire[15:0] cmos_16bit_data;

wire cmos_16bit_wr;

wire[1:0] write_addr_index;

wire[1:0] read_addr_index;

wire[9:0] lut_index;

wire[31:0] lut_data;

 

wire ui_clk;

wire ui_clk_sync_rst;

wire init_calib_complete;

// Master Write Address

wire [3:0] s00_axi_awid;

wire [63:0] s00_axi_awaddr;

wire [7:0] s00_axi_awlen; // burst length: 0-255

wire [2:0] s00_axi_awsize; // burst size: fixed 2'b011

wire [1:0] s00_axi_awburst; // burst type: fixed 2'b01(incremental burst)

wire s00_axi_awlock; // lock: fixed 2'b00

wire [3:0] s00_axi_awcache; // cache: fiex 2'b0011

wire [2:0] s00_axi_awprot; // protect: fixed 2'b000

wire [3:0] s00_axi_awqos; // qos: fixed 2'b0000

wire [0:0] s00_axi_awuser; // user: fixed 32'd0

wire s00_axi_awvalid;

wire s00_axi_awready;

// master write data

wire [63:0] s00_axi_wdata;

wire [7:0] s00_axi_wstrb;

wire s00_axi_wlast;

wire [0:0] s00_axi_wuser;

wire s00_axi_wvalid;

wire s00_axi_wready;

// master write response

wire [3:0] s00_axi_bid;

wire [1:0] s00_axi_bresp;

wire [0:0] s00_axi_buser;

wire s00_axi_bvalid;

wire s00_axi_bready;

// master read address

wire [3:0] s00_axi_arid;

wire [63:0] s00_axi_araddr;

wire [7:0] s00_axi_arlen;

wire [2:0] s00_axi_arsize;

wire [1:0] s00_axi_arburst;

wire [1:0] s00_axi_arlock;

wire [3:0] s00_axi_arcache;

wire [2:0] s00_axi_arprot;

wire [3:0] s00_axi_arqos;

wire [0:0] s00_axi_aruser;

wire s00_axi_arvalid;

wire s00_axi_arready;

// master read data

wire [3:0] s00_axi_rid;

wire [63:0] s00_axi_rdata;

wire [1:0] s00_axi_rresp;

wire s00_axi_rlast;

wire [0:0] s00_axi_ruser;

wire s00_axi_rvalid;

wire s00_axi_rready;

 

wire hdmi_hs;

wire hdmi_vs;

wire hdmi_de;

wire[7:0] hdmi_r;

wire[7:0] hdmi_g;

wire[7:0] hdmi_b;

wire[7:0] sobel_out;

wire[7:0] ycbcr_y;

wire ycbcr_hs;

wire ycbcr_vs;

wire ycbcr_de;

assign hdmi_hs = ycbcr_hs;

assign hdmi_vs = ycbcr_vs;

assign hdmi_de = ycbcr_de;

assign hdmi_r = sobel_out[7:0];

assign hdmi_g = sobel_out[7:0];

assign hdmi_b = sobel_out[7:0];

 

assign write_en = cmos_16bit_wr;

assign write_data = {cmos_16bit_data[4:0],cmos_16bit_data[10:5],cmos_16bit_data[15:11]};

 

video_pll video_pll_m0

(

.clkin1 (sys_clk ),

.clkout0 (video_clk ),

.clkout1 (video_clk5x ),

.clkout2 (cmos_xclk ),

.pll_rst (1'b0 ),

.pll_lock ( )

);

wire done_init;

dvi_encoder dvi_encoder_m0

(

.pixelclk (video_clk ),// system clock

.pixelclk5x (video_clk5x ),// system clock x5

.rstin (~done_init ),// reset

.blue_din (hdmi_b ),// Blue data in

.green_din (hdmi_g ),// Green data in

.red_din (hdmi_r ),// Red data in

.hsync (hdmi_hs ),// hsync data

.vsync (hdmi_vs ),// vsync data

.de (hdmi_de ),// data enable

.tmds_clk_p (tmds_clk_p ),

.tmds_clk_n (tmds_clk_n ),

.tmds_data_p (tmds_data_p ),//rgb

.tmds_data_n (tmds_data_n ) //rgb

);

 

//I2C master controller

i2c_config i2c_config_m0(

.rst (~rst_n ),

.clk (sys_clk ),

.clk_div_cnt (16'd499 ),

.i2c_addr_2byte (1'b1 ),

.lut_index (lut_index ),

.lut_dev_addr (lut_data[31:24] ),

.lut_reg_addr (lut_data[23:8] ),

.lut_reg_data (lut_data[7:0] ),

.error ( ),

.done (done_init ),

.i2c_scl (cmos_scl ),

.i2c_sda (cmos_sda )

);

//configure look-up table

lut_ov5640_rgb565_1024_768 lut_ov5640_rgb565_1024_768_m0(

.lut_index (lut_index ),

.lut_data (lut_data )

);

//CMOS sensor 8bit data is converted to 16bit data

cmos_8_16bit cmos_8_16bit_m0(

.rst (~done_init ),

.pclk (cmos_pclk ),

.pdata_i (cmos_db ),

.de_i (cmos_href ),

.pdata_o (cmos_16bit_data ),

.hblank ( ),

.de_o (cmos_16bit_wr )

);

//CMOS sensor writes the request and generates the read and write address index

cmos_write_req_gen cmos_write_req_gen_m0(

.rst (~done_init ),

.pclk (cmos_pclk ),

.cmos_vsync (cmos_vsync ),

.write_req (write_req ),

.write_addr_index (write_addr_index ),

.read_addr_index (read_addr_index ),

.write_req_ack (write_req_ack )

);

 

//The video output timing generator and generate a frame read data request

video_timing_data video_timing_data_m0

(

.video_clk (video_clk ),

.rst (~done_init ),

.read_req (read_req ),

.read_req_ack (read_req_ack ),

.read_en (read_en ),

.read_data (read_data ),

.hs (hs ),

.vs (vs ),

.de (de ),

.vout_data (vout_data )

);

 

rgb_to_ycbcr rgb_to_ycbcr_m0(

.clk (video_clk ),

.rst (~done_init ),

.rgb_r ({vout_data[15:11],3'd0} ),

.rgb_g ({vout_data[10:5],2'd0} ),

.rgb_b ({vout_data[4:0],3'd0} ),

.rgb_hs (hs ),

.rgb_vs (vs ),

.rgb_de (de ),

.ycbcr_y (ycbcr_y ),

.ycbcr_cb ( ),

.ycbcr_cr ( ),

.ycbcr_hs (ycbcr_hs ),

.ycbcr_vs (ycbcr_vs ),

.ycbcr_de (ycbcr_de )

);

 

sobel sobel_m0(

.rst (~done_init ),

.pclk (video_clk ),

.threshold (8'd40 ),

.de (ycbcr_de ),

.data_in (ycbcr_y ),

.data_out (sobel_out )

);

//video frame data read-write control

frame_read_write frame_read_write_m0

(

.rst (~done_init ),

.mem_clk (ui_clk ),

.rd_burst_req (rd_burst_req ),

.rd_burst_len (rd_burst_len ),

.rd_burst_addr (rd_burst_addr ),

.rd_burst_data_valid (rd_burst_data_valid ),

.rd_burst_data (rd_burst_data ),

.rd_burst_finish (rd_burst_finish ),

.read_clk (video_clk ),

.read_req (read_req ),

.read_req_ack (read_req_ack ),

.read_finish ( ),

.read_addr_0 (24'd0 ), //The first frame address is 0

.read_addr_1 (24'd2073600 ), //The second frame address is 24'd2073600 ,large enough address space for one frame of video

.read_addr_2 (24'd4147200 ),

.read_addr_3 (24'd6220800 ),

.read_addr_index (read_addr_index ),

.read_len (24'd196608 ),//frame size

.read_en (read_en ),

.read_data (read_data ),

 

.wr_burst_req (wr_burst_req ),

.wr_burst_len (wr_burst_len ),

.wr_burst_addr (wr_burst_addr ),

.wr_burst_data_req (wr_burst_data_req ),

.wr_burst_data (wr_burst_data ),

.wr_burst_finish (wr_burst_finish ),

.write_clk (cmos_pclk ),

.write_req (write_req ),

.write_req_ack (write_req_ack ),

.write_finish ( ),

.write_addr_0 (24'd0 ),

.write_addr_1 (24'd2073600 ),

.write_addr_2 (24'd4147200 ),

.write_addr_3 (24'd6220800 ),

.write_addr_index (write_addr_index ),

.write_len (24'd196608 ), //frame size

.write_en (write_en ),

.write_data (write_data )

);

ddr3 u_ipsl_hmemc_top (

.pll_refclk_in (sys_clk ),

.ddr_rstn_key (done_init ),

.pll_aclk_0 ( ),

.pll_aclk_1 (ui_clk ),

.pll_aclk_2 ( ),

.pll_lock ( ),

.ddrphy_rst_done ( ),

 

.ddrc_init_done (ui_clk_sync_rst),

.ddrc_rst (0),

 

.areset_1 (0),

.aclk_1 (ui_clk),

.awid_1 (s00_axi_awid),

.awaddr_1 (s00_axi_awaddr),

.awlen_1 (s00_axi_awlen),

.awsize_1 (s00_axi_awsize),

.awburst_1 (s00_axi_awburst),

.awlock_1 (s00_axi_awlock),

.awvalid_1 (s00_axi_awvalid),

.awready_1 (s00_axi_awready),

.awurgent_1 (1'b0), //?

.awpoison_1 (1'b0), //?

.wdata_1 (s00_axi_wdata),

.wstrb_1 (s00_axi_wstrb),

.wlast_1 (s00_axi_wlast),

.wvalid_1 (s00_axi_wvalid),

.wready_1 (s00_axi_wready),

.bid_1 (s00_axi_bid),

.bresp_1 (s00_axi_bresp),

.bvalid_1 (s00_axi_bvalid),

.bready_1 (s00_axi_bready),

.arid_1 (s00_axi_arid ),

.araddr_1 (s00_axi_araddr ),

.arlen_1 (s00_axi_arlen ),

.arsize_1 (s00_axi_arsize ),

.arburst_1 (s00_axi_arburst ),

.arlock_1 (s00_axi_arlock ),

.arvalid_1 (s00_axi_arvalid ),

.arready_1 (s00_axi_arready ),

.arpoison_1 (1'b0 ), //?

.rid_1 (s00_axi_rid ),

.rdata_1 (s00_axi_rdata ),

.rresp_1 (s00_axi_rresp ),

.rlast_1 (s00_axi_rlast ),

.rvalid_1 (s00_axi_rvalid ),

.rready_1 (s00_axi_rready ),

.arurgent_1 (1'b0), //?

.csysreq_1 (1'b1),

.csysack_1 (),

.cactive_1 (),

 

.csysreq_ddrc (1'b1),

.csysack_ddrc (),

.cactive_ddrc (),

 

.pad_loop_in (pad_loop_in),

.pad_loop_in_h (pad_loop_in_h),

.pad_rstn_ch0 (pad_rstn_ch0),

.pad_ddr_clk_w (pad_ddr_clk_w),

.pad_ddr_clkn_w (pad_ddr_clkn_w),

.pad_csn_ch0 (pad_csn_ch0),

.pad_addr_ch0 (pad_addr_ch0),

.pad_dq_ch0 (pad_dq_ch0),

.pad_dqs_ch0 (pad_dqs_ch0),

.pad_dqsn_ch0 (pad_dqsn_ch0),

.pad_dm_rdqs_ch0 (pad_dm_rdqs_ch0),

.pad_cke_ch0 (pad_cke_ch0),

.pad_odt_ch0 (pad_odt_ch0),

.pad_rasn_ch0 (pad_rasn_ch0),

.pad_casn_ch0 (pad_casn_ch0),

.pad_wen_ch0 (pad_wen_ch0),

.pad_ba_ch0 (pad_ba_ch0),

.pad_loop_out (pad_loop_out),

.pad_loop_out_h (pad_loop_out_h)

);

aq_axi_master u_aq_axi_master

(

.ARESETN (ui_clk_sync_rst ),

.ACLK (ui_clk ),

.M_AXI_AWID (s00_axi_awid ),

.M_AXI_AWADDR (s00_axi_awaddr ),

.M_AXI_AWLEN (s00_axi_awlen ),

.M_AXI_AWSIZE (s00_axi_awsize ),

.M_AXI_AWBURST (s00_axi_awburst ),

.M_AXI_AWLOCK (s00_axi_awlock ),

.M_AXI_AWCACHE (s00_axi_awcache ),

.M_AXI_AWPROT (s00_axi_awprot ),

.M_AXI_AWQOS (s00_axi_awqos ),

.M_AXI_AWUSER (s00_axi_awuser ),

.M_AXI_AWVALID (s00_axi_awvalid ),

.M_AXI_AWREADY (s00_axi_awready ),

.M_AXI_WDATA (s00_axi_wdata ),

.M_AXI_WSTRB (s00_axi_wstrb ),

.M_AXI_WLAST (s00_axi_wlast ),

.M_AXI_WUSER (s00_axi_wuser ),

.M_AXI_WVALID (s00_axi_wvalid ),

.M_AXI_WREADY (s00_axi_wready ),

.M_AXI_BID (s00_axi_bid ),

.M_AXI_BRESP (s00_axi_bresp ),

.M_AXI_BUSER (s00_axi_buser ),

.M_AXI_BVALID (s00_axi_bvalid ),

.M_AXI_BREADY (s00_axi_bready ),

.M_AXI_ARID (s00_axi_arid ),

.M_AXI_ARADDR (s00_axi_araddr ),

.M_AXI_ARLEN (s00_axi_arlen ),

.M_AXI_ARSIZE (s00_axi_arsize ),

.M_AXI_ARBURST (s00_axi_arburst ),

.M_AXI_ARLOCK (s00_axi_arlock ),

.M_AXI_ARCACHE (s00_axi_arcache ),

.M_AXI_ARPROT (s00_axi_arprot ),

.M_AXI_ARQOS (s00_axi_arqos ),

.M_AXI_ARUSER (s00_axi_aruser ),

.M_AXI_ARVALID (s00_axi_arvalid ),

.M_AXI_ARREADY (s00_axi_arready ),

.M_AXI_RID (s00_axi_rid ),

.M_AXI_RDATA (s00_axi_rdata ),

.M_AXI_RRESP (s00_axi_rresp ),

.M_AXI_RLAST (s00_axi_rlast ),

.M_AXI_RUSER (s00_axi_ruser ),

.M_AXI_RVALID (s00_axi_rvalid ),

.M_AXI_RREADY (s00_axi_rready ),

.MASTER_RST (1'b0 ),

.WR_START (wr_burst_req ),

.WR_ADRS ({wr_burst_addr,3'd0} ),

.WR_LEN ({wr_burst_len,3'd0} ),

.WR_READY ( ),

.WR_FIFO_RE (wr_burst_data_req ),

.WR_FIFO_EMPTY (1'b0 ),

.WR_FIFO_AEMPTY (1'b0 ),

.WR_FIFO_DATA (wr_burst_data ),

.WR_DONE (wr_burst_finish ),

.RD_START (rd_burst_req ),

.RD_ADRS ({rd_burst_addr,3'd0} ),

.RD_LEN ({rd_burst_len,3'd0} ),

.RD_READY ( ),

.RD_FIFO_WE (rd_burst_data_valid ),

.RD_FIFO_FULL (1'b0 ),

.RD_FIFO_AFULL (1'b0 ),

.RD_FIFO_DATA (rd_burst_data ),

.RD_DONE (rd_burst_finish ),

.DEBUG ( )

);

endmodule

软件界面


扫码免费申请试用

推荐阅读


紫光同创PGL22G开发平台试用连载-(2)以太网测试工程一

紫光同创PGL22G开发平台试用连载-(1)软硬件初步体验

紫光同创PGL22G开发平台试用连载(8)---程序密码之程序篇

紫光同创PGL22G开发平台试用连载(7)---程序密码之理论篇

紫光同创PGL22G开发平台试用连载(6)---边缘检测之综合篇

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

紫光同创PGL22G开发平台试用连载(4)---边缘检测之串口通信篇

紫光同创PGL22G开发平台试用连载(3)---重点功能初探

紫光同创PGL22G开发平台试用连载(2)---基本流程dome

紫光同创PGL22G开发平台试用连载(1)---软件和器件

紫光同创PGL22G开发平台试用连载(1)-FPGA参数分析和对比

紫光同创PGL22G开发平台试用连载(2)---PDS软件试用

紫光同创PGL22G开发平台试用连载(3)---在FPGA上实现DW8051 MCU

FPGA开发圈 这里介绍、交流、有关FPGA开发资料(文档下载,技术解答等),提升FPGA应用能力。
评论 (1)
小灰灰与FPGA2020-11-28 21:18
请问可以提供一下完整的程序吗
  • 探针本身不需要对焦。探针的工作原理是通过接触被测物体表面来传递电信号,其精度和使用效果取决于探针的材质、形状以及与检测设备的匹配度,而非对焦操作。一、探针的工作原理探针是检测设备中的重要部件,常用于电子显微镜、坐标测量机等精密仪器中。其工作原理主要是通过接触被测物体的表面,将接触点的位置信息或电信号传递给检测设备,从而实现对物体表面形貌、尺寸或电性能等参数的测量。在这个过程中,探针的精度和稳定性对测量结果具有至关重要的影响。二、探针的操作要求在使用探针进行测量时,需要确保探针与被测物体表面的良好
    锦正茂科技 2025-04-02 10:41 99浏览
  • 退火炉,作为热处理设备的一种,广泛应用于各种金属材料的退火处理。那么,退火炉究竟是干嘛用的呢?一、退火炉的主要用途退火炉主要用于金属材料(如钢、铁、铜等)的热处理,通过退火工艺改善材料的机械性能,消除内应力和组织缺陷,提高材料的塑性和韧性。退火过程中,材料被加热到一定温度后保持一段时间,然后以适当的速度冷却,以达到改善材料性能的目的。二、退火炉的工作原理退火炉通过电热元件(如电阻丝、硅碳棒等)或燃气燃烧器加热炉膛,使炉内温度达到所需的退火温度。在退火过程中,炉内的温度、加热速度和冷却速度都可以根
    锦正茂科技 2025-04-02 10:13 93浏览
  • 职场之路并非一帆风顺,从初入职场的新人成长为团队中不可或缺的骨干,背后需要经历一系列内在的蜕变。许多人误以为只需努力工作便能顺利晋升,其实核心在于思维方式的更新。走出舒适区、打破旧有框架,正是让自己与众不同的重要法宝。在这条道路上,你不只需要扎实的技能,更需要敏锐的观察力、不断自省的精神和前瞻的格局。今天,就来聊聊那改变命运的三大思维转变,让你在职场上稳步前行。工作初期,总会遇到各式各样的难题。最初,我们习惯于围绕手头任务来制定计划,专注于眼前的目标。然而,职场的竞争从来不是单打独斗,而是团队协
    优思学院 2025-04-01 17:29 229浏览
  • REACH和RoHS欧盟两项重要的环保法规有什么区别?适用范围有哪些?如何办理?REACH和RoHS是欧盟两项重要的环保法规,主要区别如下:一、核心定义与目标RoHS全称为《关于限制在电子电器设备中使用某些有害成分的指令》,旨在限制电子电器产品中的铅(Pb)、汞(Hg)、镉(Cd)、六价铬(Cr6+)、多溴联苯(PBBs)和多溴二苯醚(PBDEs)共6种物质,通过限制特定材料使用保障健康和环境安全REACH全称为《化学品的注册、评估、授权和限制》,覆盖欧盟市场所有化学品(食品和药品除外),通过登
    张工13144450251 2025-03-31 21:18 157浏览
  • 在智能交互设备快速发展的今天,语音芯片作为人机交互的核心组件,其性能直接影响用户体验与产品竞争力。WT588F02B-8S语音芯片,凭借其静态功耗<5μA的卓越低功耗特性,成为物联网、智能家居、工业自动化等领域的理想选择,为设备赋予“听得懂、说得清”的智能化能力。一、核心优势:低功耗与高性能的完美结合超低待机功耗WT588F02B-8S在休眠模式下待机电流仅为5μA以下,显著延长了电池供电设备的续航能力。例如,在电子锁、气体检测仪等需长期待机的场景中,用户无需频繁更换电池,降低了维护成本。灵活的
    广州唯创电子 2025-04-02 08:34 167浏览
  • 文/郭楚妤编辑/cc孙聪颖‍不久前,中国发展高层论坛 2025 年年会(CDF)刚刚落下帷幕。本次年会围绕 “全面释放发展动能,共促全球经济稳定增长” 这一主题,吸引了全球各界目光,众多重磅嘉宾的出席与发言成为舆论焦点。其中,韩国三星集团会长李在镕时隔两年的访华之行,更是引发广泛热议。一直以来,李在镕给外界的印象是不苟言笑。然而,在论坛开幕前一天,李在镕却意外打破固有形象。3 月 22 日,李在镕与高通公司总裁安蒙一同现身北京小米汽车工厂。小米方面极为重视此次会面,CEO 雷军亲自接待,小米副董
    华尔街科技眼 2025-04-01 19:39 239浏览
  • 随着汽车向智能化、场景化加速演进,智能座舱已成为人车交互的核心承载。从驾驶员注意力监测到儿童遗留检测,从乘员识别到安全带状态判断,座舱内的每一次行为都蕴含着巨大的安全与体验价值。然而,这些感知系统要在多样驾驶行为、复杂座舱布局和极端光照条件下持续稳定运行,传统的真实数据采集方式已难以支撑其开发迭代需求。智能座舱的技术演进,正由“采集驱动”转向“仿真驱动”。一、智能座舱仿真的挑战与突破图1:座舱实例图智能座舱中的AI系统,不仅需要理解驾驶员的行为和状态,还要同时感知乘员、儿童、宠物乃至环境中的潜在
    康谋 2025-04-02 10:23 149浏览
  • 文/Leon编辑/cc孙聪颖‍步入 2025 年,国家进一步加大促消费、扩内需的政策力度,家电国补政策将持续贯穿全年。这一利好举措,为行业发展注入强劲的增长动力。(详情见:2025:消费提振要靠国补还是“看不见的手”?)但与此同时,也对家电企业在战略规划、产品打造以及市场营销等多个维度,提出了更为严苛的要求。在刚刚落幕的中国家电及消费电子博览会(AWE)上,家电行业的竞争呈现出胶着的态势,各大品牌为在激烈的市场竞争中脱颖而出,纷纷加大产品研发投入,积极推出新产品,试图提升产品附加值与市场竞争力。
    华尔街科技眼 2025-04-01 19:49 226浏览
  • 升职这件事,说到底不是单纯靠“干得多”或者“喊得响”。你可能也看过不少人,能力一般,甚至没你努力,却升得飞快;而你,日复一日地拼命干活,升职这两个字却始终离你有点远。这种“不公平”的感觉,其实在很多职场人心里都曾经出现过。但你有没有想过,问题可能就藏在一些你“没当回事”的小细节里?今天,我们就来聊聊你升职总是比别人慢,可能是因为这三个被你忽略的小细节。第一:你做得多,但说得少你可能是那种“默默付出型”的员工。项目来了接着干,困难来了顶上去,别人不愿意做的事情你都做了。但问题是,这些事情你做了,却
    优思学院 2025-03-31 14:58 126浏览
  • 据先科电子官方信息,其产品包装标签将于2024年5月1日进行全面升级。作为电子元器件行业资讯平台,大鱼芯城为您梳理本次变更的核心内容及影响:一、标签变更核心要点标签整合与环保优化变更前:卷盘、内盒及外箱需分别粘贴2张标签(含独立环保标识)。变更后:环保标识(RoHS/HAF/PbF)整合至单张标签,减少重复贴标流程。标签尺寸调整卷盘/内盒标签:尺寸由5030mm升级至**8040mm**,信息展示更清晰。外箱标签:尺寸统一为8040mm(原7040mm),提升一致性。关键信息新增新增LOT批次编
    大鱼芯城 2025-04-01 15:02 222浏览
  • 引言在语音芯片设计中,输出电路的设计直接影响音频质量与系统稳定性。WT588系列语音芯片(如WT588F02B、WT588F02A/04A/08A等),因其高集成度与灵活性被广泛应用于智能设备。然而,不同型号在硬件设计上存在关键差异,尤其是DAC加功放输出电路的配置要求。本文将从硬件架构、电路设计要点及选型建议三方面,解析WT588F02B与F02A/04A/08A的核心区别,帮助开发者高效完成产品设计。一、核心硬件差异对比WT588F02B与F02A/04A/08A系列芯片均支持PWM直推喇叭
    广州唯创电子 2025-04-01 08:53 211浏览
  • 提到“质量”这两个字,我们不会忘记那些奠定基础的大师们:休哈特、戴明、朱兰、克劳士比、费根堡姆、石川馨、田口玄一……正是他们的思想和实践,构筑了现代质量管理的核心体系,也深远影响了无数企业和管理者。今天,就让我们一同致敬这些质量管理的先驱!(最近流行『吉卜力风格』AI插图,我们也来玩玩用『吉卜力风格』重绘质量大师画象)1. 休哈特:统计质量控制的奠基者沃尔特·A·休哈特,美国工程师、统计学家,被誉为“统计质量控制之父”。1924年,他提出世界上第一张控制图,并于1931年出版《产品制造质量的经济
    优思学院 2025-04-01 14:02 153浏览
  •        在“软件定义汽车”的时代浪潮下,车载软件的重要性日益凸显,软件在整车成本中的比重逐步攀升,已成为汽车智能化、网联化、电动化发展的核心驱动力。车载软件的质量直接关系到车辆的安全性、可靠性以及用户体验,因此,构建一套科学、严谨、高效的车载软件研发流程,确保软件质量的稳定性和可控性,已成为行业共识和迫切需求。       作为汽车电子系统领域的杰出企业,经纬恒润深刻理解车载软件研发的复杂性和挑战性,致力于为O
    经纬恒润 2025-03-31 16:48 104浏览
  • 引言随着物联网和智能设备的快速发展,语音交互技术逐渐成为提升用户体验的核心功能之一。在此背景下,WT588E02B-8S语音芯片,凭借其创新的远程更新(OTA)功能、灵活定制能力及高集成度设计,成为智能设备语音方案的优选。本文将从技术特性、远程更新机制及典型应用场景三方面,解析该芯片的技术优势与实际应用价值。一、WT588E02B-8S语音芯片的核心技术特性高性能硬件架构WT588E02B-8S采用16位DSP内核,内部振荡频率达32MHz,支持16位PWM/DAC输出,可直接驱动8Ω/0.5W
    广州唯创电子 2025-04-01 08:38 178浏览
  • 北京贞光科技有限公司作为紫光同芯授权代理商,专注于为客户提供车规级安全芯片的硬件供应与软件SDK一站式解决方案,同时配备专业技术团队,为选型及定制需求提供现场指导与支持。随着新能源汽车渗透率突破40%(中汽协2024数据),智能驾驶向L3+快速演进,车规级MCU正迎来技术范式变革。作为汽车电子系统的"神经中枢",通过AEC-Q100 Grade 1认证的MCU芯片需在-40℃~150℃极端温度下保持μs级响应精度,同时满足ISO 26262 ASIL-D功能安全要求。在集中式
    贞光科技 2025-04-02 14:50 180浏览
我要评论
1
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦