Files
zx-multisound/cpld/tb/testbench_top.v
Eugene Lozovoy d1af9dadbf add testbench
2022-11-18 20:01:26 +03:00

105 lines
2.1 KiB
Verilog

`timescale 1ns/1ps
module testbench_top();
reg rst_n;
reg clk32;
/* TOP ENTRY */
// zx_multisound zx_multisound0(
// .rst_n(rst_n),
// .clk32(clk32),
// .cfg(5'b11111),
// .a(16'hFFFF),
// // .d(8'hFF),
// .n_rd(1'b1),
// .n_wr(1'b1),
// .n_iorq(1'b1),
// .n_mreq(1'b1),
// .n_m1(1'b1),
// .ga(16'hFFFF),
// // .gd(8'hFF),
// .n_grd(1'b1),
// .n_gwr(1'b1),
// .n_gm1(1'b1),
// .n_gmreq(1'b1),
// .n_giorq(1'b1)
// );
/* CLOCKS & RESET */
initial begin
rst_n = 0;
#50 rst_n = 1;
end
always begin
clk32 = 0;
#15.625 clk32 = 1;
#15.625;
end
wire [15:0] sine_vol;
sine_dds sine_dds_vol(clk32, ~rst_n, 256, sine_vol);
wire [15:0] sine_dac;
sine_dds sine_dds_dac(clk32, ~rst_n, 1024, sine_dac);
// wire [5:0] volx = 6'h00;
// wire [5:0] volx = 6'h1F;
wire [5:0] volx = 6'h3F;
// wire [5:0] volx = sine_vol[15:10];
// reg [5:0] volx = 6'h3F;
// initial begin
// #2_000_000 volx = 0;
// #2_000_000 volx = 6'h1F;
// #2_000_000 volx = 0;
// #2_000_000 volx = 6'h3F;
// end
// wire [7:0] dacx = 8'h00;
// wire [7:0] dacx = 8'h80;
// wire [7:0] dacx = 8'hFF;
wire [7:0] dacx = sine_vol[15:8];
wire [7:0] dacx0 = dacx[7]? {~dacx[7],dacx[6:0]} : {dacx[7],~dacx[6:0]};
reg [5:0] volx_cnt;
reg [7:0] dacx_cnt;
wire volx_en = (volx_cnt < volx) || (&volx);
wire dacx_cnt7 = dacx_cnt[7];
wire dacx7 = dacx[7];
wire dacx_out = dacx_cnt[7]? dacx[7] : clk32;
always @(negedge clk32 or negedge rst_n) begin
if (!rst_n) begin
volx_cnt <= 0;
dacx_cnt <= 0;
end
else begin
volx_cnt <= volx_cnt + 6'd31;
if (volx_en)
dacx_cnt <= dacx_cnt[6:0] + dacx0[6:0];
else
dacx_cnt[7] <= 0;
end
end
/* TESTBENCH CONTROL */
integer fhandle;
initial begin
fhandle = $fopen("testbench_pwl.txt","w");
$timeformat(0, 10, "", 0);
$dumpfile("testbench.vcd");
$dumpvars;
#10_000_000;
$fclose(fhandle);
$finish;
end
`define SCALE 3.3
always @(negedge clk32 or posedge clk32) begin
$fwrite(fhandle, "%t %f\n", $time, dacx_out*`SCALE);
end
endmodule