Files
2024-10-28 13:14:49 +08:00

222 lines
5.5 KiB
Verilog

`timescale 1 ns / 1 ps
module sine_gen#
(
parameter CLK_PERIOD = 20
)
(
input clk ,
input rst_n ,
input phase_enable ,
input [32*16-1:0] phase_inc_array ,
input [32*16-1:0] phase_off_array ,
// input [ 8*16-1:0] magnitude_array ,
input dds_aclken ,
input dds_aresetn ,
input update ,
output [ 9*16-1:0] sine_wave_array
);
//*****************************************************************************
// localparam definition
//*****************************************************************************
localparam IDLE = 8'd0 ;
localparam TRANS_ST = 8'd1 ;
//*****************************************************************************
// Internal register and wire declarations
//*****************************************************************************
reg [ 4-1:0] cstate ;
reg [ 4-1:0] nstate ;
wire [32-1:0] phase_inc[0:16-1] ;
wire [32-1:0] phase_off[0:16-1] ;
reg [ 4-1:0] cnt ;
reg [ 4-1:0] ch ;
reg s_axis_config_tvalid ;
wire [64-1:0] s_axis_config_tdata ;
reg s_axis_config_tlast ;
reg aclken ;
reg [ 2-1:0] aresetn_v ;
wire aresetn ;
wire m_axis_data_tvalid ;
wire [16-1:0] m_axis_data_tdata ;
wire m_axis_phase_tvalid ;
wire [32-1:0] m_axis_phase_tdata ;
wire event_s_config_tlast_missing ;
wire event_s_config_tlast_unexpected ;
reg [ 9-1:0] sine_data[0:16-1];
wire [ 9-1:0] sine_data_abs[0:16-1] ;
reg [ 9-1:0] data[0:16-1] ;
//*****************************************************************************
// Instantiation
//*****************************************************************************
dds_stim_16ch u_dds_stim_16ch
(
.aclk ( clk ),
.aclken ( aclken ),
.aresetn ( aresetn ), //Must be asserted for a minimum of 2 cycles
.s_axis_config_tvalid ( s_axis_config_tvalid ),
.s_axis_config_tdata ( s_axis_config_tdata ),
.s_axis_config_tlast ( s_axis_config_tlast ),
.m_axis_data_tvalid ( m_axis_data_tvalid ),
.m_axis_data_tdata ( m_axis_data_tdata ),
.m_axis_phase_tvalid ( m_axis_phase_tvalid ),
.m_axis_phase_tdata ( m_axis_phase_tdata ),
.event_s_config_tlast_missing ( event_s_config_tlast_missing ),
.event_s_config_tlast_unexpected ( event_s_config_tlast_unexpected )
);
//*****************************************************************************
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n ) begin
aclken <= 1'b0;
aresetn_v <= 2'b11;
end else begin
aclken <= dds_aclken;
aresetn_v <= {aresetn_v[0], dds_aresetn};
end
end
always@( posedge clk or negedge rst_n ) begin
if( !rst_n ) cstate <= IDLE;
else cstate <= nstate;
end
always@( * ) begin
case ( cstate )
IDLE:
if ( phase_enable )
nstate <= TRANS_ST;
else
nstate <= IDLE;
TRANS_ST:
if ( cnt == 4'hF )
nstate <= IDLE;
else
nstate <= TRANS_ST;
default:
nstate <= IDLE;
endcase
end
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n )
cnt <= 0;
else if ( s_axis_config_tvalid )
cnt <= cnt + 1'b1;
else
cnt <= 0;
end
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n )
s_axis_config_tvalid <= 1'b0;
else if ( (cstate == TRANS_ST) && nstate == TRANS_ST )
s_axis_config_tvalid <= 1'b1;
else
s_axis_config_tvalid <= 1'b0;
end
assign s_axis_config_tdata = {phase_off[cnt],phase_inc[cnt]};
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n )
s_axis_config_tlast <= 1'b0;
else if ( cnt == 4'hE )
s_axis_config_tlast <= 1'b1;
else
s_axis_config_tlast <= 1'b0;
end
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n )
ch <= 0;
else if ( m_axis_data_tvalid )
ch <= ch + 1'b1;
else
ch <= 0;
end
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n ) begin
sine_data[ 0] <= 0;
sine_data[ 1] <= 0;
sine_data[ 2] <= 0;
sine_data[ 3] <= 0;
sine_data[ 4] <= 0;
sine_data[ 5] <= 0;
sine_data[ 6] <= 0;
sine_data[ 7] <= 0;
sine_data[ 8] <= 0;
sine_data[ 9] <= 0;
sine_data[10] <= 0;
sine_data[11] <= 0;
sine_data[12] <= 0;
sine_data[13] <= 0;
sine_data[14] <= 0;
sine_data[15] <= 0;
end else if ( m_axis_data_tvalid )
sine_data[ch] <= m_axis_data_tdata[8:0];
end
integer j;
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n )
for(j=0;j<16;j=j+1)begin
data[j] <= 0;
end
else if ( !aresetn )
for(j=0;j<16;j=j+1)begin
data[j] <= 0;
end
else if ( update )
for(j=0;j<16;j=j+1)begin
data[j] <= sine_data[j][8]? {1'b1,sine_data_abs[j][7:0]}:sine_data[j];
end
end
//*****************************************************************************
// Wire assignment
//*****************************************************************************
assign aresetn = (aresetn_v==2'b11)? 1'b1:1'b0;
genvar i;
generate
for(i=0;i<16;i=i+1) begin : unpack
assign phase_inc[i] = phase_inc_array[32*i+31 : 32*i];
assign phase_off[i] = phase_off_array[32*i+31 : 32*i];
end
endgenerate
generate
for(i=0;i<16;i=i+1) begin : abs
assign sine_data_abs[i] = ~(sine_data[i][8:0]-1'b1);
end
endgenerate
generate
for(i=0;i<16;i=i+1) begin : pack
assign sine_wave_array[9*i+8 : 9*i] = data[i];
end
endgenerate
endmodule