modelsim对FSK调制进行仿真,输入分频信号无数据,输出信号波形错误

问题遇到的现象和发生背景

代码编译显示没有错误,但在modelsim仿真后,输出波形错误,将输入信号din添加至wave显示无data数据。

问题相关代码,请勿粘贴截图

顶层模块

module FSK_top(
input            clk,
input            rst,
output            dout
);

wire            din;

FSK_din u_FSK_din(
    .clk        (clk),
    .rst        (rst),
    .din        (din)
);

FSK_TZ u_FSK_TZ(
    .rst        (rst),
    .clk        (clk),
    .din        (din),
    .dout        (dout)
);

endmodule


1MHz,din信号产生模块(将系统时钟分频得到)

module FSK_din(
input        clk,
input        rst,
output        din
);

localparam                        CLK_DIVIDE = 4'd32;    // 时钟分频系数
reg                    [ 3:0]        clk_cnt;                // 时钟分频计数器
reg                                x;                // 1MHz

//对系统时钟32分频,得到的频率为1MHz
always @(posedge clk or negedge rst) begin
    if(!rst) begin
        clk_cnt <= 4'd0;
        x <= 1'b1;
    end
    else if(clk_cnt == CLK_DIVIDE/2 - 1'd1) begin
        clk_cnt <= 4'd0;
        x <= ~x;
    end
    else begin
        clk_cnt <= clk_cnt + 1'b1;
        x <= x;
    end
end

assign    din = x;

endmodule

FSK调制模块

module FSK_TZ(
    rst,
    clk,
    din,
    dout
);

input                            rst;
input                            clk;                    //32MHz
input                            din;                    //1MHz
output    signed        [14:0]        dout;

//NCO核信号
wire                            reset_n,out_valid,clken;
wire                [24:0]        frequency_df;
assign                            reset_n = !rst;
assign                            clken = 1'b1;
assign                            carrier = 25'd6291456;

//例化NCO核
dds u0 (
    .phi_inc_i                    (carrier),
    .clk                        (clk),
    .reset_n                    (reset_n),
    .clken                        (clken),
    .freq_mod_i                    (frequency_df),
    .fsin_o                        (dout),
    .out_valid                    (out_valid)
);

assign    frequency_df = (din) ? 25'd1835008:-25'd1835008;

endmodule

激励文件

`timescale 1 ns/ 10 ps
module FSK_top_vlg_tst();

reg                clk;
reg                rst;
wire            dout;

parameter T = 20;

FSK_top i_FSK_top (
    .clk        (clk),
    .dout        (dout),
    .rst        (rst)
);
initial
begin
    clk = 0;
    rst = 0;
    #110    rst = 1;
    #100_000    $stop;
$display("Running testbench");
end

always # (T/2) clk <= ~clk;
endmodule

运行结果及报错内容

img

img

我的解答思路和尝试过的方法

更改分频系数,无果。将系统时钟分频代码另立工程亲测有效。

我想要达到的结果

在1MHz经FSK调制后,正确输出dout。

1:FSK_din 模块

module FSK_din(
input        clk,
input        rst,
output        din
);
 
localparam                        CLK_DIVIDE = 32;    // 时钟分频系数
reg                    [ 3:0]        clk_cnt;                // 时钟分频计数器
reg                                x;                // 1MHz
 
//对系统时钟32分频,得到的频率为1MHz
always @(posedge clk or negedge rst) begin
    if(!rst) begin
        clk_cnt <= 4'd0;
        x <= 1'b1;
    end
    else if(clk_cnt == CLK_DIVIDE/2 - 1'd1) begin
        clk_cnt <= 4'd0;
        x <= ~x;
    end
    else begin
        clk_cnt <= clk_cnt + 1'b1;
        x <= x;
    end
end
 
assign    din = x;
 
endmodule
 

2:FSK_TZ 模块

module FSK_TZ(
    rst,
    clk,
    din,
    dout
);
 
input                            rst;
input                            clk;                    //32MHz
input                            din;                    //1MHz
output    signed        [14:0]        dout;
 
//NCO核信号
wire                            reset_n,out_valid,clken;
wire                [24:0]        frequency_df;
wire                [24:0]        carrier ;
assign                            reset_n = rst;
assign                            clken = 1'b1;
assign                            carrier = 25'd6291456;
 
//例化NCO核
dds u0 (
    .phi_inc_i                    (carrier),
    .clk                        (clk),
    .reset_n                    (reset_n),
    .clken                        (clken),
    .freq_mod_i                    (frequency_df),
    .fsin_o                        (dout),
    .out_valid                    (out_valid)
);
 
assign    frequency_df = (din) ? 25'd1835008:-25'd1835008;
 
endmodule
 

别的问题没看出来,先试试吧