From 7a1c838de38479a30069d31d1211bbd747764505 Mon Sep 17 00:00:00 2001 From: otroubi Date: Wed, 8 Apr 2026 15:13:57 +0300 Subject: [PATCH] rtl: generator added --- rtl/generator/src/generator.sv | 99 +++++++++++++++++++++++ rtl/generator/tests/generator_tb.sv | 105 +++++++++++++++++++++++++ rtl/generator/tests/generator_tests.sv | 0 3 files changed, 204 insertions(+) create mode 100644 rtl/generator/tests/generator_tb.sv delete mode 100644 rtl/generator/tests/generator_tests.sv diff --git a/rtl/generator/src/generator.sv b/rtl/generator/src/generator.sv index e69de29..cbb7109 100644 --- a/rtl/generator/src/generator.sv +++ b/rtl/generator/src/generator.sv @@ -0,0 +1,99 @@ +`timescale 1ns / 1ps + + +module generator +#( + parameter DATA_WIDTH = 14 + ) +( + input clk_in, + input rst, + input start, + input [31:0] pulse_width, + input [31:0] pulse_period, + input [DATA_WIDTH-1:0] pulse_height, + input [15:0] pulse_num, + + output pulse, + output[DATA_WIDTH-1:0] pulse_height_out + + ); + + logic [DATA_WIDTH-1:0] pulse_height_reg, pulse_height_out_reg; + logic pulse_reg; + + logic [31:0] pulse_width_reg, pulse_period_reg; + logic [15:0] pulse_num_reg; + + logic enable; + logic [15:0] cnt_pulse_num; + logic [31:0] cnt_period; + + logic start_d; + + always @(posedge clk_in) begin + start_d <= start; + end + + wire start_pulse = start & ~start_d; + + + always @(posedge clk_in) begin + if (rst) begin + pulse_reg <= '0; + pulse_height_reg <= 0; + pulse_height_out_reg <= '0; + + pulse_width_reg <= '0; + pulse_period_reg <= '0; + pulse_num_reg <= '0; + enable <= 0; + cnt_pulse_num <= '0; + cnt_period <= '0; + end else begin + if (start) begin + enable <= 1'b1; +// pulse_width_reg <= pulse_width; +// pulse_period_reg <= pulse_period; +// pulse_num_reg <= pulse_num; +// pulse_height_reg <= pulse_height; + + cnt_pulse_num <= '0; + cnt_period <= '0; + end + if (enable) begin + pulse_reg <= 1; + + pulse_width_reg <= pulse_width; + pulse_period_reg <= pulse_period; + pulse_num_reg <= pulse_num; + pulse_height_reg <= pulse_height; + + if (pulse_reg) begin + + if (cnt_period < pulse_width_reg) begin + pulse_height_out_reg <= pulse_height_reg; + end else begin + pulse_height_out_reg <= '0; + end + if (cnt_period == pulse_period_reg - 1) begin + cnt_period <= 0; + if (cnt_pulse_num == pulse_num_reg - 1) begin + enable <= 0; + pulse_reg <= 0; + end else begin + cnt_pulse_num <= cnt_pulse_num + 1; + end + end else begin + cnt_period <= cnt_period + 1; + end + + end + end + end + end + + assign pulse_height_out = pulse_height_out_reg; + assign pulse = pulse_reg; + +endmodule diff --git a/rtl/generator/tests/generator_tb.sv b/rtl/generator/tests/generator_tb.sv new file mode 100644 index 0000000..4d4cef9 --- /dev/null +++ b/rtl/generator/tests/generator_tb.sv @@ -0,0 +1,105 @@ +`timescale 1ns / 1ps + +module generator_tb; + + parameter DATA_WIDTH = 14; + parameter CLK_PERIOD = 16; + + logic clk; + logic rst; + logic start; + + logic [31:0] pulse_width; + logic [31:0] pulse_period; + logic [DATA_WIDTH-1:0] pulse_height; + logic [15:0] pulse_num; + + logic pulse; + logic [DATA_WIDTH-1:0] pulse_height_out; + + // DUT + generator #( + .DATA_WIDTH(DATA_WIDTH) + ) dut ( + .clk_in(clk), + .rst(rst), + .start(start), + .pulse_width(pulse_width), + .pulse_period(pulse_period), + .pulse_height(pulse_height), + .pulse_num(pulse_num), + .pulse(pulse), + .pulse_height_out(pulse_height_out) + ); + + // Clock + initial begin + clk = 0; + forever #(CLK_PERIOD/2) clk = ~clk; + end + + initial begin + $display("\n=== GENERATOR TEST ===\n"); + + rst = 1; + start = 0; + + pulse_width = 0; + pulse_period = 0; + pulse_height = 0; + pulse_num = 0; + + repeat(5) @(posedge clk); + rst = 0; + + // --- Test 1 --- + // 3 clk 1, 5 clk 0, 4 pulses + repeat(2) @(posedge clk); + pulse_width = 3; + pulse_period = 8; + pulse_num = 4; + pulse_height = 14'h3FF; + start = 1; + + repeat(1) @(posedge clk); + start = 0; + + repeat(50) @(posedge clk); + + // --- Test 2 --- + $display("\n--- SECOND RUN ---\n"); + + @(posedge clk); + pulse_width = 2; + pulse_period = 5; + pulse_num = 3; + pulse_height = 14'h155; + start = 1; + + @(posedge clk); + start = 0; + + repeat(40) @(posedge clk); + + pulse_width = 3; + pulse_period = 8; + pulse_num = 4; + pulse_height = 14'h3FF; + start = 1; + + repeat(1) @(posedge clk); + start = 0; + + repeat(50) @(posedge clk); + + $display("\n=== TEST FINISHED ==="); + $finish; + end + + // Display + always @(posedge clk) begin + $display("t=%0t | pulse=%0b | height=%h", + $time, pulse, pulse_height_out); + end + +endmodule \ No newline at end of file diff --git a/rtl/generator/tests/generator_tests.sv b/rtl/generator/tests/generator_tests.sv deleted file mode 100644 index e69de29..0000000 -- 2.49.0