0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教你们如何使用Verilog HDL在FPGA上进行图像处理

OpenFPGA 来源:Hack电子 作者:Hack电子 2021-09-23 16:17 次阅读

FPGA项目旨在详细展示如何使用Verilog处理图像,从Verilog中读取输入位图图像(.bmp),处理并将处理结果写入Verilog中的输出位图图像。提供了用于读取图像、图像处理和写入图像的完整 Verilog 代码 。

在这个FPGA Verilog项目中,一些简单的处理操作都是在Verilog中实现的,比如反相、亮度控制和阈值操作。图像处理操作由“parameter.v”文件选择,然后将处理后的图像数据写入位图图像 output.bmp 以供验证。

所述图像读取Verilog代码作为图像传感器/摄像机的模型的Verilog,它可以是用于在实时的功能验证真正有用的操作FPGA图像处理项目。当您想查看 BMP 格式的输出图像时,图像写入部分对于测试也非常有用。

在这个项目中,我在阅读部分添加了一些简单的图像处理代码来制作图像处理的示例,但是您可以轻松地将其删除以获得原始图像数据。学生提出的所有相关问题都在本文底部得到解答。

首先,Verilog 不能直接读取图像。要在 Verilog 中读取 .bmp 图像,需要将图像从位图格式转换为十六进制格式。下面是将位图图像转换为 .hex 文件的 Matlab 示例代码。输入图像大小为 768x512,图像 .hex 文件包括位图图像的 R、G、B 数据。

b=imread('kodim24.bmp');%24-bitBMPimageRGB888

