Window TB working so far

This commit is contained in:
jaseg 2021-06-16 11:26:47 +02:00
parent 8fd6a5add9
commit e4db91872c
4 changed files with 1157 additions and 0 deletions

232
src/window_matcher.v Normal file
View file

@ -0,0 +1,232 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 06/14/2021 05:44:00 PM
// Design Name:
// Module Name: window_matcher
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module window_matcher(
input clk,
input rst,
input in_blank,
input in_hsync,
input in_vsync,
input [7:0] in_red,
input [7:0] in_green,
input [7:0] in_blue,
output reg win_hsync,
output reg win_vsync,
output win_blank,
output reg out_data_en,
output reg out_data_valid,
output reg [23:0] out_data,
output reg pattern_locked,
output reg [11:0] pattern_w,
output reg [11:0] pattern_h
);
reg [11:0] cur_x;
reg [11:0] cur_y;
reg [11:0] cur_x_sr [2:0];
reg [11:0] marker_x;
reg [11:0] marker_y;
/* rx_x trails by 4 px in the first window row, since we cannot start counting before the marker was fully detected */
reg [11:0] rx_x;
reg [11:0] rx_y;
wire [23:0] in_pxd = {in_red, in_green, in_blue};
reg [11:0] in_pxd_match_sr;
wire [3:0] in_pxd_match;
reg last_hsync;
reg last_vsync;
wire in_pxd_pattern_match;
reg pattern_found;
reg pattern_rx;
wire pattern_meta_rx;
wire pattern_data_rx;
wire [11:0] end_x;
wire [11:0] end_y;
reg [23:0] pattern_meta [3:0];
localparam [23:0] PATTERN_0 = 24'h012345;
localparam [23:0] PATTERN_1 = 24'h6789ab;
localparam [23:0] PATTERN_2 = 24'hcdef42;
localparam [23:0] PATTERN_3 = 24'h543210;
assign in_pxd_match = {
in_pxd == PATTERN_3,
in_pxd == PATTERN_2,
in_pxd == PATTERN_1,
in_pxd == PATTERN_0
};
assign in_pxd_pattern_match =
in_pxd_match_sr[2+0*4] == 1'b1
&& in_pxd_match_sr[1+1*4] == 1'b1
&& in_pxd_match_sr[0+2*4] == 1'b1
&& in_pxd_match[3] == 1'b1
&& in_blank == 1'b0;
assign pattern_meta_rx = pattern_rx && rx_x < 4 && rx_y == 0;
assign pattern_data_rx = pattern_rx && !pattern_meta_rx;
assign end_x = marker_x + pattern_meta[2];
assign end_y = marker_y + pattern_meta[3];
assign win_blank = !win_hsync;
always @(posedge clk) begin
if (rst) begin
out_data <= 0;
out_data_valid <= 0;
out_data_en <= 0;
win_hsync <= 0;
win_vsync <= 0;
cur_x = 0;
cur_y = 0;
cur_x_sr[0] <= 0;
cur_x_sr[1] <= 0;
cur_x_sr[2] <= 0;
marker_x <= 0;
marker_y <= 0;
pattern_w <= 0;
pattern_h <= 0;
rx_x <= 0;
rx_y <= 0;
last_hsync <= 0;
last_vsync <= 0;
in_pxd_match_sr <= 0;
pattern_found <= 0;
pattern_locked <= 0;
pattern_rx <= 0;
pattern_meta[0] <= 0;
pattern_meta[1] <= 0;
pattern_meta[2] <= 0;
pattern_meta[3] <= 0;
end else begin
/* TODO add occlusion handling */
last_hsync <= in_hsync;
last_vsync <= in_vsync;
if (last_hsync == 1'b1 && in_hsync == 1'b0) begin
cur_x <= 0;
cur_x_sr[0] <= 0;
cur_x_sr[1] <= 0;
cur_x_sr[2] <= 0;
cur_y <= cur_y + 1;
in_pxd_match_sr <= 0;
rx_x <= 0;
if (pattern_rx == 1'b1) begin
rx_y <= rx_y+1;
end
end
if (last_vsync == 1'b1 && in_vsync == 1'b0) begin
cur_y <= 0;
rx_y <= 0;
out_data_en <= 0;
rx_x <= 0;
rx_y <= 0;
pattern_rx <= 0;
if (!pattern_found) begin
pattern_locked <= 0;
pattern_w = 0;
pattern_h = 0;
marker_x <= 0;
marker_y <= 0;
pattern_meta[0] <= 0;
pattern_meta[1] <= 0;
pattern_meta[2] <= 0;
pattern_meta[3] <= 0;
end else begin
pattern_locked <= 1;
pattern_w = pattern_meta[2];
pattern_h = pattern_meta[3];
end
pattern_found <= 0;
end
out_data_valid <= 0;
if (in_blank == 1'b0) begin
cur_x <= cur_x + 1;
cur_x_sr[0] <= cur_x;
cur_x_sr[1] <= cur_x_sr[0];
cur_x_sr[2] <= cur_x_sr[1];
in_pxd_match_sr <= { in_pxd_match_sr[7:0], in_pxd_match };
if (in_pxd_pattern_match && !pattern_found) begin
pattern_rx <= 1'b1;
pattern_found <= 1'b1;
marker_x <= cur_x;
marker_y <= cur_y;
end
if (pattern_rx) begin
rx_x <= rx_x+1;
if (pattern_meta_rx) begin
case (rx_x)
0: pattern_meta[0] = in_pxd;
1: pattern_meta[1] = in_pxd;
2: pattern_meta[2] = in_pxd;
3: pattern_meta[3] = in_pxd;
endcase
end
if (pattern_data_rx) begin
out_data <= in_pxd;
out_data_valid <= 1'b1;
out_data_en <= 1'b1;
end
end
if (pattern_locked) begin
if (cur_x == marker_x) begin
win_hsync <= 1;
end
if (cur_x == end_x) begin
win_hsync <= 0;
end
if (cur_y == marker_y) begin
win_vsync <= 1;
end
if (cur_y == end_y) begin
win_vsync <= 0;
end
end
end
end
end
endmodule

View file

@ -0,0 +1,98 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 06/15/2021 10:49:32 AM
// Design Name:
// Module Name: window_matcher_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module window_matcher_tb();
reg clk;
reg rst;
wire in_blank;
reg in_hsync;
reg in_vsync;
reg [7:0] in_red;
reg [7:0] in_green;
reg [7:0] in_blue;
wire win_hsync;
wire win_vsync;
wire win_blank;
wire out_data_en;
wire out_data_valid;
wire [23:0] out_data;
wire pattern_locked;
wire [11:0] pattern_w;
wire [11:0] pattern_h;
localparam period = 4;
assign in_blank = !(in_vsync && in_hsync);
initial begin
clk = 0;
rst = 1;
in_hsync = 0;
in_vsync = 0;
in_red = 0;
in_green = 0;
in_blue = 0;
repeat(2) #period clk = ~clk;
rst = 0;
forever #period clk = ~clk;
end
`include "test_data/00WM_TEST_POS_LOADERS.v"
integer read_pos;
reg [31:0] expected_data;
initial begin
`include "test_data/00WM_TEST_POS_RUNNERS.v"
$finish;
end
window_matcher window_matcher_i (
.clk(clk),
.rst(rst),
.in_blank(in_blank),
.in_hsync(in_hsync),
.in_vsync(in_vsync),
.in_red(in_red),
.in_green(in_green),
.in_blue(in_blue),
.win_hsync(win_hsync),
.win_vsync(win_vsync),
.win_blank(win_blank),
.out_data_en(out_data_en),
.out_data_valid(out_data_valid),
.out_data(out_data),
.pattern_locked(pattern_locked),
.pattern_w(pattern_w),
.pattern_h(pattern_h)
);
endmodule

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,269 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="window_matcher_tb_behav.wdb" id="1">
<top_modules>
<top_module name="glbl" />
<top_module name="window_matcher_tb" />
</top_modules>
</db_ref>
</db_ref_list>
<zoom_setting>
<ZoomStartTime time="303526166fs"></ZoomStartTime>
<ZoomEndTime time="303705967fs"></ZoomEndTime>
<Cursor1Time time="303676000fs"></Cursor1Time>
</zoom_setting>
<column_width_setting>
<NameColumnWidth column_width="175"></NameColumnWidth>
<ValueColumnWidth column_width="174"></ValueColumnWidth>
</column_width_setting>
<WVObjectSize size="60" />
<wvobject fp_name="/window_matcher_tb/clk" type="logic">
<obj_property name="ElementShortName">clk</obj_property>
<obj_property name="ObjectShortName">clk</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/rst" type="logic">
<obj_property name="ElementShortName">rst</obj_property>
<obj_property name="ObjectShortName">rst</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/in_blank" type="logic">
<obj_property name="ElementShortName">in_blank</obj_property>
<obj_property name="ObjectShortName">in_blank</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/in_hsync" type="logic">
<obj_property name="ElementShortName">in_hsync</obj_property>
<obj_property name="ObjectShortName">in_hsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/in_vsync" type="logic">
<obj_property name="ElementShortName">in_vsync</obj_property>
<obj_property name="ObjectShortName">in_vsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/in_red" type="array">
<obj_property name="ElementShortName">in_red[7:0]</obj_property>
<obj_property name="ObjectShortName">in_red[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/in_green" type="array">
<obj_property name="ElementShortName">in_green[7:0]</obj_property>
<obj_property name="ObjectShortName">in_green[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/in_blue" type="array">
<obj_property name="ElementShortName">in_blue[7:0]</obj_property>
<obj_property name="ObjectShortName">in_blue[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/win_hsync" type="logic">
<obj_property name="ElementShortName">win_hsync</obj_property>
<obj_property name="ObjectShortName">win_hsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/win_vsync" type="logic">
<obj_property name="ElementShortName">win_vsync</obj_property>
<obj_property name="ObjectShortName">win_vsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/win_blank" type="logic">
<obj_property name="ElementShortName">win_blank</obj_property>
<obj_property name="ObjectShortName">win_blank</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/out_data_en" type="logic">
<obj_property name="ElementShortName">out_data_en</obj_property>
<obj_property name="ObjectShortName">out_data_en</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/out_data_valid" type="logic">
<obj_property name="ElementShortName">out_data_valid</obj_property>
<obj_property name="ObjectShortName">out_data_valid</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/out_data" type="array">
<obj_property name="ElementShortName">out_data[23:0]</obj_property>
<obj_property name="ObjectShortName">out_data[23:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/pattern_w" type="array">
<obj_property name="ElementShortName">pattern_w[11:0]</obj_property>
<obj_property name="ObjectShortName">pattern_w[11:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/pattern_h" type="array">
<obj_property name="ElementShortName">pattern_h[11:0]</obj_property>
<obj_property name="ObjectShortName">pattern_h[11:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/read_pos" type="array">
<obj_property name="ElementShortName">read_pos[31:0]</obj_property>
<obj_property name="ObjectShortName">read_pos[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/period" type="array">
<obj_property name="ElementShortName">period[31:0]</obj_property>
<obj_property name="ObjectShortName">period[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/clk" type="logic">
<obj_property name="ElementShortName">clk</obj_property>
<obj_property name="ObjectShortName">clk</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/rst" type="logic">
<obj_property name="ElementShortName">rst</obj_property>
<obj_property name="ObjectShortName">rst</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_blank" type="logic">
<obj_property name="ElementShortName">in_blank</obj_property>
<obj_property name="ObjectShortName">in_blank</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_hsync" type="logic">
<obj_property name="ElementShortName">in_hsync</obj_property>
<obj_property name="ObjectShortName">in_hsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_vsync" type="logic">
<obj_property name="ElementShortName">in_vsync</obj_property>
<obj_property name="ObjectShortName">in_vsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_red" type="array">
<obj_property name="ElementShortName">in_red[7:0]</obj_property>
<obj_property name="ObjectShortName">in_red[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_green" type="array">
<obj_property name="ElementShortName">in_green[7:0]</obj_property>
<obj_property name="ObjectShortName">in_green[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_blue" type="array">
<obj_property name="ElementShortName">in_blue[7:0]</obj_property>
<obj_property name="ObjectShortName">in_blue[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/win_hsync" type="logic">
<obj_property name="ElementShortName">win_hsync</obj_property>
<obj_property name="ObjectShortName">win_hsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/win_vsync" type="logic">
<obj_property name="ElementShortName">win_vsync</obj_property>
<obj_property name="ObjectShortName">win_vsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/win_blank" type="logic">
<obj_property name="ElementShortName">win_blank</obj_property>
<obj_property name="ObjectShortName">win_blank</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/out_data_en" type="logic">
<obj_property name="ElementShortName">out_data_en</obj_property>
<obj_property name="ObjectShortName">out_data_en</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/out_data_valid" type="logic">
<obj_property name="ElementShortName">out_data_valid</obj_property>
<obj_property name="ObjectShortName">out_data_valid</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/out_data" type="array">
<obj_property name="ElementShortName">out_data[23:0]</obj_property>
<obj_property name="ObjectShortName">out_data[23:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/expected_data" type="array">
<obj_property name="ElementShortName">expected_data[31:0]</obj_property>
<obj_property name="ObjectShortName">expected_data[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_w" type="array">
<obj_property name="ElementShortName">pattern_w[11:0]</obj_property>
<obj_property name="ObjectShortName">pattern_w[11:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_h" type="array">
<obj_property name="ElementShortName">pattern_h[11:0]</obj_property>
<obj_property name="ObjectShortName">pattern_h[11:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/cur_x" type="array">
<obj_property name="ElementShortName">cur_x[11:0]</obj_property>
<obj_property name="ObjectShortName">cur_x[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/cur_y" type="array">
<obj_property name="ElementShortName">cur_y[11:0]</obj_property>
<obj_property name="ObjectShortName">cur_y[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/cur_x_sr" type="array">
<obj_property name="ElementShortName">cur_x_sr[2:0][11:0]</obj_property>
<obj_property name="ObjectShortName">cur_x_sr[2:0][11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/marker_x" type="array">
<obj_property name="ElementShortName">marker_x[11:0]</obj_property>
<obj_property name="ObjectShortName">marker_x[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/marker_y" type="array">
<obj_property name="ElementShortName">marker_y[11:0]</obj_property>
<obj_property name="ObjectShortName">marker_y[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/rx_x" type="array">
<obj_property name="ElementShortName">rx_x[11:0]</obj_property>
<obj_property name="ObjectShortName">rx_x[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/rx_y" type="array">
<obj_property name="ElementShortName">rx_y[11:0]</obj_property>
<obj_property name="ObjectShortName">rx_y[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_pxd" type="array">
<obj_property name="ElementShortName">in_pxd[23:0]</obj_property>
<obj_property name="ObjectShortName">in_pxd[23:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_pxd_match_sr" type="array">
<obj_property name="ElementShortName">in_pxd_match_sr[11:0]</obj_property>
<obj_property name="ObjectShortName">in_pxd_match_sr[11:0]</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_pxd_match" type="array">
<obj_property name="ElementShortName">in_pxd_match[3:0]</obj_property>
<obj_property name="ObjectShortName">in_pxd_match[3:0]</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/last_hsync" type="logic">
<obj_property name="ElementShortName">last_hsync</obj_property>
<obj_property name="ObjectShortName">last_hsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/last_vsync" type="logic">
<obj_property name="ElementShortName">last_vsync</obj_property>
<obj_property name="ObjectShortName">last_vsync</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/in_pxd_pattern_match" type="logic">
<obj_property name="ElementShortName">in_pxd_pattern_match</obj_property>
<obj_property name="ObjectShortName">in_pxd_pattern_match</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_found" type="logic">
<obj_property name="ElementShortName">pattern_found</obj_property>
<obj_property name="ObjectShortName">pattern_found</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_locked" type="logic">
<obj_property name="ElementShortName">pattern_locked</obj_property>
<obj_property name="ObjectShortName">pattern_locked</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_rx" type="logic">
<obj_property name="ElementShortName">pattern_rx</obj_property>
<obj_property name="ObjectShortName">pattern_rx</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_meta_rx" type="logic">
<obj_property name="ElementShortName">pattern_meta_rx</obj_property>
<obj_property name="ObjectShortName">pattern_meta_rx</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_data_rx" type="logic">
<obj_property name="ElementShortName">pattern_data_rx</obj_property>
<obj_property name="ObjectShortName">pattern_data_rx</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/end_x" type="array">
<obj_property name="ElementShortName">end_x[11:0]</obj_property>
<obj_property name="ObjectShortName">end_x[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/end_y" type="array">
<obj_property name="ElementShortName">end_y[11:0]</obj_property>
<obj_property name="ObjectShortName">end_y[11:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/pattern_meta" type="array">
<obj_property name="ElementShortName">pattern_meta[3:0][23:0]</obj_property>
<obj_property name="ObjectShortName">pattern_meta[3:0][23:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/PATTERN_0" type="array">
<obj_property name="ElementShortName">PATTERN_0[23:0]</obj_property>
<obj_property name="ObjectShortName">PATTERN_0[23:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/PATTERN_1" type="array">
<obj_property name="ElementShortName">PATTERN_1[23:0]</obj_property>
<obj_property name="ObjectShortName">PATTERN_1[23:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/PATTERN_2" type="array">
<obj_property name="ElementShortName">PATTERN_2[23:0]</obj_property>
<obj_property name="ObjectShortName">PATTERN_2[23:0]</obj_property>
</wvobject>
<wvobject fp_name="/window_matcher_tb/window_matcher_i/PATTERN_3" type="array">
<obj_property name="ElementShortName">PATTERN_3[23:0]</obj_property>
<obj_property name="ObjectShortName">PATTERN_3[23:0]</obj_property>
</wvobject>
</wave_config>