ROM例化之后的仿真出错了

2019-03-25 08:24发布

本来是想实现频率合成器的,使用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
跪求指导!!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
白丁
1楼-- · 2019-03-25 16:04
< / my_rom(.address(rom_address),这个地方错了,module_name instance_name(port_associations)这才是例化的格式
白丁
2楼-- · 2019-03-25 16:19
问题要是解决了的话,记得说一声,也给别人做个参考啊

一周热门 更多>