±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÊµÏÖͼÏñµÄ±ßÔµ¼ì²â¹¦ÄÜ¡£ |
|
Ŀ¼
1.mifÎļþµÄÖÆ×÷
2.µ÷Óà ip ºËÉú³ÉromÒÔ¼°ÔÚ questasim ·ÂÕæ×¢ÒâÎÊÌâ
3.»Ò¶È´¦Àí
4.¾ùÖµÂ˲¨£ºÖصãÊÇ3*3 ÏñËØÕóÁеÄÉú³É
5.sobel±ßÔµ¼ì²â
6.ͼƬµÄÏÔʾ
7.½á¹ûչʾ
mifÎļþµÄÖÆ×÷
ÊÜ×ÊÔ´ÏÞÖÆ£¬½«Í¼Æ¬ÏñËض¨Îª 160 * 120£¬½«Í¼Æ¬Êý¾ÝÖÆ³É mif Îļþ£¬¶Ô rom ip ºË½øÐгõʼ»¯¡£mifÎļþµÄÖÆ×÷·½·¨ÍøÉÏÓкöà°ì·¨£¬Òò´Ë¾Í²»ÔÙÐðÊöÁË£¬Öصã˵mifÎļþµÄ¸ñʽ¡£
1¡¢mifÎļþµÄ¸ñʽΪ£º
1 WIDTH=16 ; //Êý¾Ýλ¿í
2 DEPTH=19200 ; // rom Éî¶È¼´Í¼Æ¬ÏñËصãµÄ¸öÊý
3 ADDRESS_RADIX=UNS ; //µØÖ·Êý¾Ý¸ñʽ
4 DATA_RADIX=BIN ; //Êý¾Ý¸ñʽ
5 CONTENT
6 BEGIN
7 0:1010110011010000 ; // µØÖ· £ºÊý¾Ý £»×¢Òâ¸ñʽҪºÍÉÏÃ涨ÒåµÄ±£³Öͳһ
8 1:1010110011010000 ;
9 2:1010010010110000 ;
10 ......
11 19198:1110011011111001 ;
12 19199:1110011011011000 ;
13 END; |
µ÷ÓÃip ºËÉú³É rom ÒÔ¼°ÔÚ questasim ·ÂÕæ×¢ÒâÎÊÌâ
Õⲿ·ÖÄÚÈÝÒѾÔÚÉÏƪ²©ÎÄÖÐÏêϸÃèÊö¹ý£¬ÏêÇéÇë¼ûhttp://www.cnblogs.com/aslmer/p/5780107.html
»Ò¶È´¦Àí
ÈκÎÑÕÉ«¶¼Óɺ졢ÂÌ¡¢À¶ÈýÔÉ«×é³É£¬¼ÙÈçÔÀ´Ä³µãµÄÑÕɫΪ( R,G,B )ÄÇô£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÏÂÃ漸ÖÖ·½·¨£¬½«Æäת»»Îª»Ò¶È£º
1.¸¡µãËã·¨£ºGray=0.299R+0.587G+0.114B
2.ƽ¾ùÖµ·¨£ºGray=(R+G+B)/3;
3.½öÈ¡µ¥É«£¨ÈçÂÌÉ«£©£ºGray=G£»
½«¼ÆËã³öÀ´µÄGrayֵͬʱ¸³Öµ¸ø RGB Èý¸öͨµÀ¼´RGBΪ(Gray,Gray,Gray)£¬´ËʱÏÔʾµÄ¾ÍÊǻҶÈͼ¡£Í¨¹ý¹Û²ìµ÷É«°å¾ÍÄÜ¿´Ã÷ÁË¡£
ͨ¹ý¹Û²ì¿ÉÖª£¬µ±RGBÈý¸öͨµÀµÄÖµÏàͬʱ¼´Îª»ÒÉ«£¬GrayµÄÖµÔ½´ó£¬ÑÕÉ«Ô½½Ó½ü°×É«£¬·´Ö®Ô½½Ó½üºÚÉ«£¨ÕâÊÇÎÒ×Ô¼ºµÄÀí½â£¬²»ÑϽ÷´íÎóÖ®´¦Çë´óÉñÖ¸Õý£©¡£
ÕâÊÇÔÚÏßµ÷É«°åÍøÖ·£¬¿ÉÒÔ½øÈ¥×Ô¼ºÑо¿Ò»Ï¡£http://tool.chinaz.com/tools/selectcolor.aspx
![](images/201802121.png)
´Ë´ÎÎÒ²ÉÓÃÊǸ¡µãËã·¨À´ÊµÏÖ»Ò¶ÈͼµÄ£¬ÎÒµÄͼƬÊý¾ÝÊÇRGB565 ¸ñʽ £¬
Äѵã: ÈçºÎ½øÐи¡µãÔËËã¡£
˼·£ºÏȽ«Êý¾Ý·Å´ó£¬È»ºóÔÙËõС¡£
ÀýÈ磺
Gray=0.299R+0.587G+0.114Bת»¯Îª Gray=(77R+150G+29B)>>8
¼´¿É£¬ÕâÀïÓÐÒ»¸ö¼¼ÇÉ£¬Èô a Ϊ 16 λ¼´ a [15:0],ÄÇô a>>8 Óë a
[15£º8]ÊÇÒ»ÑùµÄ¡£
ºËÐÄ´úÂëÈçÏ£º
always
@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
red_r1 <= 0 ;
green_r1 <= 0 ;
blue_r1 <= 0 ;
end
else begin
red_r1 <= red * 77 ; //·Å´óºóµÄÖµ
green_r1 <= green * 150;
blue_r1 <= blue * 29 ;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
Gray <= 0; // Èý¸öÊýÖ®ºÍ
end
else begin
Gray <= red_r1 + green_r1 + blue_r1;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
post_data_in <= 0; //Êä³öµÄ»Ò¶ÈÊý¾Ý
end
else begin
post_data_in <= { Gray[13:9], Gray[13:8],
Gray[13:9] };//½«GrayÖµ¸³Öµ¸øRGBÈý¸öͨµÀ
end
end |
¾ùÖµÂ˲¨
¾ùÖµÂ˲¨µÄÔÀí
http : // blog . csdn . net / hhygcy
/ article / details / 4325304 (´Ë´¦ÒýÓà hhygcy µÄÎÄÕÂ)
Äѵ㣺ÈçºÎÉú³É 3*3 µÄÏñËØÕóÁС£
ÎÒÃÇ¿ÉÒÔÀûÓà ip ºËÉú³ÉÒÆλ¼Ä´æÆ÷ £¬·½·¨Óë ip ºË Éú³É rom Ò»Ñù£¬ÏêÇé¼ûĿ¼ 2 Òò´Ë²»ÔÙ׸Êö
¡£
![](images/201802122.png)
·ÂÕ沨ÐÎÈçÏ row_1 , row_2 , row_3 ÊÇָͼÏñµÄµÚÒ»¡¢¶þ¡¢ÈýÐеÄÊý¾Ý£¬Per_href
ÊÇÐÐÓÐЧÐźţ¨ÊÜVGAʱÐòµÄÆô·¢£¬´Ó rom ÖжÁÈ¡Êý¾ÝʱÉè¼ÆÁËÐÐÓÐЧºÍ³¡ÓÐЧµÄ¿ØÖÆÐźţ¬Ê°빦±¶£¬ÓÐÁËÀûÓÚ·ÂÕæ²é´íºÍÊý¾ÝµÄ¿ØÖÆ£©¡£´Ó
3 ¿ªÊ¼¾Í³öÏÖÁË3*3 µÄÏñËØÕóÁУ¬Õâʱºò¾Í¿ÉÒÔÇóÈ¡ÖÜΧ 8 ¸öÏñËصãµÄƽ¾ùÖµ£¬½øÐоùÖµÂ˲¨¡£
![](images/201802123.png)
ÏÂÃæÕâ¸öͼÊÇÎÒ×Ô¼º»µÄ FPGA ÈçºÎ½«¾ØÕóÊý¾Ý´¦Àí³É²¢ÐеÄÏñËص㣬¿ÉÒÔ½áºÏÏÂÃæµÄ´úÂëºÃºÃÀí½â£¬ÕâÒ²ÊǾ«»ªËùÔÚ¡£
Õý·½Ðκì¿ò¿òÆðÀ´µÄÊǵÚÒ»¸öÍêÕûµÄ 3*3 ¾ØÕ󣬳¤·½Ðκì¿ò¿òÆðÀ´µÄÊDz¢ÐеÄÏñËص㣬ÔÚ´Ë»ù´¡ÉϾͿÉÒÔÇóµÃƽ¾ùÖµ£¬½øÐоùÖµÂ˲¨¡£
´ÓÏÂͼҲÄÜ¿´µ½ 3*3 ¾ØÕó´Ó×óÍùÓÒ»¬¶¯¡£
µÚÒ»¸ö3*3 ÕóÁС£
0 1 2 -- > p11 p12 p13
3 4 5 -- > p21 p22 p23
6 7 8 -- > p31 p32 p33
![](images/201802124.png)
ºËÐÄ´úÂëÈçÏ£º
reg
[5:0]p_11,p_12,p_13; // 3 * 3
¾í»ýºËÖеÄÏñËصã
reg [5:0]p_21,p_22,p_23;
reg [5:0]p_31,p_32,p_33;
reg [8:0]mean_value_add1,mean_value_add2,
mean_value_add3;//ÿһÐÐÖ®ºÍ
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
{p_11,p_12,p_13} <= {5'b0,5'b0,5'b0} ;
{p_21,p_22,p_23} <= {15'b0,15'b0,15'b0};
{p_31,p_32,p_33} <= {15'b0,15'b0,15'b0};
end
else begin
if(per_href_ff0==1&&flag_do==1)begin
{p_11,p_12,p_13}<={p_12,p_13,row_1};
{p_21,p_22,p_23}<={p_22,p_23,row_2};
{p_31,p_32,p_33}<={p_32,p_33,row_3};
end
else begin
{p_11,p_12,p_13}<={5'b0,5'b0,5'b0};
{p_21,p_22,p_23}<={5'b0,5'b0,5'b0}
{p_31,p_32,p_33}<={5'b0,5'b0,5'b0}
end
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
mean_value_add1<=0;
mean_value_add2<=0;
mean_value_add3<=0;
end
else if(per_href_ff1)begin
mean_value_add1<=p_11+p_12+p_13;
mean_value_add2<=p_21+ 0 +p_23;
mean_value_add3<=p_31+p_32+p_33;
end
end
wire [8:0]mean_value;//8λÊýÖ®ºÍ
wire [5:0]fin_y_data; //ƽ¾ùÊý£¬³ýÒÔ8£¬
Ï൱ÓÚ×óÒÆÈýλ¡£
assign mean_value=mean_value_add1+mean_value_
add2+mean_value_add3;
assign fin_y_data=mean_value[8:3]; |
sobel ±ßÔµ¼ì²â
±ßÔµ¼ì²âµÄÔÀí
¸ÃËã×Ó°üº¬Á½×é 3x3 µÄ¾ØÕ󣬷ֱðΪºáÏò¼°×ÝÏò£¬½«Ö®ÓëͼÏñ×÷ƽÃæ¾í»ý£¬¼´¿É·Ö±ðµÃ³öºáÏò¼°×ÝÏòµÄÁÁ¶È²î·Ö½üËÆÖµ¡£A´ú±íÔʼͼÏñµÄ
3*3 ÏñËØÕóÁУ¬Gx¼°Gy·Ö±ð´ú±í¾ºáÏò¼°×ÝÏò±ßÔµ¼ì²âµÄͼÏñ£¬Æ乫ʽÈçÏÂ:
![](images/201802125.png)
ͼÏñµÄÿһ¸öÏñËصĺáÏò¼°×ÝÏòÌݶȽüËÆÖµ¿ÉÓÃÒÔÏµĹ«Ê½½áºÏ£¬À´¼ÆËãÌݶȵĴóС¡£
![](images/201802126.png)
Èç¹ûÌݶÈG´óÓÚijһ·§ÖµÔòÈÏΪ¸Ãµã(x,y)Ϊ±ßÔµµã¡£
ÓõÄÊÇ ±ßÔµ¼ì²âËã·¨¡£
Äѵ㣺(1)ÕÆÎÕÁË 3*3 ÏñËØÕóÁУ¬Gx Óë Gy ¾ÍºÜºÃ¼ÆËãÁË (×¢ÒâÎÊÌ⣺ΪÁ˱ÜÃâ¼ÆËã¹ý³ÌÖгöÏÖ¸ºÖµ£¬ËùÒÔ½«Õý¸ºÖµ·Ö¿ªµ¥¶À¼ÆË㣬¾ßÌå¼û´úÂë)
(2)GµÄ¼ÆËãÐèÒª¿ªÆ½·½£¬ÈçºÎ½øÐпªÆ½·½ÔËËã
Quartus ÌṩÁË¿ªÆ½·½ ip ºË£¬Òò´ËÎÒÃÇÖ±½Óµ÷ÓþͺÃÁË ¡£
![](images/201802127.png)
´úÂ룺
reg
[8:0] p_x_data ,p_y_data ; // x ºÍ y µÄÕýÖµÖ®ºÍ
reg [8:0] n_x_data ,n_y_data ; // x ºÍ y µÄ¸ºÖµÖ®ºÍ
reg [8:0] gx_data ,gy_data ; //×îÖÕ½á¹û
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
p_x_data <=0;
n_x_data <=0;
gx_data <=0;
end
else if(per_href_ff1==1) begin
p_x_data <= p_13 + (p_23<<1) + p_33
;
n_x_data <= p_11 + (p_12<<1 )+ p_13
;
gx_data <= (p_x_data >=n_x_data)? p_x_
data - n_x_data : n_x_data - p_x_data ;
end
else begin
p_x_data<=0;
n_x_data<=0;
gx_data <=0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
p_y_data <=0;
n_y_data <=0;
gy_data <=0;
end
else if(per_href_ff1==1) begin
p_y_data <= p_11 + (p_12<<1) + p_13
;
n_y_data <= p_31 + (p_32<<1) + p_33
;
gy_data <= (p_y_data >=n_y_data)? p_y_data
- n_y_data : n_y_data - p_y_data ;
end
else begin
p_y_data <=0;
n_y_data <=0;
gy_data <=0;
end
end
//Çóƽ·½ºÍ,µ÷ÓÃipºË¿ªÆ½·½
reg [16:0] gxy; // Gx Óë Gy µÄƽ·½ºÍ
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
gxy<=0;
end
else begin
gxy<= gy_data* gy_data + gx_data* gx_data
;
end
end
wire [8:0] squart_out ;
altsquart u1_altsquart ( //Àý»¯¿ªÆ½·½µÄipºË
.radical (gxy),
.q (squart_out), //Êä³öµÄ½á¹û
.remainder()
);
//ÓëãÐÖµ½øÐбȽÏ
reg [15:0] post_y_data_r;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
post_y_data_r<=16'h00;
end
else if(squart_out>=threshold)
post_y_data_r<=16'h00 ;
else
post_y_data_r<=16'hffff ;
end |
ͼƬµÄÏÔʾ
±¾À´ÊÇÏëÓà VGA À´ÏÔʾͼƬµÄ£¬ÓÉÓÚÌõ¼þµÄÏÞÖÆûÄÜʵÏÖ£¬×îÖÕÖ»Äܽ«´¦ÀíÍêµÄÊý¾ÝÊä³ö±£´æÔÚ .txt
ÎļþÖУ¬È»ºó½èÖúºÃÓÑдµÄÍøÒ³½øÐÐÏÔʾ¡£
Äѵ㣺(1) ÈçºÎ½«Êý¾ÝÁ÷Êä³ö±£´æµ½ .txt ÎļþÖС£
(2) ÍøÒ³µÄʹÓü°×¢ÒâÊÂÏî
ÔÚtestbenchÀï¼ÓÈëÏÂÃæËùʾ´úÂë¼´¿É½«Í¼Æ¬Êý¾Ý±£´æµ½ .txt Îı¾
´úÂëÈçÏ£º
integer w_file;
initial
w_file = $fopen("data_out_3.txt");
//±£´æÊý¾ÝµÄÎļþÃû
always @(posedge clk or negedge rst_n)
begin
if(flag_write==1&&post_href==1)//¸ù¾Ý×Ô¼ºµÄÐèÇó¶¨Òå
$fdisplay(w_file,"%b",post_y_data);
end |
ÍøÒ³µÄ½çÃæÈçÏ£¬½«²ÎÊýÉèÖúÃÒÔºó¾Í¿ÉÒÔÏÔʾͼƬ¡£
ÏÂÔØÁ´½Ó http : // files .cnblogs .com
/ files / aslmer / aggregrate . zip
![](images/201802128.png)
×¢Ò⣺ÓÉÓÚ´ËÍøÕ¾ÊÇÁ¿Éí¶¨×öµÄ£¬ËùÒÔÖ»ÄÜÏÔʾÊý¾Ý¸ñʽΪRGB565µÄ16λ¶þ½øÖƵÄÊý²ÅÄÜÕýÈ·ÏÔʾ£¬×¢Òâ²»ÄÜÓзֺţ¬ÕýÈ·¸ñʽʾÀýÈçÏ£¬±ØÐëÑϸñ×ñÊØ
![](images/201802129.png)
½á¹ûչʾ
![](images/2018021210.png)
С½á£º¾ùÖµÂ˲¨´¦ÀíºóµÄͼƬÓÐÃ÷ÏԵĺڱߣ¬²úÉúÕâÒ»ÏÖÏóµÄÔÒò¾ÍÊÇÉú³É 3*3 ÏñËؾØÕóºÍÈ¡ÏñËØֵʱÊý¾ÝÓÐËðʧÔì³ÉµÄ£¬µ«ÊÇÕâÒ²ÊÇ¿ÉÒÔÓÅ»¯µÄ£¬ºóÐøÎÒ»á¼ÌÐøŬÁ¦²»¶ÏÍêÉÆ¡£±¾´ÎÖ»ÊǼòµ¥¶ÔÒ»·ùͼÏñ½øÐбßÔµ¼ì²â£¬ÎҵĺóÐøÄ¿±êÊÇʵÏÖͼƬµÄʵʱ´¦Àí£¬ÕâÓÖÐèҪѧϰºÜ¶à¶«Î÷ÁË£¬SDRAM¡¢ÉãÏñÍ·Çý¶¯µÈµÈµÈ£¬Ô½Ñ§Ï°Ô½·¢ÏÖ×Ô¼ºÖªµÀµÄʵÔÚÊÇÌ«ÉÙÁË£¬ÓÀÔ¶ÔÚ·ÉÏ£¬Ñ§ÎÞÖ¹¾³¡£Ï£ÍûÎҵķÖÏíÄܹ»°ïÖúһЩºÍÎÒÒ»ÑùÈÈ°®
FPGA ͼÏñ´¦ÀíµÄÅóÓÑ¡£
|