设计程序
`timescale 1ns / 1ps
……………………………………………………………………………
module exm(
input sysclk,
input wire [15:0] carrier_int,
input wire [23:0] modulate_int,
input wire [3:0] depth,
output wire [7:0] modulate_signal,
output wire [7:0] carrier_signal,
output wire [17:0] modulated_signal,
output wire [7:0] demodulated_final
);
……………………………………………………………………………
……………………………………………………………………………
reg signed[8:0] depth_int;
reg [7:0] A = 127;
wire signed[16:0] modulate_depth;
wire signed[8:0] modulate_depth_out;
reg [9:0] modulate_A;
wire [23:0] modulated_final;
reg [23:0] modulated_signal_abs;
wire [39:0] demodulated_signal;
……………………………………………………………………………
dds_compiler_0 generate_modulate_signal (
.aclk(sysclk),
.s_axis_config_tvalid(1),
.s_axis_config_tdata(modulate_int),
.m_axis_data_tvalid(),
.m_axis_data_tdata(modulate_signal)
);
dds_compiler_1 generate_carrier_signal (
.aclk(sysclk),
.s_axis_config_tvalid(1),
.s_axis_config_tdata(carrier_int),
.m_axis_data_tvalid(),
.m_axis_data_tdata(carrier_signal)
);
……………………………………………………………………………
always@(posedge sysclk)
begin
case (depth)
0: depth_int <= 0 ;
1: depth_int <= 26;
2: depth_int <= 51;
3: depth_int <= 77;
4: depth_int <= 102;
5: depth_int <= 128;
6: depth_int <= 154;
7: depth_int <= 179;
8: depth_int <= 205;
9: depth_int <= 230;
10: depth_int <= 255;
endcase
end
……………………………………………………………………………
mult_gen_0 out_depth (
.CLK(sysclk),
.A(modulate_signal),
.B(depth_int),
.P(modulate_depth)
);
assign modulate_depth_out = modulate_depth>>8;
always@(posedge sysclk)
begin
modulate_A <= modulate_depth_out + 127;
end
mult_gen_1 out_mdl (
.CLK(sysclk),
.A(modulate_A),
.B(carrier_signal),
.P(modulated_signal)
);
assign modulated_final={
{
6{
modulated_signal[17]}},modulated_signal};
……………………………………………………………………………
always @(posedge sysclk ) begin
if(modulated_final[23] == 1) begin
modulated_signal_abs <= -{
modulated_final};
end
else begin
modulated_signal_abs <= modulated_final;
end
end
……………………………………………………………………………
fir_compiler_0 Lfilter (
.aclk(sysclk),
.s_axis_data_tvalid(1),
.s_axis_data_tready(s_axis_data_tready),
.s_axis_data_tdata(modulated_signal_abs),
.m_axis_data_tvalid(),
.m_axis_data_tdata(demodulated_signal)
);
assign demodulated_final[7:0] = demodulated_signal[34:27];
仿真程序
`timescale 1ns / 1ps
……………………………………………………………………………
module exm_tb(
);
reg sysclk;
wire [15:0] carrier_int=5243;
wire [23:0] modulate_int=1342;
wire [3:0] depth= 9;
wire [7:0] modulate_signal;
wire [7:0] carrier_signal;
wire [17:0] modulated_signal;
wire [7:0] demodulated_final;
reg [17:0] modulated_out;
reg [7:0] demodulated_out;
……………………………………………………………………………
initial
begin
sysclk <= 0;
end
always
#5 sysclk = ~sysclk;
……………………………………………………………………………
exm instance_AM(
.sysclk(sysclk),
.carrier_int(carrier_int),
.modulate_int(modulate_int),
.depth(depth),
.modulate_signal(modulate_signal),
.carrier_signal(carrier_signal),
.modulated_signal(modulated_signal),
.demodulated_final(demodulated_final)
);
……………………………………………………………………………
always@(posedge sysclk)
begin
modulated_out <= modulated_signal;
demodulated_out <= demodulated_final;
end
integer modulated_file, demodulated_file;
initial modulated_file = $fopen("G:/FPGA/modulated_out.txt", "w");
initial demodulated_file = $fopen("G:/FPGA/demodulated_out.txt", "w");
always@(posedge sysclk)
begin
$fwrite(modulated_file, "%d\n", $signed(modulated_out));
$fwrite(demodulated_file, "%d\n", demodulated_out);
end
endmodule