本来是想实现频率合成器的,使用ROM,例化之后仿真出现这个错误,实在不知道怎么修改了,望大侠们指导。
# ** Error: (vsim-3037) F:/work/DDS/DDS.v(21): Missing instance name in instantiation of 'my_rom'.
# Region: /DDS_vlg_tst/i1
verilog 顶层文件为:
// 数字式频率合成器DDS
module DDS(clk,ftw,rec,out_q,ack);
input clk;
input ftw; // 频率控制字长
input rec; // 接收信号使能
output ack; // 接收应答信号
output [9:0] out_q; // 幅度值输出
reg [23:0] phase_adder,frq_reg; // 相位地址,频率寄存器
reg [9:0] rom_address,address; // rom地址,对应区间的地址
//reg [9:0] rom_out; // rom查找表的输出
reg s1,s2,a1,a2; // 显示相位的区间
reg a; // a与ack相同,在判断是使用
reg ack;
reg [9:0] out_q;
wire [9:0] rom_out;
// rom例化
my_rom(.address(rom_address),
.clock(clk),
.q(rom_out));
// 频率寄存部分
always@(posedge clk)
begin
if(rec) // 接收信号使能有效,开始接收频率控制字
begin
frq_reg<=ftw;
ack<=1; // 接收成功,应答信号有效
a<=1;
end
else if(a) // 一个周期后复位ack
begin
ack<=0;
a<=0;
end
end
// 相位累加部分
always@(posedge clk)
begin
phase_adder<=phase_adder+frq_reg; // 相位累加
rom_address[0]<=phase_adder[12]; // 累加器的高12位作为地址进行rom查表
rom_address[1]<=phase_adder[13];
rom_address[2]<=phase_adder[14];
rom_address[3]<=phase_adder[15];
rom_address[4]<=phase_adder[16];
rom_address[5]<=phase_adder[17];
rom_address[6]<=phase_adder[18];
rom_address[7]<=phase_adder[19];
rom_address[8]<=phase_adder[20];
rom_address[9]<=phase_adder[21];
s2<=phase_adder[22]; // 显示相位区间
s1<=phase_adder[23];
end
// ROM查找表部分
always@(posedge clk)
begin
a1<=s1;
a2<=s2;
if({s1,s2}==2'b00)
address<=rom_address; // 0~pi/2区间的地址
else if({s1,s2}==2'b01)
address<=~rom_address; // pi/2~pi区间的地址
else if({s1,s2}==2'b10)
address<=rom_address; // pi~3*pi/2区间地址
else if({s1,s2}==2'b11)
address<=~rom_address; // 3*pi/2~2*pi区间地址
if({a1,a2}==2'b00) // 0~pi/2区间的幅度输出
out_q<=rom_out;
else if({a1,a2}==2'b01) // pi/2~pi区间的幅度输出
out_q<=rom_out;
else if({a1,a2}==2'b10) // pi~3*pi/2区间的幅度输出
out_q<=~rom_out+1; // 输出值为负
else if({a1,a2}==2'b11) // 3*pi/2~2*pi区间的幅度输出
out_q<=~rom_out+1;
end
endmodule
仿真程序为:
`timescale 1 ns/ 1 ns
module DDS_vlg_tst();
reg clk;
reg ftw;
reg rec;
wire ack;
wire [9:0] out_q;
wire [9:0] rom_out;
DDS i1 (
.ack(ack),
.clk(clk),
.ftw(ftw),
.out_q(out_q),
.rec(rec)
);
initial
begin
clk=0;rec=0;ftw=65536;
#30 rec=1;
#30 rec=0;
end
always
begin
#50 clk=~clk;
end
endmodule
跪求指导!!!
此帖出自
小平头技术问答
一周热门 更多>