Skip to content

Commit 5673be7

Browse files
committed
Alpha channel, top.v rewrite, new panel
1 parent 60fb672 commit 5673be7

File tree

7 files changed

+253
-80
lines changed

7 files changed

+253
-80
lines changed

alpha_blend.v

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,27 @@
22

33
module alpha_blend (
44
input clk,
5-
input [23:0] colorTop, colorBot,
6-
input [7:0] alphaTop,
7-
input valid,
8-
output ready,
9-
output [23:0] colorOut);
5+
input [23:0] colorTop, colorBot,
6+
input [7:0] alphaTop,
7+
input valid,
8+
input ack,
9+
output reg validOut,
10+
output ready,
11+
output reg [23:0] colorOut
12+
);
1013

11-
localparam STATE_WAIT = 2'b0;
12-
localparam STATE_MULT = 2'b1;
13-
localparam STATE_ADD = 2'b2;
14-
reg [1:0] state, nextState;
14+
localparam STATE_WAIT = 2'b00;
15+
localparam STATE_MULT = 2'b01;
16+
localparam STATE_ADD = 2'b10;
17+
reg [1:0] state=STATE_WAIT, nextState;
1518

16-
assign ready = (nextState == STATE_WAIT);
19+
20+
wire [15:0] redSum, greenSum, blueSum;
21+
22+
assign ready = (state == STATE_WAIT);
23+
assign redSum = (redTop + redBot + 15'h00FF);
24+
assign greenSum = (greenTop + greenBot + 15'h00FF);
25+
assign blueSum = (blueTop + blueBot + 15'h00FF);
1726

1827
always @(*) begin
1928
case (state)
@@ -22,7 +31,7 @@ module alpha_blend (
2231
end
2332
STATE_MULT: nextState = STATE_ADD;
2433
STATE_ADD: nextState = STATE_WAIT;
25-
default: nextState = state_WAIT;
34+
default: nextState = STATE_WAIT;
2635
endcase
2736
end
2837

@@ -34,7 +43,8 @@ module alpha_blend (
3443

3544
always @(posedge clk) begin
3645
state <= nextState;
37-
ready <= 0;
46+
if (ack)
47+
validOut <= 0;
3848
case (state)
3949
STATE_WAIT: begin
4050
case (nextState)
@@ -54,15 +64,15 @@ module alpha_blend (
5464
redTop <= redTop * alpha;
5565
greenTop <= greenTop * alpha;
5666
blueTop <= blueTop * alpha;
57-
redBot <= redBot * (255 - alpha);
58-
greenBot <= greenBot * (255 - alpha);
59-
blueBot <= blueBot * (255 - alpha);
67+
redBot <= redBot * (16'hFF - {8'h00, alpha});
68+
greenBot <= greenBot * (16'hFF - {8'h00, alpha});
69+
blueBot <= blueBot * (16'hFF - {8'h00, alpha});
6070
end
6171
STATE_ADD: begin
62-
colorOut[23:16] <= (redTop + redBot + 15'h00FF)[15:8];
63-
colorOut[15:8] <= (greenTop + greenBot + 15'h00FF)[15:8];
64-
colorOut[7:0] <= (blueTop + blueBot + 15'h00FF)[15:8];
65-
ready <= 1;
72+
colorOut[23:16] <= redSum[15:8];
73+
colorOut[15:8] <= greenSum[15:8];
74+
colorOut[7:0] <= blueSum[15:8];
75+
validOut <= 1;
6676
end
6777
default: begin end
6878
endcase

coord.v

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module coord (
2+
input [9:0] index,
3+
output [9:0] x,
4+
output [9:0] y);
5+
6+
assign x = {3'h0, index[9:3]};
7+
assign y = {7'h00, (index[3] ? ~index[2:0] : index[2:0])};
8+
endmodule // coord

panel_bg.v

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,39 @@
11
`default_nettype none
22

33
module panel_bg (
4-
input clk,
5-
input valid,
6-
input [9:0] index,
7-
output ready,
8-
output [7:0] red, blue, green,
9-
output [7:0] alpha,
10-
output [1:0] blend
4+
input clk,
5+
input valid,
6+
input tick,
7+
input [9:0] x, y,
8+
input ack,
9+
output reg validOut,
10+
output ready,
11+
output reg [7:0] red, green, blue,
12+
output reg [7:0] alpha
1113
);
12-
13-
wire [9:0] true_index;
14-
assign true_index = {index[9:3], (index[3] ? ~index[2:0] : index[2:0])};
15-
16-
assign red = {5'h00, true_index[2:0]};
17-
assign blue = {5'h00, true_index[5:3]};
18-
assign green = {5'h00, true_index[8:6]};
19-
assign alpha = 8'hFF;
20-
assign blend = 2'h0;
21-
assign ready = valid;
14+
15+
reg [10:0] offset = 0;
16+
wire [9:0] x_pos, y_pos;
17+
18+
assign x_pos = x;
19+
assign y_pos = y + {6'h00, offset[4:1]};
20+
21+
assign ready = 1;
22+
23+
always @(posedge clk) begin
24+
if (ack)
25+
validOut <= 0;
26+
if (valid) begin
27+
if (tick) begin
28+
offset <= offset + 1;
29+
end else begin
30+
red <= {5'h00, x_pos[2:0]};
31+
green <= {2'h0, x_pos[7:3], 1'b0};
32+
blue <= 8'h00;
33+
alpha <= 8'hFF;
34+
validOut <= 1;
35+
end
36+
end
37+
end
2238

2339
endmodule // panel_bg

panel_cube.v

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
`default_nettype none
2+
3+
module panel_cube (
4+
input clk,
5+
input valid,
6+
input tick,
7+
input [9:0] x, y,
8+
input ack,
9+
output reg validOut,
10+
output ready,
11+
output reg [7:0] red, blue, green,
12+
output reg [7:0] alpha
13+
);
14+
15+
reg [9:0] offset = 0;
16+
wire [9:0] x_pos, y_pos;
17+
18+
assign x_pos = x + offset;
19+
assign y_pos = y;
20+
21+
wire [2:0] x_pos_off;
22+
assign x_pos_off = x_pos[2:0] - 3'd2;
23+
24+
assign ready = 1;
25+
26+
always @(posedge clk) begin
27+
if (ack)
28+
validOut <= 0;
29+
if (valid) begin
30+
if (tick) begin
31+
offset <= offset + 1;
32+
end else begin
33+
validOut <= 1;
34+
if (x_pos[2:0] > 1 && x_pos[2:0] < 6
35+
&& y_pos[2:0] > 1 && y_pos[2:0] < 6) begin
36+
red <= 0;
37+
green <= 0;
38+
blue <= 8'h3F;
39+
alpha <= {x_pos_off[1:0], 6'h3F};
40+
end else begin
41+
red <= 0;
42+
green <= 0;
43+
blue <= 0;
44+
alpha <= 0;
45+
end
46+
end
47+
end
48+
end
49+
50+
endmodule // panel_cube

pixel_driver.v

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ module pixel_driver
1414
parameter CNT_COLOR=24,
1515
parameter RESET_VERIFY=800) (
1616
input clk,
17-
input [7:0] red, blue, green,
17+
input [7:0] red, green, blue,
1818
input reset,
1919
input valid,
2020
output ready,
@@ -25,7 +25,7 @@ module pixel_driver
2525
localparam TIMING_FAILURE = (RESET_VERIFY <= TCK_RESET);
2626

2727
localparam CNT_BITS = $clog2(CNT_COLOR);
28-
localparam TCK_BITS = $clog2(TCK_RESET);
28+
localparam TCK_BITS = 32;
2929

3030
// pixel buffer storage
3131
reg [22:0] stored;
@@ -37,16 +37,11 @@ module pixel_driver
3737

3838
// State machine init
3939
localparam STATE_WAIT=0, STATE_RESET=1, STATE_COLOR=2;
40-
reg [1:0] state=STATE_WAIT;
41-
reg [1:0] nextState;
40+
reg [1:0] state=STATE_WAIT, nextState;
4241

43-
// output signals determined by zero states
4442
assign ready = (state == STATE_WAIT);
4543
assign clk_out = ~(tick_on == 0);
4644

47-
wire next_ready;
48-
assign next_ready = (count == 0 && tick == 1);
49-
5045
// STATE_WAIT: No command received.
5146
// STATE_COLOR: Consume stored buffer and translate to PWM output.
5247
// STATE_RESET: Hold clock low for a while to indicate new output chain.
@@ -62,7 +57,7 @@ module pixel_driver
6257
nextState = STATE_WAIT;
6358
end
6459
STATE_RESET,STATE_COLOR: begin
65-
if (next_ready)
60+
if (count == 0 && tick == 1)
6661
nextState = STATE_WAIT;
6762
else
6863
nextState = state;

0 commit comments

Comments
 (0)