紫光同创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应用能力。
评论
  • 在当今竞争激烈的市场环境中,企业不仅需要优化成本,还需积极响应国家的能源政策,减少对环境的影响。提升工业能源效率正是实现这一双重目标的关键。中国近年来大力推进“双碳”目标(碳达峰、碳中和),并出台了一系列政策鼓励企业节能减排。通过宏集CODRA的Panorama解决方案,企业可以获得专为这一目标设计的SCADA工具,实时监控和调整所有工业设备的能耗。特别是其中的能源管理模块,能够有效分析数据,预防故障,避免能源浪费。Panorama的优化技术宏集CODRA提供的解决方案,尤其是Panorama
    宏集科技 2025-03-06 11:25 115浏览
  • 在六西格玛项目中,团队的选择往往决定了最终的成败。合适的团队成员不仅能推动项目顺利进行,更能确保最终成果符合预期。因此,组建六西格玛团队时,必须挑选最合适的人才,确保他们具备必要的能力和特质。团队主管的关键特质每个精益六西格玛项目都需要一位主管来带领团队。他们不仅需要具备领导力,还要能够分析数据、制定策略,并与管理层和团队成员高效沟通。团队主管的核心职责包括:领导团队行动:能够激励成员,确保团队朝着既定目标前进。数据分析能力:精通数据处理和分析,能基于数据做出决策。沟通协调:能够在管理层和团队之
    优思学院 2025-03-06 12:51 98浏览
  • 配电自动化终端DTU(数据终端单元)在智能电网的建设中扮演着至关重要的角色,它通过信息采集与控制,实现配电线路的遥测、故障检测及远程操作,极大提升了供电可靠性和效率。在国网新规的推动下,采用多核异构处理器设计的DTU方案日益成为主流,其中实时核与控制核的协同工作,为配电系统的实时监控与高效管理提供了有力保障。在此背景下,飞凌嵌入式基于FET536-C核心板的RISC-V核DTU解决方案应运而生,凭借卓越的性能和灵活的多核架构,引领配电自动化进入全新时代。1. T536核心板的优势飞凌嵌入式FET
    飞凌嵌入式 2025-03-05 10:42 78浏览
  • 引言嘿,各位电动汽车的爱好者们!咱们今儿个就来聊聊电动汽车里那些“看不见,摸不着”,但又至关重要的零部件。要说电动汽车这玩意儿,那可真是科技含量满满,各种高精尖的技术都往里堆。但要让这些高科技玩意儿协同工作,稳定可靠地运转,那就得靠一些幕后英雄,比如说——电容器。你可能会想,电容器?这不就是电子电路里常见的元件嘛,能有多重要? 哎,你可别小瞧了这小小的电容器。在电动汽车的心脏地带——高压直流转换器(DC-DC转换器)里,车规级的电容器那可是扮演着举足轻重的角色。 今天,咱们就聚焦分析三星电机车规
    贞光科技 2025-03-05 17:02 90浏览
  • 概述随着工业4.0的深入推进,制造业对自动化和智能化的需求日益增长。传统生产线面临空间不足、效率低下、灵活性差等问题,尤其在现有工厂改造项目中,如何在有限空间内实现高效自动化成为一大挑战。此次项目的客户需要在现有工厂基础上进行改造,空间有限。为此,客户选择了SCARA型线性轴机器人作为执行设备。然而,SCARA机器人的高效运行离不开强大的控制系统支持。宏集凭借其先进的智能控制系统,为客户提供了高效、灵活的自动化解决方案,确保SCARA机器人在有限空间内发挥最大效能。一、客户需求在此次改造项目中,
    宏集科技 2025-03-06 11:27 120浏览
  • 多人同时共享相同无线网络,以下场景是否是您熟悉的日常?姐姐:「妈~我在房间在线上课,影音一直断断续续的怎么上课啊!」奶奶:「媳妇啊~我在在线追剧,影片一直卡卡的,实在让人生气!」除此之外,同时间有老公在跟客户开在线会议,还有弟弟在玩在线游戏,而妈妈自己其实也在客厅追剧,同时间加总起来,共有五个人同时使用这个网络!我们不论是在家里、咖啡厅、餐厅、商场或是公司,都会面临到周遭充斥着非常多的无线路由器(AP),若同时间每位使用者透过手机、平板或是笔电连接到相同的一个网络,可想而知网络上的壅塞及相互干扰
    百佳泰测试实验室 2025-03-06 16:50 42浏览
  • 产品质量合格率偏低会引起质量成本(也称“劣质成本”)的大幅增加。质量成本通常分为内部损失成本和外部损失成本两部分。内部损失成本是指产品交付前因质量不合格造成的损失,包括返工、报废等;外部损失成本是指产品交付后因质量问题导致的损失,如退货、召回等。此外,质量问题还会影响生产效率,带来额外人工和停工损失。下面分别介绍各类损失的具体计算方法和公式。直接成本损失(内部故障成本)直接成本是由于产品在出厂前质量不合格所造成的看得见的损失。常见的直接损失包括返工、报废以及由此产生的额外原材料消耗等。返工成本:
    优思学院 2025-03-05 15:25 77浏览
  • 文/Leon编辑/cc孙聪颖2025年全国两会进行时,作为“十四五”规划收官之年,本届两会释放出坚定目标、稳中求进、以进促稳等信号。其中,企业家们的建议备受关注,关系到民营经济在2025年的走向。作为国内科技制造业的“老兵”,全国人大代表、TCL集团创始人及董事长李东生在本届两会中提出三份代表建议,包括《关于优化中国科技制造业融资环境的建议》、《关于加强AI深度伪造欺诈管理的建议》和《关于降低灵活就业人员社会保险参保门槛的建议》,表现出对科技制造、AI发展和劳动者保障方面的关注。会后,李东生接受
    华尔街科技眼 2025-03-06 19:41 47浏览
  • 服务器应用环境与客户需求PCIe 5.0高速接口技术的成熟驱动着生成式AI与高效能运算等相关应用蓬勃发展。在随着企业对服务器性能的要求日益严苛,服务器更新换代的周期也持续加快。在此背景下,白牌与DIY(Do It Yourself)服务器市场迎来了新的发展契机,但同时也面临着更趋复杂的技术挑战。传统上,白牌与DIY服务器以其高度客制化与成本效益优势受到市场青睐。然而,随着PCIe 5.0等高速技术的导入,服务器系统的复杂度大幅提升,对组装技术与组件兼容性也就提出更高的要求。举个简单的例子来说,P
    百佳泰测试实验室 2025-03-06 17:00 50浏览
  • ASL6328芯片支持高达 6.0 Gbps 运行速率的交流和直流耦合输入T-MDS 信号,具备可编程均衡和抖动清理功能。ASL6328 是一款单端口 HDMI/DVI 电平转换 / 中继器,具有重新定时功能。它包含 TypeC双模式 DP 线缆适配器寄存器,可用于识别线缆适配器的性能。抖动清理 PLL(锁相环)能够消除输入抖动,并完全重置系统抖动容限,因此能更好地满足更高数据速率下 HDMI 抖动合规性要求。设备的运行和配置可通过引脚设置或 I2C 总线实现。自动断电和静噪功能提供了灵活的电
    QQ1540182856 2025-03-06 14:26 86浏览
  • 案例1 2008款保时捷卡宴车行驶中发动机偶发熄火故障现象 一辆2008款保时捷卡宴车,搭载4.8 L 自然吸气发动机,累计行驶里程约为21万km。车主反映,该车行驶中发动机偶发熄火;重新起动,发动机能够起动着机,只是起动时间延长,且组合仪表上的发动机故障灯异常点亮。 故障诊断接车后试车,发动机起动及怠速运转正常。用故障检测仪检测,发动机控制单元(DME)中存储有故障代码“P0335 曲轴位置传感器A电路”,由此怀疑曲轴位置传感器信号偶尔异常,导致发动机熄火。用虹科Pico汽车示波器测
    虹科Pico汽车示波器 2025-03-05 11:00 62浏览
  • 随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重建的关键突破。一、3DGS技术概述与原理1、3DGS的技术概述3DGS是一种基于3D高斯分布的三维场景表示方法。通过将场景中的对象转化为多个3D高斯点,每个点包含位置、协方差矩阵和不透明度等信息,3DGS能够精确地表达复杂场景的几何形状和光照特性。与传统的神经辐射场(NeRF)方法相比,
    康谋 2025-03-06 13:17 120浏览
  • 1. 背景在汽车电子系统测试中,CANoe作为主流的仿真测试工具,常需与云端服务器、第三方软件或物联网设备进行交互。随着CANoe与外部软件、服务器或设备交互越来越多,直接使用Socket进行通信往往不能满足使用需求,依托于CANoe 的连接功能集(Connectivity Feature Set),以及Distributed Object(DO)功能,可以仿真HTTP节点,实现设备与服务器等之间的通信,保证数据处理的可靠性和便捷性。本文详细解析如何利用CANoe搭建HTTP测试环境,并提供典型
    北汇信息 2025-03-05 11:56 87浏览
  • 文/Leon编辑/侯煜‍2008至2021年间,创维以高举高打的凌厉之势,果断进行投资,一度成为中国市场大屏OLED产业的旗手,引领着显示技术的发展方向。但近年来,创维在 OLED 领域的发展轨迹却逐渐模糊,态度陷入暧昧不明的混沌状态。究其根源,一方面,创维对过往的押注难以割舍,在技术革新与市场变化的浪潮中,不愿轻易推翻曾经的战略布局;另一方面,早期在大屏OLED 技术研发、市场推广等环节投入的巨额资金,已然形成沉没成本,极大地限制了创维在显示技术路线上的重新抉择。但市场瞬息万变,为适应激烈的行
    华尔街科技眼 2025-03-05 20:03 147浏览
我要评论
1
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