代码编译显示没有错误,但在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
更改分频系数,无果。将系统时钟分频代码另立工程亲测有效。
在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
别的问题没看出来,先试试吧