k=1;
fori=5121%imageiswrittenfromthelastrowtothefirstrow
forj=1:768
a(k)=b(i,j,1);
a(k+1)=b(i,j,2);
a(k+2)=b(i,j,3);
k=k+3;
end
end
fid=fopen('kodim24.hex','wt');
fprintf(fid,'%x
',a);
disp('Textfilewritedone');disp('');
fclose(fid);

要读取图像十六进制数据文件,Verilog 使用以下命令:readmemb 如果图像数据在二进制文本文件中。读取图像.hex 文件后,将RGB 图像数据保存到内存中并读出进行处理。

下面是图像读取和处理部分的Verilog代码:

/**********************************************************************************/
/********************模块用于读取和处理图像**************/
/*********************************************************************************/
/******************************************************************************/
/******************Moduleforreadingandprocessingimage**************/
/******************************************************************************/
`include"parameter.v"//Includedefinitionfile
//fpga4student.com:FPGAprojectsforstudents
//FPGAproject:ImageprocessinginVerilog
moduleimage_read
#(
parameterWIDTH=768,//Imagewidth
HEIGHT=512,//Imageheight
INFILE="./img/kodim01.hex",//imagefile
START_UP_DELAY=100,//Delayduringstartuptime
HSYNC_DELAY=160,//DelaybetweenHSYNCpulses
VALUE=100,//valueforBrightnessoperation
THRESHOLD=90,//ThresholdvalueforThresholdoperation
SIGN=1//Signvalueusingforbrightnessoperation
//SIGN=0:Brightnesssubtraction
//SIGN=1:Brightnessaddition
)
(
inputHCLK,//clock
inputHRESETn,//Reset(activelow)
outputVSYNC,//Verticalsynchronouspulse
//Thissignalisoftenawaytoindicatethatoneentireimageistransmitted.
//Justcreateandisnotused,willbeusedonceavideoormanyimagesaretransmitted.
outputregHSYNC,//Horizontalsynchronouspulse
//AnHSYNCindicatesthatonelineoftheimageistransmitted.
//Usedtobeahorizontalsynchronoussignalsforwritingbmpfile.
outputreg[7:0]DATA_R0,//8bitReddata(even)
outputreg[7:0]DATA_G0,//8bitGreendata(even)
outputreg[7:0]DATA_B0,//8bitBluedata(even)
outputreg[7:0]DATA_R1,//8bitReddata(odd)
outputreg[7:0]DATA_G1,//8bitGreendata(odd)
outputreg[7:0]DATA_B1,//8bitBluedata(odd)
//Processandtransmit2pixelsinparalleltomaketheprocessfaster,youcanmodifytotransmit1pixelsormoreifneeded
outputctrl_done//Doneflag
);
//-------------------------------------------------
//InternalSignals
//-------------------------------------------------
parametersizeOfWidth=8;//datawidth
parametersizeOfLengthReal=1179648;//imagedata:1179648bytes:512*768*3
//localparametersforFSM
localparamST_IDLE=2'b00,//idlestate
ST_VSYNC=2'b01,//stateforcreatingvsync
ST_HSYNC=2'b10,//stateforcreatinghsync
ST_DATA=2'b11;//statefordataprocessing
reg[1:0]cstate,//currentstate
nstate;//nextstate
regstart;//startsignal:triggerFinitestatemachinebeginningtooperate
regHRESETn_d;//delayedresetsignal:usetocreatestartsignal
regctrl_vsync_run;//controlsignalforvsynccounter
reg[8:0]ctrl_vsync_cnt;//counterforvsync
regctrl_hsync_run;//controlsignalforhsynccounter
reg[8:0]ctrl_hsync_cnt;//counterforhsync
regctrl_data_run;//controlsignalfordataprocessing
reg[7:0]total_memory[0:sizeOfLengthReal-1];//memorytostore8-bitdataimage
//temporarymemorytosaveimagedata:sizewillbeWIDTH*HEIGHT*3
integertemp_BMP[0:WIDTH*HEIGHT*3-1];
integerorg_R[0:WIDTH*HEIGHT-1];//temporarystorageforRcomponent
integerorg_G[0:WIDTH*HEIGHT-1];//temporarystorageforGcomponent
integerorg_B[0:WIDTH*HEIGHT-1];//temporarystorageforBcomponent
//countingvariables
integeri,j;
//temporarysignalsforcalculation:detailsinthepaper.
integertempR0,tempR1,tempG0,tempG1,tempB0,tempB1;//temporaryvariablesincontrastandbrightnessoperation

integervalue,value1,value2,value4;//temporaryvariablesininvertandthresholdoperation
reg[9:0]row;//rowindexoftheimage
reg[10:0]col;//columnindexoftheimage
reg[18:0]data_count;//datacountingforentirepixelsoftheimage
//-------------------------------------------------//
//--------Readingdatafrominputfile----------//
//-------------------------------------------------//
initialbegin
$readmemh(INFILE,total_memory,0,sizeOfLengthReal-1);//readfilefromINFILE
end
//use3intermediatesignalsRGBtosaveimagedata
always@(start)begin
if(start==1'b1)begin
for(i=0;ib1&&HRESETn_d==1'b0)//__0___|1|___0____:startingpulse
start<= 1'b1;
else
start<= 1'b0;
end
end
//-----------------------------------------------------------------------------------------------//
//FinitestatemachineforreadingRGB888datafrommemoryandcreatinghsyncandvsyncpulses--//
//-----------------------------------------------------------------------------------------------//
always@(posedgeHCLK,negedgeHRESETn)
begin
if(~HRESETn)begin
cstate<= ST_IDLE;
    end
    else begin
        cstate <= nstate; // update next state 
    end
end
//-----------------------------------------//
//--------- State Transition --------------//
//-----------------------------------------//
// IDLE . VSYNC . HSYNC . DATA
always @(*) begin
 case(cstate)
  ST_IDLE: begin
   if(start)
    nstate = ST_VSYNC;
   else
    nstate = ST_IDLE;
  end   
  ST_VSYNC: begin
   if(ctrl_vsync_cnt == START_UP_DELAY) 
    nstate = ST_HSYNC;
   else
    nstate = ST_VSYNC;
  end
  ST_HSYNC: begin
   if(ctrl_hsync_cnt == HSYNC_DELAY) 
    nstate = ST_DATA;
   else
    nstate = ST_HSYNC;
  end  
  ST_DATA: begin
   if(ctrl_done)
    nstate = ST_IDLE;
   else begin
    if(col == WIDTH - 2)
     nstate = ST_HSYNC;
    else
     nstate = ST_DATA;
   end
  end
 endcase
end
// ------------------------------------------------------------------- //
// --- counting for time period of vsync, hsync, data processing ----  //
// ------------------------------------------------------------------- //
always @(*) begin
 ctrl_vsync_run = 0;
 ctrl_hsync_run = 0;
 ctrl_data_run  = 0;
 case(cstate)
  ST_VSYNC:  begin ctrl_vsync_run = 1; end  // trigger counting for vsync
  ST_HSYNC:  begin ctrl_hsync_run = 1; end // trigger counting for hsync
  ST_DATA:  begin ctrl_data_run  = 1; end // trigger counting for data processing
 endcase
end
// counters for vsync, hsync
always@(posedge HCLK, negedge HRESETn)
begin
    if(~HRESETn) begin
        ctrl_vsync_cnt <= 0;
  ctrl_hsync_cnt <= 0;
    end
    else begin
        if(ctrl_vsync_run)
   ctrl_vsync_cnt <= ctrl_vsync_cnt + 1; // counting for vsync
  else 
   ctrl_vsync_cnt <= 0;
   
        if(ctrl_hsync_run)
   ctrl_hsync_cnt <= ctrl_hsync_cnt + 1; // counting for hsync  
  else
   ctrl_hsync_cnt <= 0;
    end
end
// counting column and row index  for reading memory 
always@(posedge HCLK, negedge HRESETn)
begin
    if(~HRESETn) begin
        row <= 0;
  col <= 0;
    end
 else begin
  if(ctrl_data_run) begin
   if(col == WIDTH - 2) begin
    row <= row + 1;
   end
   if(col == WIDTH - 2) 
    col <= 0;
   else 
    col <= col + 2; // reading 2 pixels in parallel
  end
 end
end
//-------------------------------------------------//
//----------------Data counting---------- ---------//
//-------------------------------------------------//
always@(posedge HCLK, negedge HRESETn)
begin
    if(~HRESETn) begin
        data_count <= 0;
    end
    else begin
        if(ctrl_data_run)
   data_count <= data_count + 1;
    end
end
assign VSYNC = ctrl_vsync_run;
assign ctrl_done = (data_count == 196607)? 1'b1:1'b0;//doneflag
//-------------------------------------------------//
//-------------Imageprocessing---------------//
//-------------------------------------------------//
always@(*)begin

HSYNC=1'b0;
DATA_R0=0;
DATA_G0=0;
DATA_B0=0;
DATA_R1=0;
DATA_G1=0;
DATA_B1=0;
if(ctrl_data_run)begin

HSYNC=1'b1;
`ifdefBRIGHTNESS_OPERATION
/**************************************/
/*BRIGHTNESSADDITIONOPERATION*/
/**************************************/
if(SIGN==1)begin
//R0
tempR0=org_R[WIDTH*row+col]+VALUE;
if(tempR0>255)
DATA_R0=255;
else
DATA_R0=org_R[WIDTH*row+col]+VALUE;
//R1
tempR1=org_R[WIDTH*row+col+1]+VALUE;
if(tempR1>255)
DATA_R1=255;
else
DATA_R1=org_R[WIDTH*row+col+1]+VALUE;
//G0
tempG0=org_G[WIDTH*row+col]+VALUE;
if(tempG0>255)
DATA_G0=255;
else
DATA_G0=org_G[WIDTH*row+col]+VALUE;
tempG1=org_G[WIDTH*row+col+1]+VALUE;
if(tempG1>255)
DATA_G1=255;
else
DATA_G1=org_G[WIDTH*row+col+1]+VALUE;
//B
tempB0=org_B[WIDTH*row+col]+VALUE;
if(tempB0>255)
DATA_B0=255;
else
DATA_B0=org_B[WIDTH*row+col]+VALUE;
tempB1=org_B[WIDTH*row+col+1]+VALUE;
if(tempB1>255)
DATA_B1=255;
else
DATA_B1=org_B[WIDTH*row+col+1]+VALUE;
end
elsebegin
/**************************************/
/*BRIGHTNESSSUBTRACTIONOPERATION*/
/**************************************/
//R0
tempR0=org_R[WIDTH*row+col]-VALUE;
if(tempR0< 0)
   DATA_R0 = 0;
  else
   DATA_R0 = org_R[WIDTH * row + col   ] - VALUE;
  // R1 
  tempR1 = org_R[WIDTH * row + col+1   ] - VALUE;
  if (tempR1 < 0)
   DATA_R1 = 0;
  else
   DATA_R1 = org_R[WIDTH * row + col+1   ] - VALUE; 
  // G0 
  tempG0 = org_G[WIDTH * row + col   ] - VALUE;
  if (tempG0 < 0)
   DATA_G0 = 0;
  else
   DATA_G0 = org_G[WIDTH * row + col   ] - VALUE;
  tempG1 = org_G[WIDTH * row + col+1   ] - VALUE;
  if (tempG1 < 0)
   DATA_G1 = 0;
  else
   DATA_G1 = org_G[WIDTH * row + col+1   ] - VALUE;  
  // B
  tempB0 = org_B[WIDTH * row + col   ] - VALUE;
  if (tempB0 < 0)
   DATA_B0 = 0;
  else
   DATA_B0 = org_B[WIDTH * row + col   ] - VALUE;
  tempB1 = org_B[WIDTH * row + col+1   ] - VALUE;
  if (tempB1 < 0)
   DATA_B1 = 0;
  else
   DATA_B1 = org_B[WIDTH * row + col+1   ] - VALUE;
  end
  `endif
         /**************************************/  
  /*  INVERT_OPERATION       */
  /**************************************/
  `ifdef INVERT_OPERATION 
   value2 = (org_B[WIDTH * row + col  ] + org_R[WIDTH * row + col  ] +org_G[WIDTH * row + col  ])/3;
   DATA_R0=255-value2;
   DATA_G0=255-value2;
   DATA_B0=255-value2;
   value4 = (org_B[WIDTH * row + col+1  ] + org_R[WIDTH * row + col+1  ] +org_G[WIDTH * row + col+1  ])/3;
   DATA_R1=255-value4;
   DATA_G1=255-value4;
   DATA_B1=255-value4;  
  `endif
  /**************************************/  
  /********THRESHOLD OPERATION  *********/
  /**************************************/
  `ifdef THRESHOLD_OPERATION
  value = (org_R[WIDTH * row + col   ]+org_G[WIDTH * row + col   ]+org_B[WIDTH * row + col   ])/3;
  if(value >THRESHOLD)begin
DATA_R0=255;
DATA_G0=255;
DATA_B0=255;
end
elsebegin
DATA_R0=0;
DATA_G0=0;
DATA_B0=0;
end
value1=(org_R[WIDTH*row+col+1]+org_G[WIDTH*row+col+1]+org_B[WIDTH*row+col+1])/3;
if(value1>THRESHOLD)begin
DATA_R1=255;
DATA_G1=255;
DATA_B1=255;
end
elsebegin
DATA_R1=0;
DATA_G1=0;
DATA_B1=0;
end
`endif
end
end

endmodule

“parameter.v”文件也是定义输入输出文件的路径和名称。对图像进行处理后,需要将处理后的数据写入输出图像进行验证。

以下Verilog代码是将处理后的图像数据写入位图图像进行验证:

/********************写入.bmp图像的模块************/
/**************************************************************/
moduleimage_write#(parameter
WIDTH=768,//Imagewidth
HEIGHT=512,//Imageheight
INFILE="output.bmp",//Outputimage
BMP_HEADER_NUM=54//Headerforbmpimage
)
(
inputHCLK,//Clockinput
HRESETn,//Resetactivelow
inputhsync,//Hsyncpulse
input[7:0]DATA_WRITE_R0,//Red8-bitdata(odd)
input[7:0]DATA_WRITE_G0,//Green8-bitdata(odd)
input[7:0]DATA_WRITE_B0,//Blue8-bitdata(odd)
input[7:0]DATA_WRITE_R1,//Red8-bitdata(even)
input[7:0]DATA_WRITE_G1,//Green8-bitdata(even)
input[7:0]DATA_WRITE_B1,//Blue8-bitdata(even)
outputregWrite_Done
);
//fpga4student.comFPGAprojects,Verilogprojects,VHDLprojects
//-----------------------------------//
//-------Headerdataforbmpimage-----//
//-------------------------------------//
//WindowsBMPfilesbeginwitha54-byteheader
initialbegin
BMP_header[0]=66;BMP_header[28]=24;
BMP_header[1]=77;BMP_header[29]=0;
BMP_header[2]=54;BMP_header[30]=0;
BMP_header[3]=0;BMP_header[31]=0;
BMP_header[4]=18;BMP_header[32]=0;
BMP_header[5]=0;BMP_header[33]=0;
BMP_header[6]=0;BMP_header[34]=0;
BMP_header[7]=0;BMP_header[35]=0;
BMP_header[8]=0;BMP_header[36]=0;
BMP_header[9]=0;BMP_header[37]=0;
BMP_header[10]=54;BMP_header[38]=0;
BMP_header[11]=0;BMP_header[39]=0;
BMP_header[12]=0;BMP_header[40]=0;
BMP_header[13]=0;BMP_header[41]=0;
BMP_header[14]=40;BMP_header[42]=0;
BMP_header[15]=0;BMP_header[43]=0;
BMP_header[16]=0;BMP_header[44]=0;
BMP_header[17]=0;BMP_header[45]=0;
BMP_header[18]=0;BMP_header[46]=0;
BMP_header[19]=3;BMP_header[47]=0;
BMP_header[20]=0;BMP_header[48]=0;
BMP_header[21]=0;BMP_header[49]=0;
BMP_header[22]=0;BMP_header[50]=0;
BMP_header[23]=2;BMP_header[51]=0;
BMP_header[24]=0;BMP_header[52]=0;
BMP_header[25]=0;BMP_header[53]=0;
BMP_header[26]=1;BMP_header[27]=0;
end
//---------------------------------------------------------//
//--------------Write.bmpfile----------------------//
//----------------------------------------------------------//
initialbegin
fd=$fopen(INFILE,"wb+");
end
always@(Write_Done)begin//oncetheprocessingwasdone,bmpimagewillbecreated
if(Write_Done==1'b1)begin
for(i=0;i

位图图像的标头数据非常重要,在这里发布。如果没有标题数据,则无法正确显示写入的图像。在 Verilog HDL 中,$fwrite 命令用于将数据写入文件。

接下来,让我们编写一个测试平台 Verilog 代码来验证图像处理操作。

`timescale1ns/1ps/**************************************************/
/*******Testbenchforsimulation****************/
/*********************************************/
//fpga4student.comFPGAprojects,Verilogprojects,VHDLprojects
//Verilogproject:ImageprocessinginVerilog
`include"parameter.v"//includedefinitionfilemoduletb_simulation;
//------------------//InternalSignals
//-------------------------------------------------
regHCLK,HRESETn;
wirevsync;
wirehsync;
wire[7:0]data_R0;
wire[7:0]data_G0;
wire[7:0]data_B0;
wire[7:0]data_R1;
wire[7:0]data_G1;
wire[7:0]data_B1;
wireenc_done;
image_read#(.INFILE(`INPUTFILENAME))
u_image_read
(.HCLK(HCLK),
.HRESETn(HRESETn),
.VSYNC(vsync),
.HSYNC(hsync),
.DATA_R0(data_R0),
.DATA_G0(data_G0),
.DATA_B0(data_B0),
.DATA_R1(data_R1),
.DATA_G1(data_G1),
.DATA_B1(data_B1),
.ctrl_done(enc_done)
);
image_write#(.INFILE(`OUTPUTFILENAME))
u_image_write(
.HCLK(HCLK),
.HRESETn(HRESETn),
.hsync(hsync),
.DATA_WRITE_R0(data_R0),
.DATA_WRITE_G0(data_G0),
.DATA_WRITE_B0(data_B0),
.DATA_WRITE_R1(data_R1),
.DATA_WRITE_G1(data_G1),
.DATA_WRITE_B1(data_B1),
.Write_Done()
);
//-------------//TestVectors
//-------------------------------------
initial
begin
HCLK=0;
forever#10HCLK=~HCLK;
end
initial
begin
HRESETn=0;
#25HRESETn=1;
endendmodule

