diff --git a/Artix-7-HDMI-processing.xpr b/Artix-7-HDMI-processing.xpr
index 8b8055f..dc579a2 100644
--- a/Artix-7-HDMI-processing.xpr
+++ b/Artix-7-HDMI-processing.xpr
@@ -42,7 +42,7 @@
-
+
diff --git a/src/window_matcher.v b/src/window_matcher.v
index 8038f5a..4a73e96 100644
--- a/src/window_matcher.v
+++ b/src/window_matcher.v
@@ -21,220 +21,262 @@
module window_matcher(
- input clk,
- input rst,
+ /* Pixel clock and synchronous, active-high reset */
+ input clk, 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,
+ /* Input pixel bus */
+ input in_blank, in_hsync, in_vsync,
+ input [7:0] in_red, [7:0] in_green, [7:0] in_blue,
- output win_hsync,
- output win_vsync,
- output win_blank,
+ /* Output pixel bus */
+ output out_blank,
+ output out_hsync, out_vsync,
+ output [7:0] out_red, [7:0] out_green, [7:0] out_blue,
+
+ /* Overlay data IO */
+ output win_hsync, win_vsync,
+ output win_blank,
+ output reg [11:0] win_w,
+ output reg [11:0] win_h,
+ output reg win_locked,
+ input [7:0] win_red, [7:0] win_green, [7:0] win_blue,
- output reg out_data_en,
+ /* Extracted data output */
+ output 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
+ output [23:0] out_data
);
+
+ assign out_blank = ~out_hsync;
+ assign win_blank = ~win_hsync;
+
+ wire [23:0] in_pxd = {in_red, in_green, in_blue};
+ wire [23:0] win_pxd = {win_red, win_green, win_blue};
+ wire [23:0] out_pxd;
+ assign {out_red, out_green, out_blue} = out_pxd;
- reg [11:0] cur_x;
- reg [11:0] cur_y;
- reg [11:0] cur_x_sr [3: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 win_hsync_int;
- reg win_vsync_int;
-
- 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;
+ localparam [23:0] MARKER_0 = 24'h012345;
+ localparam [23:0] MARKER_1 = 24'h6789ab;
+ localparam [23:0] MARKER_2 = 24'hcdef42;
+ localparam [23:0] MARKER_3 = 24'h543210;
- assign in_pxd_match = {
- in_pxd == PATTERN_3,
- in_pxd == PATTERN_2,
- in_pxd == PATTERN_1,
- in_pxd == PATTERN_0
+ wire [3:0] in_pxd_match = {
+ in_pxd == MARKER_3,
+ in_pxd == MARKER_2,
+ in_pxd == MARKER_1,
+ in_pxd == MARKER_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_hsync = win_hsync_int && last_hsync && pattern_locked;
- assign win_vsync = win_vsync_int && last_hsync && pattern_locked;
- assign win_blank = !win_hsync;
-
+
+
+ reg [3:0] in_pxd_match_sr [2:0];
+ wire in_pxd_pattern_match =
+ in_pxd_match[3] == 1
+ && in_pxd_match_sr[2][0] == 1
+ && in_pxd_match_sr[1][1] == 1
+ && in_pxd_match_sr[0][2] == 1
+ && in_blank == 0;
+ /* Window matching shift register */
always @(posedge clk) begin
- if (rst) begin
- out_data <= 0;
- out_data_valid <= 0;
- out_data_en <= 0;
- win_hsync_int <= 0;
- win_vsync_int <= 0;
- cur_x = 0;
- cur_y = 0;
- cur_x_sr[0] <= 0;
- cur_x_sr[1] <= 0;
- cur_x_sr[2] <= 0;
- cur_x_sr[3] <= 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;
+ if (rst == 1) begin
+ in_pxd_match_sr[0] <= 0;
+ in_pxd_match_sr[1] <= 0;
+ in_pxd_match_sr[2] <= 0;
end else begin
- /* TODO add occlusion handling */
-
- last_hsync <= in_hsync;
- last_vsync <= in_vsync;
-
- 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;
- win_vsync_int <= 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];
- cur_x_sr[3] <= cur_x_sr[2];
-
- 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;
- win_hsync_int <= 1;
- marker_x <= cur_x_sr[3];
- 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 && win_hsync_int && last_hsync) begin
- out_data <= in_pxd;
- out_data_valid <= 1'b1;
- out_data_en <= 1'b1;
- end
- end
- end
-
- if (cur_x == marker_x && win_vsync_int) begin
- win_hsync_int <= 1;
- end
-
- if (cur_x == end_x) begin
- win_hsync_int <= 0;
- end
-
- if (cur_y == marker_y) begin
- win_vsync_int <= 1;
- end
-
- if (cur_y == end_y) begin
- win_vsync_int <= 0;
- end
-
- 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_x_sr[3] <= 0;
- cur_y <= cur_y + 1;
- in_pxd_match_sr <= 0;
- win_hsync_int <= 0;
-
- rx_x <= 0;
-
- if (pattern_rx == 1'b1) begin
- rx_y <= rx_y+1;
- end
- end
+ in_pxd_match_sr[0] <= in_pxd_match;
+ in_pxd_match_sr[1] <= in_pxd_match_sr[0];
+ in_pxd_match_sr[2] <= in_pxd_match_sr[1];
end
end
+
+ /* Window matching state machine */
+ reg [11:0] scan_x;
+ reg [11:0] scan_y;
+ reg [11:0] window_x;
+ reg [11:0] window_y;
+ reg [11:0] win_w_int;
+ reg [11:0] win_h_int;
+ reg win_hsync_int, win_vsync_int;
+ localparam ST_MAT_WAITING = 6'b000000,
+ ST_MAT_RX0 = 6'b000001,
+ ST_MAT_RX1 = 6'b000010,
+ ST_MAT_RX2 = 6'b000100,
+ ST_MAT_RX3 = 6'b001000,
+ ST_MAT_MATCHED = 6'b010000,
+ ST_MAT_DATA = 6'b100000;
+ reg [5:0] matcher_state;
+ wire matched = matcher_state[5];
+ always @(posedge clk) begin
+ if (rst == 1 || in_vsync == 0) begin
+ matcher_state <= ST_MAT_WAITING;
+ window_x <= 0;
+ window_y <= 0;
+ win_w_int <= 0;
+ win_h_int <= 0;
+
+ end else begin
+ case (matcher_state)
+ ST_MAT_WAITING: begin
+ if (in_pxd_pattern_match) begin
+ matcher_state <= ST_MAT_RX0;
+ window_x <= scan_x_reg[2];
+ window_y <= scan_y;
+ end
+ end
+ ST_MAT_RX0: begin
+ matcher_state <= ST_MAT_RX1;
+ end
+ ST_MAT_RX1: begin
+ matcher_state <= ST_MAT_RX2;
+ end
+ ST_MAT_RX2: begin
+ matcher_state <= ST_MAT_RX3;
+ win_w_int <= in_pxd;
+ end
+ ST_MAT_RX3: begin
+ matcher_state <= ST_MAT_MATCHED;
+ win_h_int <= in_pxd;
+ end
+ ST_MAT_MATCHED: begin
+ matcher_state <= ST_MAT_DATA;
+ win_hsync_int <= 1;
+ out_data_valid <= 1;
+ win_vsync_int <= 1;
+ win_hsync_ctr <= 9;
+ win_vsync_ctr <= 0;
+ end
+ endcase
+ end
+ end
+
+ /* Pixel scan state machine */
+ reg [11:0] scan_x_reg [3:0];
+ reg in_hsync_reg;
+ reg in_vsync_reg;
+ reg [23:0] in_pxd_reg;
+
+ assign out_hsync = in_hsync_reg;
+ assign out_vsync = in_vsync_reg;
+
+ always @(posedge clk) begin
+ if (rst == 1) begin
+ scan_x <= 0;
+ scan_x_reg[0] <= 0;
+ scan_x_reg[1] <= 0;
+ scan_x_reg[2] <= 0;
+ scan_x_reg[3] <= 0;
+ scan_y <= 0;
+ in_hsync_reg <= 0;
+ in_vsync_reg <= 0;
+ in_pxd_reg <= 0;
+
+ end else begin
+ in_hsync_reg <= in_hsync;
+ in_vsync_reg <= in_vsync;
+ in_pxd_reg <= in_pxd;
+ scan_x_reg[0] <= scan_x;
+ scan_x_reg[1] <= scan_x_reg[0];
+ scan_x_reg[2] <= scan_x_reg[1];
+ scan_x_reg[3] <= scan_x_reg[2];
+
+ if (in_hsync == 1) begin
+ scan_x <= scan_x + 1;
+ end
+
+ if (in_hsync_reg == 1 && in_hsync == 0) begin
+ scan_y <= scan_y + 1;
+ end
+
+ if (in_hsync_reg == 0 && in_hsync == 1) begin
+ scan_x_reg[0] <= 0;
+ scan_x_reg[1] <= 0;
+ scan_x_reg[2] <= 0;
+ scan_x_reg[3] <= 0;
+ scan_x <= 0;
+ end
+
+ if (in_vsync_reg == 1 && in_vsync == 0) begin
+ scan_y <= 0;
+ end
+ end
+ end
+
+ /* Match locking process */
+ reg match_locked; /* Goes high after a frame with a marker has been fully received */
+ always @(posedge clk) begin
+ if (rst) begin
+ match_locked <= 0;
+
+ end else begin
+ if (in_vsync_reg == 1 && in_vsync == 0) begin
+ match_locked <= matched;
+ win_locked <= matched;
+ win_w <= win_w_int;
+ win_h <= win_h_int;
+ end
+ end
+ end
+
+ /* Window sync generator */
+ reg [11:0] win_hsync_ctr;
+ reg [11:0] win_vsync_ctr;
+
+ assign win_hsync = win_hsync_int && match_locked;
+ assign win_vsync = win_vsync_int && match_locked;
+ always @(posedge clk) begin
+ if (rst == 1) begin
+ win_hsync_int <= 0;
+ win_vsync_int <= 0;
+ win_hsync_ctr <= 0;
+ win_vsync_ctr <= 0;
+ out_data_valid <= 0;
+
+ end else begin
+ if (matcher_state == ST_MAT_DATA) begin
+ /* hsync */
+ if (scan_x == window_x && win_vsync_int == 1) begin
+ win_hsync_int <= 1;
+ win_hsync_ctr <= 1;
+ out_data_valid <= 1;
+ end
+
+ if (win_hsync_int == 1) begin
+ win_hsync_ctr <= win_hsync_ctr + 1;
+ end
+
+ if (win_hsync_ctr == win_w_int) begin
+ win_hsync_int <= 0;
+ out_data_valid <= 0;
+ win_hsync_ctr <= 0;
+ end
+
+ if (in_hsync_reg == 1 && in_hsync == 0) begin
+ if (scan_y == window_y) begin
+ win_vsync_int <= 1;
+ win_vsync_ctr <= 0;
+ end
+
+ win_vsync_ctr <= win_vsync_ctr + 1;
+ end
+
+ if (win_vsync_ctr == win_h_int) begin
+ win_vsync_int <= 0;
+ end
+
+ if (in_vsync_reg == 1 && in_vsync == 0) begin
+ win_vsync_ctr <= 0;
+ end
+ end
+ end
+ end
+
+ /* Payload extractor */
+ reg [23:0] in_pxd_last;
+ always @(posedge clk) in_pxd_last <= rst ? 0 : in_pxd;
+
+ assign out_data_en = (matcher_state == ST_MAT_DATA);
+ assign out_data = out_data_en ? in_pxd_last : 0;
+
+ /* Compositor */
+ assign out_pxd = (win_hsync_int) ? in_pxd_reg : win_pxd;
endmodule
diff --git a/test_bench/window_matcher_tb.v b/test_bench/window_matcher_tb.v
index 4027c5b..4a20ba3 100644
--- a/test_bench/window_matcher_tb.v
+++ b/test_bench/window_matcher_tb.v
@@ -35,14 +35,14 @@ module window_matcher_tb();
wire win_hsync;
wire win_vsync;
wire win_blank;
+
+ wire win_locked;
+ wire [11:0] win_w;
+ wire [11:0] win_h;
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;
@@ -89,14 +89,17 @@ module window_matcher_tb();
.win_hsync(win_hsync),
.win_vsync(win_vsync),
.win_blank(win_blank),
+ .win_locked(win_locked),
+ .win_w(win_w),
+ .win_h(win_h),
.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)
+
+ .win_red(8'haa),
+ .win_green(8'haa),
+ .win_blue(8'haa)
);
endmodule
diff --git a/test_bench/window_matcher_tb_gen.ipynb b/test_bench/window_matcher_tb_gen.ipynb
index 651f967..46a00cc 100644
--- a/test_bench/window_matcher_tb_gen.ipynb
+++ b/test_bench/window_matcher_tb_gen.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "markdown",
- "id": "parental-cruise",
+ "id": "peaceful-dream",
"metadata": {},
"source": [
"# Window Matcher Testcase Generator"
@@ -11,7 +11,7 @@
{
"cell_type": "code",
"execution_count": 67,
- "id": "leading-attachment",
+ "id": "sustained-reservoir",
"metadata": {},
"outputs": [],
"source": [
@@ -32,7 +32,7 @@
{
"cell_type": "code",
"execution_count": 93,
- "id": "involved-palmer",
+ "id": "modular-partnership",
"metadata": {},
"outputs": [],
"source": [
@@ -121,7 +121,7 @@
{
"cell_type": "code",
"execution_count": 87,
- "id": "enhanced-method",
+ "id": "yellow-affiliate",
"metadata": {},
"outputs": [
{
@@ -149,7 +149,7 @@
{
"cell_type": "code",
"execution_count": 94,
- "id": "bibliographic-stockholm",
+ "id": "quick-proposition",
"metadata": {},
"outputs": [],
"source": [
@@ -173,7 +173,7 @@
{
"cell_type": "code",
"execution_count": 95,
- "id": "decent-offering",
+ "id": "usual-flash",
"metadata": {},
"outputs": [
{
@@ -243,7 +243,7 @@
{
"cell_type": "code",
"execution_count": 54,
- "id": "together-tiger",
+ "id": "surrounded-devon",
"metadata": {},
"outputs": [],
"source": [
@@ -264,8 +264,8 @@
},
{
"cell_type": "code",
- "execution_count": 73,
- "id": "executive-storage",
+ "execution_count": 96,
+ "id": "listed-addition",
"metadata": {},
"outputs": [
{
@@ -314,8 +314,8 @@
" \n",
" if (!(win_hsync == 0)) $finish;\n",
" if (!(win_vsync == 0)) $finish;\n",
- " if (!(in_blank == 1 || pattern_w == 0)) $finish;\n",
- " if (!(in_blank == 1 || pattern_h == 0)) $finish;\n",
+ " if (!(in_blank == 1 || win_w == 0)) $finish;\n",
+ " if (!(in_blank == 1 || win_h == 0)) $finish;\n",
" if (!(!out_data_valid || out_data_en)) $finish;\n",
" if (read_pos > 1) begin\n",
" if (!(out_data_valid == ( win_hsync_exp_last && ~win_header_last))) $finish;\n",
@@ -341,10 +341,10 @@
" @(posedge clk);\n",
"end\n",
"\n",
- "if (!(pattern_locked == {{(win_w > 0)|int}})) $finish;\n",
+ "if (!(win_locked == {{(win_w > 0)|int}})) $finish;\n",
"\n",
- "if (!(pattern_w == {{win_w}})) $finish;\n",
- "if (!(pattern_h == {{win_h}})) $finish;\n",
+ "if (!(win_w == {{win_w}})) $finish;\n",
+ "if (!(win_h == {{win_h}})) $finish;\n",
"\n",
"for (read_pos=0; read_pos<{{fb_len}}; read_pos=read_pos+1) begin\n",
" if (read_pos > 0) begin\n",
@@ -364,9 +364,9 @@
" @(posedge clk);\n",
"end\n",
"\n",
- "if (!(pattern_locked == 0)) $finish;\n",
- "if (!(pattern_w == 0)) $finish;\n",
- "if (!(pattern_h == 0)) $finish;\n",
+ "if (!(win_locked == 0)) $finish;\n",
+ "if (!(win_w == 0)) $finish;\n",
+ "if (!(win_h == 0)) $finish;\n",
"\n",
"/* End of generated test case {{name}} */\n",
"'''\n",
@@ -390,7 +390,7 @@
{
"cell_type": "code",
"execution_count": 8,
- "id": "naughty-kitchen",
+ "id": "protected-bronze",
"metadata": {},
"outputs": [],
"source": [
@@ -402,7 +402,7 @@
{
"cell_type": "code",
"execution_count": 9,
- "id": "exposed-paste",
+ "id": "unknown-framing",
"metadata": {},
"outputs": [
{
@@ -425,7 +425,7 @@
{
"cell_type": "code",
"execution_count": 10,
- "id": "digital-carnival",
+ "id": "political-blink",
"metadata": {},
"outputs": [
{
@@ -448,7 +448,7 @@
{
"cell_type": "code",
"execution_count": 11,
- "id": "obvious-diagnosis",
+ "id": "intelligent-locator",
"metadata": {},
"outputs": [
{
@@ -486,7 +486,7 @@
{
"cell_type": "code",
"execution_count": 12,
- "id": "conservative-album",
+ "id": "breeding-representation",
"metadata": {},
"outputs": [
{
@@ -526,7 +526,7 @@
{
"cell_type": "code",
"execution_count": 13,
- "id": "excessive-equality",
+ "id": "duplicate-riverside",
"metadata": {},
"outputs": [
{
@@ -566,7 +566,7 @@
{
"cell_type": "code",
"execution_count": 14,
- "id": "cheap-charleston",
+ "id": "homeless-posting",
"metadata": {},
"outputs": [
{
diff --git a/window_matcher_tb_behav.wcfg b/window_matcher_tb_behav.wcfg
index 4416b9c..327eb6a 100644
--- a/window_matcher_tb_behav.wcfg
+++ b/window_matcher_tb_behav.wcfg
@@ -11,272 +11,233 @@
-
-
-
+
+
+
-
+
-
-
+
+
clk
clk
-
+
rst
rst
-
+
in_blank
in_blank
- #00FFFF
- true
-
+
in_hsync
in_hsync
- #00FFFF
- true
-
+
in_vsync
in_vsync
- #00FFFF
- true
-
+
in_red[7:0]
in_red[7:0]
-
+
in_green[7:0]
in_green[7:0]
-
+
in_blue[7:0]
in_blue[7:0]
-
+
+ out_hsync
+ out_hsync
+
+
+ out_vsync
+ out_vsync
+
+
+ out_red[7:0]
+ out_red[7:0]
+
+
+ out_green[7:0]
+ out_green[7:0]
+
+
+ out_blue[7:0]
+ out_blue[7:0]
+
+
win_hsync
win_hsync
-
-
- win_vsync
- win_vsync
-
-
- win_blank
- win_blank
-
-
- out_data_en
- out_data_en
#FFFF00
true
-
- out_data_valid
- out_data_valid
- #FFFF00
- true
-
-
- out_data[23:0]
- out_data[23:0]
- #FFFF00
- true
-
-
- pattern_w[11:0]
- pattern_w[11:0]
- UNSIGNEDDECRADIX
-
-
- pattern_h[11:0]
- pattern_h[11:0]
- UNSIGNEDDECRADIX
-
-
- read_pos[31:0]
- read_pos[31:0]
- UNSIGNEDDECRADIX
-
-
- period[31:0]
- period[31:0]
-
-
- expected_data[23:0]
- expected_data[23:0]
- #FAAFBE
- true
-
-
- pattern_w[11:0]
- pattern_w[11:0]
- UNSIGNEDDECRADIX
-
-
- pattern_h[11:0]
- pattern_h[11:0]
- UNSIGNEDDECRADIX
-
-
- cur_x[11:0]
- cur_x[11:0]
- UNSIGNEDDECRADIX
-
-
- cur_y[11:0]
- cur_y[11:0]
- UNSIGNEDDECRADIX
-
-
- cur_x_sr[3:0][11:0]
- cur_x_sr[3:0][11:0]
- UNSIGNEDDECRADIX
-
-
-
- marker_x[11:0]
- marker_x[11:0]
- UNSIGNEDDECRADIX
-
-
- marker_y[11:0]
- marker_y[11:0]
- UNSIGNEDDECRADIX
-
-
- rx_x[11:0]
- rx_x[11:0]
-
-
- rx_y[11:0]
- rx_y[11:0]
-
-
- in_pxd[23:0]
- in_pxd[23:0]
-
-
- in_pxd_match_sr[11:0]
- in_pxd_match_sr[11:0]
-
-
- in_pxd_match[3:0]
- in_pxd_match[3:0]
-
-
-
- last_hsync
- last_hsync
-
-
- last_vsync
- last_vsync
-
-
- in_pxd_pattern_match
- in_pxd_pattern_match
-
-
- pattern_found
- pattern_found
-
-
- pattern_locked
- pattern_locked
-
-
- pattern_rx
- pattern_rx
-
-
- pattern_meta_rx
- pattern_meta_rx
-
-
- pattern_data_rx
- pattern_data_rx
-
win_hsync_int
win_hsync_int
-
- win_vsync_int
- win_vsync_int
-
-
- end_x[11:0]
- end_x[11:0]
-
-
- end_y[11:0]
- end_y[11:0]
-
-
- pattern_meta[3:0][23:0]
- pattern_meta[3:0][23:0]
-
-
- PATTERN_0[23:0]
- PATTERN_0[23:0]
-
-
- PATTERN_1[23:0]
- PATTERN_1[23:0]
-
-
- PATTERN_2[23:0]
- PATTERN_2[23:0]
-
-
- PATTERN_3[23:0]
- PATTERN_3[23:0]
-
-
- testcase_id[31:0]
- testcase_id[31:0]
- #008000
- true
-
win_hsync_exp
win_hsync_exp
#FAAFBE
true
+
+ win_vsync
+ win_vsync
+ #FFFF00
+ true
+
+
+ win_vsync_int
+ win_vsync_int
+
win_vsync_exp
win_vsync_exp
#FAAFBE
true
-
- win_header
- win_header
- #FAAFBE
+
+ out_data_en
+ out_data_en
+ #FFA500
true
-
- win_hsync_exp_last
- win_hsync_exp_last
- #FAAFBE
+
+ out_data_valid
+ out_data_valid
+ #FFA500
true
-
- win_vsync_exp_last
- win_vsync_exp_last
- #FAAFBE
+
+ out_data[23:0]
+ out_data[23:0]
+ #FFA500
true
-
- win_header_last
- win_header_last
+
+ in_pxd[23:0]
+ in_pxd[23:0]
+
+
+ win_pxd[23:0]
+ win_pxd[23:0]
+
+
+ out_pxd[23:0]
+ out_pxd[23:0]
+
+
+ in_pxd_match[3:0]
+ in_pxd_match[3:0]
+
+
+ in_pxd_match_sr[2:0][3:0]
+ in_pxd_match_sr[2:0][3:0]
+
+
+ in_pxd_pattern_match
+ in_pxd_pattern_match
+
+
+ scan_x[11:0]
+ scan_x[11:0]
+ UNSIGNEDDECRADIX
+
+
+ scan_y[11:0]
+ scan_y[11:0]
+ UNSIGNEDDECRADIX
+
+
+ window_x[11:0]
+ window_x[11:0]
+ UNSIGNEDDECRADIX
+ #00FF7F
+ true
+
+
+ window_y[11:0]
+ window_y[11:0]
+ UNSIGNEDDECRADIX
+ #00FF7F
+ true
+
+
+ win_w_int[11:0]
+ win_w_int[11:0]
+ UNSIGNEDDECRADIX
+
+
+ win_h_int[11:0]
+ win_h_int[11:0]
+ UNSIGNEDDECRADIX
+
+
+ win_w[11:0]
+ win_w[11:0]
+ UNSIGNEDDECRADIX
+
+
+ win_h[11:0]
+ win_h[11:0]
+ UNSIGNEDDECRADIX
+
+
+ win_hsync_ctr[11:0]
+ win_hsync_ctr[11:0]
+ UNSIGNEDDECRADIX
+
+
+ win_vsync_ctr[11:0]
+ win_vsync_ctr[11:0]
+ UNSIGNEDDECRADIX
+
+
+ matcher_state[5:0]
+ matcher_state[5:0]
+
+
+ matched
+ matched
+
+
+ scan_x_reg[3:0][11:0]
+ scan_x_reg[3:0][11:0]
+
+
+ in_hsync_reg
+ in_hsync_reg
+
+
+ in_vsync_reg
+ in_vsync_reg
+
+
+ in_pxd_reg[23:0]
+ in_pxd_reg[23:0]
+
+
+ match_locked
+ match_locked
+
+
+ testcase_id[31:0]
+ testcase_id[31:0]
+ #FAAFBE
+ true
+ UNSIGNEDDECRADIX
+
+
+ expected_data[23:0]
+ expected_data[23:0]
#FAAFBE
true
@@ -286,4 +247,16 @@
#FAAFBE
true
+
+ read_pos[31:0]
+ read_pos[31:0]
+ #FAAFBE
+ true
+
+
+ win_header
+ win_header
+ #FAAFBE
+ true
+