【基于FPGA的圖像處理工程】邊緣檢測工程之伽馬矯正模塊代碼解析
【基于FPGA的圖像處理工程】
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?—邊緣檢測工程:伽馬矯正模塊代碼解析
本文為明德?lián)P原創(chuàng)文章,轉(zhuǎn)載請注明出處!
本模塊的功能是,接收輸入的像素數(shù)據(jù),進行伽馬校正之后輸出。
一、設(shè)計架構(gòu)
1、架構(gòu)圖
下圖為本模塊的架構(gòu)圖。

上圖所示,輸入的像素數(shù)據(jù)din是由R、G、B三部分組成,經(jīng)過數(shù)據(jù)分解電路將其分開,其中din[15:11]表示R的值,賦值給din_r;din[10:5]表示G的值,賦值給din_g;din[4:0]表示B的值,賦值給din_b。三個RAM中存儲的是像素的顏色數(shù)據(jù)對應(yīng)的伽馬矯正之后的數(shù)據(jù),din_r、din_g、din_b分別作為ram_r、ram_g、ram_b的地址,對應(yīng)的輸出dout_r、dout_g、dout_b即是伽馬校正之后的顏色數(shù)據(jù),將三個數(shù)據(jù)經(jīng)過數(shù)據(jù)拼接電路重新按照R、G、B的順序拼接起來得到的dout,就是對應(yīng)輸入的像素數(shù)據(jù)伽馬校正之后的數(shù)據(jù)。
2、RAM

上圖為RAM的地址“address”與輸出“q”的關(guān)系,在RAM中,一個地址就對應(yīng)一個數(shù)據(jù),假設(shè)地址0對應(yīng)的數(shù)據(jù)是0、地址1對應(yīng)數(shù)據(jù)是1、地址2對應(yīng)數(shù)據(jù)是2,這樣以此類推,然而在實際輸出的時候可以發(fā)現(xiàn),輸入相應(yīng)的地址后,“q”是在下一個時鐘周期的時候輸出對應(yīng)的值,也就是輸入經(jīng)過ram之后會有一個時鐘的延時。那么為了實現(xiàn)dout_vld、dout_sop、dout_eop等指示信號的作用,輸入的din_vld、din_sop、din_eop就要經(jīng)過時序邏輯延時一個時鐘才能賦值給輸出的對應(yīng)的信號。
二、信號的意義

三、參考代碼
下面展出本模塊的設(shè)計源代碼:
module? ?mdyGamma(
? ?? ???clk? ?? ? ,
? ?? ???rst_n? ???,
? ?? ???din? ?? ? ,
? ?? ???din_sop? ?,
? ?? ???din_eop? ?,
? ?? ???din_vld? ?,
? ?? ???dout? ?? ?,
? ?? ???dout_sop??,
? ?? ???dout_eop??,
? ?? ???dout_vld? ?
);
input? ?? ?? ?clk? ?? ?? ?;
input? ?? ?? ?rst_n? ?? ? ;
input [15:0]??din? ?? ?? ?;
input? ?? ?? ?din_sop? ???;
input? ?? ?? ?din_eop? ???;
input? ?? ?? ?din_vld? ???;
output[15:0]??dout? ?? ???;
output? ?? ???dout_sop? ? ;
output? ?? ???dout_eop? ? ;
output? ?? ???dout_vld? ? ;
wire? ?[4:0]??din_r? ?? ? ;
wire? ?[5:0]??din_g? ?? ? ;
wire? ?[4:0]??din_b? ?? ? ;
wire? ?[5:0]??dout_r? ?? ?;
wire? ?[6:0]??dout_g? ?? ?;
wire? ?[5:0]??dout_b? ?? ?;
reg? ? [4:0]??dout_r_ff0??;
reg? ? [4:0]??dout_r_ff1??;
reg? ? [5:0]??dout_g_ff0??;
reg? ? [5:0]??dout_g_ff1??;
reg? ? [4:0]??dout_b_ff0??;
reg? ? [4:0]??dout_b_ff1??;
reg? ?? ?? ???dout_vld_ff0;
reg? ?? ?? ???dout_sop_ff0;
reg? ?? ?? ???dout_eop_ff0;
reg? ?? ?? ???dout_vld? ? ;
reg? ?? ?? ???dout_sop? ? ;
reg? ?? ?? ???dout_eop? ? ;
assign din_r = din[15:11];
assign din_g = din[10:5];
assign din_b = din[4:0];
ram_r u_ram_r(
? ? .clock? ???(clk),
? ? .address? ?({1'b0,din_r}),
? ? .q? ?? ?? ?(dout_r)
);
ram_g u_ram_g(
? ? .clock? ???(clk),
? ? .address? ?({1'b0,din_g}),
? ? .q? ?? ?? ?(dout_g)
);
ram_b u_ram_b(
? ? .clock? ???(clk),
? ? .address? ?({1'b0,din_b}),
? ? .q? ?? ?? ?(dout_b)
);
assign dout = {dout_r[4:0],dout_g[5:0],dout_b[4:0]};
always??@(posedge clk or negedge rst_n)begin
? ? if(rst_n==1'b0)begin
? ?? ???dout_vld_ff0 <= 0;
? ?? ???dout_vld? ???<= 0;
? ?? ???dout_sop_ff0 <= 0;
? ?? ???dout_sop? ???<= 0;
? ?? ???dout_eop_ff0 <= 0;
? ?? ???dout_eop? ???<= 0;
? ? end
? ? else begin
? ?? ???dout_vld? ???<= din_vld;
? ?? ???dout_sop? ???<= din_sop;
? ?? ???dout_eop? ???<= din_eop;
? ? end
end
endmodule
復(fù)制代碼
?明德?lián)P專注FPGA研究,我司正在連載兩本書籍: 《基于FPGA至簡設(shè)計法實現(xiàn)的圖像邊緣檢測系統(tǒng)》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=691)、《ASIC和FPGA時序約束理論與應(yīng)用》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=705),有興趣點擊閱讀。