最后,我们拥有一切来运行模拟来验证图像处理代码。让我们使用下图作为输入位图文件:

运行仿真 6ms,关闭仿真并打开输出图像以检查结果。以下是参数.v中选定操作处理的输出图像:

由于读取代码是为了模拟目的而对图像传感器/相机进行建模,因此建议不要合成代码。如果你真的想综合处理代码并直接在FPGA上运行,你需要将代码中的这些图像数组(total_memory、temp_BMP、org_R、org_B、org_G)替换为块存储器(RAM)和设计地址生成器来读取图像块内存中的数据。

问题的答案:

此图像处理项目的完整 Verilog 代码可在此处下载。运行模拟大约 6ms 并关闭模拟,然后您将能够看到输出图像。

https://github.com/suisuisi/FPGAandImage/blob/main/Image/012_Others/Verilog_Image_Processing.zip

读取部分作为图像传感器/相机的 Verilog 模型运行(输出 RGB 数据、HSYNC、VSYNC、HCLK)。Verilog 图像读取代码对于实时 FPGA 图像/视频项目中的功能验证非常有用。

3.在这个项目中,我添加了图像处理部分,做一个图像增强的例子。如果您只想使用图像传感器模型来验证您的图像处理设计,您可以轻松移除处理部分以仅获取原始图像数据。

