1.sobel算子(verilog)
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/11/20 15:33:31
// Design Name:
// Module Name: x
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module x(
input wire vga_clk,
input wire rst_n,
input wire [9:0] pos_x,
input wire [9:0] pos_y,
input wire [23:0] rgb_data,
output reg [11:0] soble_out
);
reg state;
wire [7:0] r;
wire [7:0] g;
wire [7:0] b;
wire [23:0] gray;
assign r=rgb_data[23:16];
assign g=rgb_data[15:8];
assign b=rgb_data[7:0];
assign gray = r*5/16 +g*9/16 + b*2/4;
//assign gray_data ={gray,gray,gray };
reg line_clk;
reg [7:0] linebuf0[639:0];
reg [7:0] linebuf1[639:0];
reg [7:0] p0;
reg [7:0] p1;
reg [7:0] p2;
reg [9:0] conv_out;
always@(posedge vga_clk or negedge rst_n)
if(pos_y >0 && pos_y <480 && pos_x == 0)
line_clk =1;
else
line_clk =0;
//--------------------state-----------------------
always@(posedge vga_clk or negedge rst_n)
if(pos_y == 1'd1)
state<= 0;
else
state <= ~state;
always@(posedge vga_clk)
begin
case(state)
1'b0:
begin
linebuf0[pos_x] <= gray;
linebuf1[pos_x]<= linebuf1[pos_x];
p2<=gray;
p1<=p2;
p0 <=p1;
if(pos_x>1 && pos_y >2)
// 1 2 3 -1 -2 -1
//4 5 6 0 0 0
//7 8 9 1 2 1
begin
if((p0 +p1*2 +p2) >(linebuf0[pos_x-2]+ linebuf0[pos_x-1]+linebuf0[pos_x]))
conv_out <= ( (p0 +p1*2 +p2)-(linebuf0[pos_x-2]+ linebuf0[pos_x-1]+linebuf0[pos_x]) )/4;
else
conv_out <= ( (linebuf0[pos_x-2]+ linebuf0[pos_x-1]+linebuf0[pos_x]) -(p0 +p1*2 +p2) )/4;
end
end
1'b1: begin
linebuf1[pos_x] <= gray;
linebuf0[pos_x]<= linebuf0[pos_x];
p2<=gray;
p1<=p2;
p0 <=p1;
if(pos_x>1 && pos_y >2)
begin
if((p0 +p1*2 +p2) >(linebuf1[pos_x-2]+ linebuf1[pos_x-1]+linebuf1[pos_x]))
conv_out <= ( (p0 +p1*2 +p2)-(linebuf1[pos_x-2]+ linebuf1[pos_x-1]+linebuf1[pos_x]) );