簡介
用verilog實現(xiàn)彩色圖像的灰度化算法,并進(jìn)行Modelsim仿真。
圖像處理操作中最簡單的一類就是點操作,一個像素的輸出只取決于輸入圖像的相應(yīng)像素值。
RGB轉(zhuǎn)GRAY公式:
GRAY = 0.299R + 0.587G + 0.114B
由于FPGA不方便小數(shù)運算,所以放大256倍進(jìn)行運算,然后右移8位:
GRAY = (77R + 150G + 29B) >> 8
彩色圖像的灰度化屬于點操作,但兩級寄存器之間組合邏輯過多會導(dǎo)致時序出問題,所以對該公式進(jìn)行流水線處理,分為三級流水線:
- 第一級處理乘法
- 第二級處理加法
- 第三級處理移位
模塊說明
module rgb2gray(
input clk,
input rst_n,
// input data & valid
input iValid,
input [7:0] red,
input [7:0] green,
input [7:0] blue,
// output data & valid
output oValid,
output [7:0] gray
);
為了簡單起見,輸入輸出都是valid+data的形式
第一級流水線:乘法
// 第一級乘法寄存器
reg [15:0] red_r;
reg [15:0] green_r;
reg [15:0] blue_r;
always @(posedge clk, negedge rst_n) begin
if(!rst_n) begin
red_r <= 0;
green_r <= 0;
blue_r <= 0;
end else begin
red_r <= red * 8'd77;
green_r <= green * 8'd150;
blue_r <= blue * 8'd29;
end
end
第二級流水線:加法
// 第二級加法寄存器
reg [15:0] gray_r1;
always @(posedge clk, negedge rst_n) begin
if(!rst_n)
gray_r1 <= 0;
else
gray_r1 <= red_r + green_r + blue_r;
end
第三級流水線:移位
// 第三級移位寄存器
reg [7:0] gray_r2;
always @(posedge clk, negedge rst_n) begin
if(!rst_n)
gray_r2 <= 0;
else
gray_r2 <= gray_r1[15:8];
end
assign gray = gray_r2;
valid延遲輸出
因為流水線消耗了3個時鐘周期,所以輸出valid相較于輸入valid要延遲3拍
// valid打三拍
reg [2:0] valid_shift;
always @(posedge clk, negedge rst_n) begin
if(!rst_n)
valid_shift <= 0;
else
valid_shift <= {valid_shift[1:0], iValid};
end
assign oValid = valid_shift[2];
Modelsim仿真
寫個testbench模擬50個像素輸入:文章來源:http://www.zghlxwxcb.cn/news/detail-469383.html
`timescale 1ns/1ns
module rgb2gray_tb;
reg clk = 1'b1;
always #10 clk = ~clk;
reg rst_n = 1'b0;
reg iValid = 1'b0;
reg [7:0] red = 8'd0;
reg [7:0] green = 8'd0;
reg [7:0] blue = 8'd0;
// 用于對比
wire [7:0] gray_ref = red * 0.299 + green * 0.587 + blue * 0.114;
wire oValid;
wire [7:0] gray;
initial begin
#20 rst_n <= 1'b1;
// 仿真50個像素
repeat(50) begin
#20;
iValid <= 1'b1;
red <= $random;
green <= $random;
blue <= $random;
end
#100 $stop;
end
rgb2gray inst_rgb2gray(
.clk (clk),
.rst_n (rst_n),
.iValid (iValid),
.red (red),
.green (green),
.blue (blue),
.oValid (oValid),
.gray (gray)
);
endmodule
波形圖如下:
圖中gray_ref是參考答案,可以看出,gray比gray_ref慢三個時鐘周期,因為模塊內(nèi)部有三級流水線。
輸出與參考答案偶爾有誤差,那是因為FPGA中沒有進(jìn)行浮點數(shù)運算,將小數(shù)放大了256倍,然后取整用于運算,最后再縮小256倍,肯定是有誤差的,不過影響不大,可以忽略。文章來源地址http://www.zghlxwxcb.cn/news/detail-469383.html
到了這里,關(guān)于FPGA圖像處理-灰度化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!