4.图像保存到三个独立的RGB mem中:由于Matlab代码是将图像16进制文件从最后一行写到第一行,所以RGB保存代码(org_R, org_B, org_G)在读取temp_BMP内存时也是这样做的,保存RGB数据正确。如果您想以不同的方式进行,您可以相应地更改它。

5.如果您想更改图像大小,您可能会发现以下对 BMP 标题的解释很有用:

图像大小=768*512*3=1179648字节
BMP标题=54字节
BMP文件大小=图像大小+BMP标题=1179702字节
将其转换为十六进制数:1179702 inDecimal=120036inHexade
然后 BMP 文件的 4 字节大小:00H, 12 inHexa=18Decimal,00H,36inHexa=54Decimal
这就是我们如何得到以下值:
BMP_header[2]=54;
BMP_header[3]=0;
BMP_header[4]=18;
BMP_header[5]=0;
图像宽度= 768 =>十六进制:0x0300。图像宽度的 4 个字节是
0、3、0、0。这就是您获得以下值的方式:BMP_header[18]=0;
BMP_header[19]=3;
BMP_header[20]=0;
BMP_header[21]=0;
图像高度= 512 =>十六进制:0x0200。图像宽度的 4 个字节是0, 2, 0, 0。这就是我们如何得到以下值:
BMP_header[22]=0;
BMP_header[23]=2;
BMP_header[24]=0;
BMP_header[25]=0;
  1. 您不应综合此代码,因为它不是为在 FPGA 上运行而设计的,而是用于功能验证目的. 如果你真的想合成这段代码(读取和处理)并将图像加载到 FPGA中直接在 FPGA 上处理,请将所有 temp. 变量 (org_R, org_B, org_G, tmp_BMP = total_memory) 并生成地址以读取图像数据(删除 always @(start) 和所有“for 循环” - 这些用于模拟目的)。
    有两种方式:1. 写一段RAM代码,用$readmemh将图像数据初始化到内存中;2. 使用 Xilinx Core Generator 或 Altera MegaFunction 生成块存储器并将图像数据加载到存储器的初始值(Xilinx Core Gen. 为 .coe 文件,Altera MegaFunction 为 .mif 文件),然后从存储器中读取图像数据并处理它(FSM 设计)。

  2. 在这个项目中,为了加快处理速度,同时读取两个偶数和旧像素,但您可以根据您的设计更改正在读取的像素数。

  3. 编写Verilog代码对于测试目的也非常有帮助,因为您可以看到BMP 格式的输出。

