Skip to content

Commit 968959f

Browse files
committed
rtl: update SYNC_BIT timing
1 parent 812177f commit 968959f

File tree

9 files changed

+175
-33
lines changed

9 files changed

+175
-33
lines changed

rtl/layer_code.sv

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module layer_code(
2626
logic rd_en;
2727
logic [ 5:0] rd_addr;
2828
logic [31:0] rd_data;
29+
logic [ 7:0] tim_sum;
2930

3031
logic bit_rdy, bit_data, bit_done;
3132

@@ -49,6 +50,7 @@ ws281x_ctrl ws281x_ctrl(
4950

5051
.wr_done_in(wr_done_in),
5152
.rd_data_in(rd_data),
53+
.tim_sum_in(tim_sum),
5254

5355
.bit_rdy_out(bit_rdy),
5456
.bit_data_out(bit_data),
@@ -57,7 +59,7 @@ ws281x_ctrl ws281x_ctrl(
5759
.rd_addr_out(rd_addr)
5860
);
5961

60-
ws281x_code ws281x_code(
62+
ws281x_conf ws281x_conf(
6163
.clk_in(clk_in),
6264
.rst_n_in(rst_n_in),
6365

@@ -69,6 +71,20 @@ ws281x_code ws281x_code(
6971
.t1h_cnt_in(t1h_cnt_in),
7072
.t1l_cnt_in(t1l_cnt_in),
7173

74+
.tim_sum_out(tim_sum)
75+
);
76+
77+
ws281x_code ws281x_code(
78+
.clk_in(clk_in),
79+
.rst_n_in(rst_n_in),
80+
81+
.bit_rdy_in(bit_rdy),
82+
.bit_data_in(bit_data),
83+
84+
.t0h_cnt_in(t0h_cnt_in),
85+
.t1h_cnt_in(t1h_cnt_in),
86+
.tim_sum_in(tim_sum),
87+
7288
.bit_done_out(bit_done),
7389
.bit_code_out(ws281x_code_out)
7490
);

rtl/ws281x_code.sv

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,19 @@ module ws281x_code(
1313
input logic bit_data_in,
1414

1515
input logic [7:0] t0h_cnt_in,
16-
input logic [7:0] t0l_cnt_in,
1716
input logic [7:0] t1h_cnt_in,
18-
input logic [7:0] t1l_cnt_in,
17+
input logic [7:0] tim_sum_in,
1918

2019
output logic bit_done_out,
2120
output logic bit_code_out
2221
);
2322

24-
logic [7:0] cnt_sum;
25-
2623
logic bit_bsy;
2724
logic [8:0] bit_cnt;
2825

2926
logic bit_done, bit_code;
3027

31-
wire [7:0] t0_sum = t0h_cnt_in + t0l_cnt_in;
32-
wire [7:0] t1_sum = t1h_cnt_in + t1l_cnt_in;
33-
34-
wire cnt_done = (bit_cnt[8:0] == {cnt_sum, 1'b0} - 2'b11);
28+
wire cnt_done = (bit_cnt[8:0] == {tim_sum_in, 1'b0} - 2'b11);
3529

3630
wire t0h_time = (bit_cnt[8:1] < t0h_cnt_in);
3731
wire t1h_time = (bit_cnt[8:1] < t1h_cnt_in);
@@ -42,16 +36,12 @@ assign bit_code_out = bit_code;
4236
always_ff @(posedge clk_in or negedge rst_n_in)
4337
begin
4438
if (!rst_n_in) begin
45-
cnt_sum <= 8'h00;
46-
4739
bit_bsy <= 1'b0;
4840
bit_cnt <= 9'h000;
4941

5042
bit_done <= 1'b0;
5143
bit_code <= 1'b0;
5244
end else begin
53-
cnt_sum <= bit_rdy_in ? (bit_data_in ? t1_sum : t0_sum) : cnt_sum;
54-
5545
bit_bsy <= bit_bsy ? ~cnt_done : bit_rdy_in;
5646
bit_cnt <= bit_bsy ? bit_cnt + 1'b1 : 9'h000;
5747

rtl/ws281x_conf.sv

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* ws281x_conf.sv
3+
*
4+
* Created on: 2020-07-10 14:29
5+
* Author: Jack Chen <redchenjs@live.com>
6+
*/
7+
8+
module ws281x_conf(
9+
input logic clk_in,
10+
input logic rst_n_in,
11+
12+
input logic bit_rdy_in,
13+
input logic bit_data_in,
14+
15+
input logic [7:0] t0h_cnt_in,
16+
input logic [7:0] t0l_cnt_in,
17+
input logic [7:0] t1h_cnt_in,
18+
input logic [7:0] t1l_cnt_in,
19+
20+
output logic [7:0] tim_sum_out
21+
);
22+
23+
logic [7:0] tim_sum;
24+
25+
wire [7:0] t0_sum = t0h_cnt_in + t0l_cnt_in;
26+
wire [7:0] t1_sum = t1h_cnt_in + t1l_cnt_in;
27+
28+
assign tim_sum_out = tim_sum;
29+
30+
always_ff @(posedge clk_in or negedge rst_n_in)
31+
begin
32+
if (!rst_n_in) begin
33+
tim_sum <= 8'h00;
34+
end else begin
35+
tim_sum <= bit_rdy_in ? (bit_data_in ? t1_sum : t0_sum) : tim_sum;
36+
end
37+
end
38+
39+
endmodule

rtl/ws281x_ctrl.sv

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module ws281x_ctrl(
1313

1414
input logic wr_done_in,
1515
input logic [31:0] rd_data_in,
16+
input logic [ 7:0] tim_sum_in,
1617

1718
output logic bit_rdy_out,
1819
output logic bit_data_out,
@@ -30,7 +31,7 @@ logic [1:0] ctl_sta;
3031

3132
logic bit_st;
3233
logic [4:0] bit_sel;
33-
logic [8:0] bit_syn;
34+
logic [8:0] bit_cnt;
3435

3536
logic bit_rdy, bit_data;
3637

@@ -42,7 +43,7 @@ wire ram_next = (bit_sel == 5'd23);
4243
wire ram_done = (rd_addr == 6'h00);
4344

4445
wire bit_next = bit_st | bit_done_in;
45-
wire syn_done = (bit_syn[8:1] == 8'hfe);
46+
wire cnt_done = (bit_cnt[8:0] == {tim_sum_in, 1'b0} - 3'b110);
4647

4748
assign bit_rdy_out = bit_rdy;
4849
assign bit_data_out = bit_data;
@@ -73,14 +74,14 @@ begin
7374
SEND_BIT:
7475
ctl_sta <= (bit_next & ram_next) ? (ram_done ? SYNC_BIT : READ_RAM) : ctl_sta;
7576
SYNC_BIT:
76-
ctl_sta <= syn_done ? IDLE : ctl_sta;
77+
ctl_sta <= cnt_done ? IDLE : ctl_sta;
7778
default:
7879
ctl_sta <= IDLE;
7980
endcase
8081

8182
bit_st <= (ctl_sta != SEND_BIT) & ((ctl_sta == IDLE) | bit_st);
8283
bit_sel <= (ctl_sta == SEND_BIT) ? bit_sel + bit_next : 5'h00;
83-
bit_syn <= (ctl_sta == SYNC_BIT) ? bit_syn + 1'b1 : 9'h000;
84+
bit_cnt <= (ctl_sta == SYNC_BIT) ? bit_cnt + 1'b1 : 9'h000;
8485

8586
bit_rdy <= (ctl_sta == SEND_BIT) & bit_next;
8687
bit_data <= (ctl_sta == SEND_BIT) & bit_next ? rd_data[5'd23 - bit_sel] : bit_data;

simulation/test_layer_code.sv

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,12 @@ always begin
8989
wr_en_in <= 1'b1;
9090
#5 wr_en_in <= 1'b0;
9191

92-
#10 wr_done_in <= 1'b1;
93-
#5 wr_done_in <= 1'b0;
92+
#10 wr_done_in <= 1'b1;
93+
#5 wr_done_in <= 1'b0;
9494

9595
for (integer i=0; i<65536; i++) begin
96-
#5 wr_done_in <= 1'b1;
97-
#5 wr_done_in <= 1'b0;
96+
#5 wr_done_in <= 1'b1;
97+
#5 wr_done_in <= 1'b0;
9898
end
9999

100100
#75 rst_n_in <= 1'b0;

simulation/test_ws281x_code.sv

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ logic bit_rdy_in;
1616
logic bit_data_in;
1717

1818
logic [7:0] t0h_cnt_in;
19-
logic [7:0] t0l_cnt_in;
2019
logic [7:0] t1h_cnt_in;
21-
logic [7:0] t1l_cnt_in;
20+
logic [7:0] tim_sum_in;
2221

2322
logic bit_done_out;
2423
logic bit_code_out;
@@ -31,9 +30,8 @@ ws281x_code test_ws281x_code(
3130
.bit_data_in(bit_data_in),
3231

3332
.t0h_cnt_in(t0h_cnt_in),
34-
.t0l_cnt_in(t0l_cnt_in),
3533
.t1h_cnt_in(t1h_cnt_in),
36-
.t1l_cnt_in(t1l_cnt_in),
34+
.tim_sum_in(tim_sum_in),
3735

3836
.bit_done_out(bit_done_out),
3937
.bit_code_out(bit_code_out)
@@ -48,9 +46,8 @@ initial begin
4846

4947
// Unit: 10 ns (2 clk)
5048
t0h_cnt_in <= 8'h01;
51-
t0l_cnt_in <= 8'h02;
5249
t1h_cnt_in <= 8'h02;
53-
t1l_cnt_in <= 8'h01;
50+
tim_sum_in <= 8'h03;
5451

5552
#2 rst_n_in <= 1'b1;
5653
end
@@ -64,9 +61,11 @@ always begin
6461
bit_data_in <= 1'b0;
6562
#5 bit_rdy_in <= 1'b0;
6663

67-
#50 bit_rdy_in <= 1'b1;
68-
bit_data_in <= 1'b1;
69-
#5 bit_rdy_in <= 1'b0;
64+
for (integer i=0; i<10; i++) begin
65+
#25 bit_rdy_in <= 1'b1;
66+
bit_data_in <= i % 2;
67+
#5 bit_rdy_in <= 1'b0;
68+
end
7069

7170
#75 rst_n_in <= 1'b0;
7271
#25 $stop;

simulation/test_ws281x_conf.sv

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* test_ws281x_conf.sv
3+
*
4+
* Created on: 2020-07-10 14:31
5+
* Author: Jack Chen <redchenjs@live.com>
6+
*/
7+
8+
`timescale 1ns / 1ps
9+
10+
module test_ws281x_conf;
11+
12+
logic clk_in;
13+
logic rst_n_in;
14+
15+
logic bit_rdy_in;
16+
logic bit_data_in;
17+
18+
logic [7:0] t0h_cnt_in;
19+
logic [7:0] t0l_cnt_in;
20+
logic [7:0] t1h_cnt_in;
21+
logic [7:0] t1l_cnt_in;
22+
23+
logic [7:0] tim_sum_out;
24+
25+
ws281x_conf test_ws281x_conf(
26+
.clk_in(clk_in),
27+
.rst_n_in(rst_n_in),
28+
29+
.bit_rdy_in(bit_rdy_in),
30+
.bit_data_in(bit_data_in),
31+
32+
.t0h_cnt_in(t0h_cnt_in),
33+
.t0l_cnt_in(t0l_cnt_in),
34+
.t1h_cnt_in(t1h_cnt_in),
35+
.t1l_cnt_in(t1l_cnt_in),
36+
37+
.tim_sum_out(tim_sum_out)
38+
);
39+
40+
initial begin
41+
clk_in <= 1'b1;
42+
rst_n_in <= 1'b0;
43+
44+
bit_rdy_in <= 1'b0;
45+
bit_data_in <= 1'b0;
46+
47+
// Unit: 10 ns (2 clk)
48+
t0h_cnt_in <= 8'h01;
49+
t0l_cnt_in <= 8'h7f;
50+
t1h_cnt_in <= 8'hfe;
51+
t1l_cnt_in <= 8'h01;
52+
53+
#2 rst_n_in <= 1'b1;
54+
end
55+
56+
always begin
57+
#2.5 clk_in <= ~clk_in;
58+
end
59+
60+
always begin
61+
#11 bit_rdy_in <= 1'b1;
62+
#5 bit_rdy_in <= 1'b0;
63+
64+
#10 bit_data_in <= 1'b1;
65+
66+
#10 bit_rdy_in <= 1'b1;
67+
#5 bit_rdy_in <= 1'b0;
68+
69+
#75 rst_n_in <= 1'b0;
70+
#25 $stop;
71+
end
72+
73+
endmodule

simulation/test_ws281x_ctrl.sv

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ logic bit_done_in;
1616

1717
logic wr_done_in;
1818
logic [31:0] rd_data_in;
19+
logic [ 7:0] tim_sum_in;
1920

2021
logic bit_rdy_out;
2122
logic bit_data_out;
@@ -31,6 +32,7 @@ ws281x_ctrl test_ws281x_ctrl(
3132

3233
.wr_done_in(wr_done_in),
3334
.rd_data_in(rd_data_in),
35+
.tim_sum_in(tim_sum_in),
3436

3537
.bit_rdy_out(bit_rdy_out),
3638
.bit_data_out(bit_data_out),
@@ -46,7 +48,8 @@ initial begin
4648
bit_done_in <= 1'b0;
4749

4850
wr_done_in <= 1'b0;
49-
rd_data_in <= 32'haaaa_aaaa;
51+
rd_data_in <= 32'haaaa_cccc;
52+
tim_sum_in <= 8'h04;
5053

5154
#2 rst_n_in <= 1'b1;
5255
end
@@ -59,7 +62,14 @@ always begin
5962
#11 wr_done_in <= 1'b1;
6063
#5 wr_done_in <= 1'b0;
6164

62-
for (integer i=0; i<1536; i++) begin
65+
for (integer i=0; i<119; i++) begin
66+
#50 bit_done_in <= 1'b1;
67+
#5 bit_done_in <= 1'b0;
68+
end
69+
70+
#500 rd_data_in <= 32'h00aa_dddd;
71+
72+
for (integer i=0; i<119; i++) begin
6373
#50 bit_done_in <= 1'b1;
6474
#5 bit_done_in <= 1'b0;
6575
end

ws281x_cube_controller.qsf

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#
2020
# Quartus Prime
2121
# Version 20.1.0 Build 711 06/05/2020 SJ Lite Edition
22-
# Date created = 10:37:22 July 09, 2020
22+
# Date created = 16:06:46 July 10, 2020
2323
#
2424
# -------------------------------------------------------------------------- #
2525
#
@@ -54,6 +54,7 @@ set_global_assignment -name SYSTEMVERILOG_FILE rtl/layer_ctrl.sv
5454
set_global_assignment -name SYSTEMVERILOG_FILE rtl/layer_conf.sv
5555
set_global_assignment -name SYSTEMVERILOG_FILE rtl/layer_code.sv
5656
set_global_assignment -name SYSTEMVERILOG_FILE rtl/ws281x_ctrl.sv
57+
set_global_assignment -name SYSTEMVERILOG_FILE rtl/ws281x_conf.sv
5758
set_global_assignment -name SYSTEMVERILOG_FILE rtl/ws281x_code.sv
5859
set_global_assignment -name SYSTEMVERILOG_FILE rtl/segment_led.sv
5960
set_global_assignment -name SYSTEMVERILOG_FILE rtl/pulse_counter.sv
@@ -233,6 +234,18 @@ set_global_assignment -name POWER_USE_DEVICE_CHARACTERISTICS MAXIMUM
233234
# end EDA_TEST_BENCH_SETTINGS(test_ws281x_ctrl)
234235
# ---------------------------------------------
235236

237+
# start EDA_TEST_BENCH_SETTINGS(test_ws281x_conf)
238+
# -----------------------------------------------
239+
240+
# EDA Netlist Writer Assignments
241+
# ==============================
242+
set_global_assignment -name EDA_DESIGN_INSTANCE_NAME NA -section_id test_ws281x_conf
243+
set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME test_ws281x_conf -section_id test_ws281x_conf
244+
set_global_assignment -name EDA_TEST_BENCH_FILE simulation/test_ws281x_conf.sv -section_id test_ws281x_conf
245+
246+
# end EDA_TEST_BENCH_SETTINGS(test_ws281x_conf)
247+
# ---------------------------------------------
248+
236249
# start EDA_TEST_BENCH_SETTINGS(test_ws281x_code)
237250
# -----------------------------------------------
238251

@@ -261,6 +274,7 @@ set_global_assignment -name POWER_USE_DEVICE_CHARACTERISTICS MAXIMUM
261274
set_global_assignment -name EDA_TEST_BENCH_NAME test_layer_conf -section_id eda_simulation
262275
set_global_assignment -name EDA_TEST_BENCH_NAME test_layer_code -section_id eda_simulation
263276
set_global_assignment -name EDA_TEST_BENCH_NAME test_ws281x_ctrl -section_id eda_simulation
277+
set_global_assignment -name EDA_TEST_BENCH_NAME test_ws281x_conf -section_id eda_simulation
264278
set_global_assignment -name EDA_TEST_BENCH_NAME test_ws281x_code -section_id eda_simulation
265279

266280
# end EDA_TOOL_SETTINGS(eda_simulation)

0 commit comments

Comments
 (0)