9.如果要做实时图像处理,可以查看camera接口代码这个:https://www.fpga4student.com/2018/08/basys-3-fpga-ov7670-camera.html

参考:https://www.fpga4student.com/2016/11/image-processing-on-fpga-verilog.html

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1625

    文章

    21663

    浏览量

    601672
  • 图像处理
    +关注

    关注

    27

    文章

    1280

    浏览量

    56627
  • verilog代码
    +关注

    关注

    0

    文章

    8

    浏览量

    11312
收藏 人收藏

    评论

    相关推荐

    Verilog vhdl fpga

    相关专业,具有良好的专业基础知识。 感兴趣可滴滴 JYHXDX534 2.工作年限不限,有工作经验或优秀应届毕业生亦可。 3.对FPGA芯片架构和资源有深入的理解,精通Verilog HDL、VHDL
    发表于 11-12 16:40

    数字系统设计与Verilog HDL

    数字系统设计与Verilog HDL 1.兼职职位 ,不坐班,等待公司分配任务,时间自由 2.薪资: 200-5000不等可具体协商 3.要求:国内985/211院校在读或毕业,或者国外前100的院校 4.英语水平:四级500+/六级440+/雅思6.5+/托福90+
    发表于 11-06 17:57

    Verilog HDL的基础知识

    本文继续介绍Verilog HDL基础知识,重点介绍赋值语句、阻塞与非阻塞、循环语句、同步与异步、函数与任务语法知识。
    的头像 发表于 10-24 15:00 168次阅读
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>的基础知识

    FPGA图像处理领域的优势有哪些?

    进行原型验证和迭代。这使得FPGA图像处理领域具有更快的开发速度,能够快速响应市场需求,降低开发成本。 四、低功耗
    发表于 10-09 14:36

    FPGA Verilog HDL代码如何debug?

    今天给大侠带来FPAG技术交流群里平时讨论的问题答疑合集(十一),以后还会多推出本系列,话不多说,上货。 FPGA技术交流群目前已有十多个群,QQ和微信均覆盖,有需要的大侠可以进群,一起交流学习
    发表于 09-24 19:16

    FPGA芯片架构和资源有深入的理解,精通Verilog HDL、VHDL

    、计算机相关专业,具有良好的专业基础知识。 2.工作年限不限,有工作经验或优秀应届毕业生亦可。 3.对FPGA芯片架构和资源有深入的理解,精通Verilog HDL、VHDL编程语言,熟悉时序约束、时序分析
    发表于 09-15 15:23

    FPGA Verilog HDL有什么奇技巧?

    :使用Verilog设计电路模块时,为什么推荐使用register out的方式? 进行design partition时,相比register in更推荐register out,请问为什么呢?如果前后两个模块
    发表于 09-12 19:10

    FPGA verilog HDL实现中值滤波

    今天给大侠简单带来FPGA verilog HDL实现中值滤波,话不多说,上货。一、实现步骤: 1、查看了中值滤波实现相关的网站和paper; 2、按照某篇paper的设计思想进行
    发表于 06-18 18:50

    FPGA设计经验之图像处理

    系列:基于 FPGA图像边缘检测系统设计(sobel算法) FPGA设计中 Verilog HDL实现基本的
    发表于 06-12 16:26

    基于FPGA的实时边缘检测系统设计,Sobel图像边缘检测,FPGA图像处理

    运行时, FPGA 并行运算平台首先完成对摄像头的初始化和寄存器配置,配置完成之后读取实时的图像数据存入 SDRAM 存储器中, FPGA 芯片内部并行实现
    发表于 05-24 07:45

    FPGA设计中 Verilog HDL实现基本的图像滤波处理仿真

    今天给大侠带来FPGA设计中用Verilog HDL实现基本的图像滤波处理仿真,话不多说,上货。 1、用matlab代码,准备好把图片
    发表于 05-20 16:44

    有什么好用的verilog HDL编辑工具可用?

    有什么好用的verilog HDL编辑工具可用?最好能集成实时的verilog HDL语法检测、自定义模块识别触发等功能,最好能够免费;
    发表于 04-28 11:00

    fpga是用c语言还是verilog

    FPGA(现场可编程逻辑门阵列)开发主要使用的编程语言是硬件描述语言(HDL),其中Verilog是最常用的编程语言之一。而C语言通常用于传统的软件编程,与FPGA的硬件编程有所区别。
    的头像 发表于 03-27 14:38 1769次阅读

    FPGA图像处理之CLAHE算法

    FPGA图像处理--CLAHE算法(一)中介绍了为啥要用CLAHE算法来做图像增强。
    的头像 发表于 01-04 12:23 2386次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>之CLAHE算法

    FPGA图像处理方法

    图像在采集和传输的过程中,通常会产生噪声,使图像质量降低,影响后续处理。因此须对图像进行一些图像
    的头像 发表于 12-02 13:15 1060次阅读