cyydouhui 2024-07-24 09:53 采纳率: 0%
浏览 4

在puartus 13.0与modelsim的联合仿真 fft ip核时出现的疑似位宽问题

在puartus 13.0与modelsim的联合仿真 fft ip核时出现的问题

img


这个报错我翻译了一下是,我顶层文件rom_FFT_top.v的source_exp和source_error位宽与仿真文件fft_ip.vo文件的端口位宽不匹配
,如何我改了好多次,我试着吧source_exp和source_error的位宽改的很大,都是报错,会出现其他的位宽报错

这是我的顶层代码

module rom_FFT_top
#(
    parameter   sampling_MAX = 8'd255
 )
 
(
    input   Sys_Clk,
    input   Sys_rst_n,

    output  [7:0]  q,
    output  ready,
    output  [1:0]    source_error,
    output  source_sop,
    output  source_eop,
    output  source_valid,
    output  [7:0]    source_exp,
    output  [7:0]     source_real,
    output  [7:0]     source_imag
   
);

reg     [7:0]   address_sig;                    //rom_ip核的计数参数

//reg             inverse_FFT = 1'b0;        //FFT_ip参数                             
//reg             sink_valid = 1'b1;
reg    [7:0]   sampling;                  //采样数,sop和eop
wire             sop;
wire             eop;

always @(posedge Sys_Clk or negedge Sys_rst_n)  //rom_ip核的计数
    begin
        if(Sys_rst_n==0)begin
            address_sig<=1'd0;end
        else begin
            address_sig<=address_sig+1'b1;end
    end
            
rom_ip    rom_ip_inst         //rom iP核的调用
(
    .address ( address_sig ),
    .clock ( Sys_Clk ),
    .q ( q )
);
              
always @(posedge Sys_Clk or negedge Sys_rst_n)  //sop和eop置1的条件
    begin
        if(Sys_rst_n == 1'b0)begin
            sampling<=1'd0;end
        else if(sampling == sampling_MAX)begin
            sampling<=1'd0; end                       
        else begin
            sampling<=sampling+1'b1; end
    end        

assign  sop = (sampling==1'd0)? 1'b1:1'b0;
assign  eop = (sampling==sampling_MAX)? 1'b1:1'b0;            
            
fft_ip     fft_ip_inst
(
    .clk         (Sys_Clk) , //时钟
    .reset_n     (Sys_rst_n) ,//复位                 
    .inverse     (1'b0) ,//0—FFT,1-逆-FFT
    .sink_valid  (1'b1) ,//使能(输入有效)
    .sink_sop    (sop) ,//采样周期起始信号
    .sink_eop    (eop) ,//采样周期截至信号
    .sink_real   (q) ,//输入数据————实部
    .sink_imag   (8'd0) ,//输入数据————虚部
    .sink_error  (1'b0) ,//置0,错误信号
    .sink_ready  (ready) ,//置1时,输入数据有效
    .source_ready(1'b1) ,//置1时,输出数据有效
    .source_error(source_error) ,//1表示出现错误
    .source_sop  (source_sop) ,//输出周期起始信号
    .source_eop  (source_eop) ,//输出周期截至信号
    .source_valid(source_valid) ,//使能(输出有效)
    .source_exp  (source_exp) ,//缩放因子
    .source_real (source_real) ,//输出数据————实部
    .source_imag (source_imag ) //输出数据————虚部
);

endmodule

我没办法打开vo文件,不能查看他需要的位宽,但是我的ip核设置里面的缩放因子是8位宽的,我理解的这个source_exp 就是缩放因子,并且我的代码里面这个source_error我定义的[1:0],报错上面提示我是定义的是1位宽,但是modelsim的仿真里面这两个数据都报错了,
我不是很能理解这个问题在哪,求解答

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 09:53
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的信息和代码,问题确实出在位宽不匹配上。以下是一些详细的步骤和建议,帮助你解决这个问题:

    1. 确认仿真文件中的位宽定义

    首先,你需要确认 fft_ip.vo 文件中 source_expsource_error 的位宽定义。虽然你提到无法打开 vo 文件,但你可以尝试以下方法:

    • 查看文档:检查你下载或生成 IP 核时附带的文档,通常这些文档会详细说明 IP 核的接口定义和位宽要求。
    • 联系技术支持:如果文档中没有明确说明,你可以联系 IP 核的提供者,询问正确的位宽定义。

    2. 修改顶层代码

    根据 fft_ip.vo 文件中的位宽定义,修改你的顶层模块 rom_FFT_topsource_expsource_error 的位宽定义。以下是一些示例代码:

    module rom_FFT_top
    #(
        parameter   sampling_MAX = 8'd255
     )
     
    (
        input   Sys_Clk,
        input   Sys_rst_n,
    
        output  [7:0]  q,
        output  ready,
        output  [1:0] source_error,  // 修改为2位宽
        output  source_sop,
        output  source_eop,
        output  source_valid,
        output [5:0] source_exp,      // 修改为6位宽
        output  [7:0] source_real,
        output  [7:0] source_imag
       
    );
    
    reg     [7:0]   address_sig;                    // rom_ip核的计数参数
    
    always @(posedge Sys_Clk or negedge Sys_rst_n)  // rom_ip核的计数
        begin
            if(Sys_rst_n==0)begin
                address_sig<=1'd0;end
            else begin
                address_sig<=address_sig+1'b1;end
        end
                
    rom_ip	rom_ip_inst         // rom iP核的调用
    (
    	.address ( address_sig ),
    	.clock ( Sys_Clk ),
    	.q ( q )
    );
                  
    always @(posedge Sys_Clk or negedge Sys_rst_n)  // sop和eop置1的条件
        begin
            if(Sys_rst_n == 1'b0)begin
                sampling<=1'd0;end
            else if(sampling == sampling_MAX)begin
                sampling<=1'd0; end                       
            else begin
                sampling<=sampling+1'b1; end
        end        
    
    assign  sop = (sampling==1'd0)? 1'b1:1'b0;
    assign  eop = (sampling==sampling_MAX)? 1'b1:1'b0;            
                
    fft_ip     fft_ip_inst
    (
    	.clk         (Sys_Clk) , //时钟
    	.reset_n     (Sys_rst_n) ,//复位                 
    	.inverse     (1'b0) ,//0—FFT,1-逆-FFT
    	.sink_valid  (1'b1) ,//使能(输入有效)
    	.sink_sop    (sop) ,//采样周期起始信号
    	.sink_eop    (eop) ,//采样周期截至信号
    	.sink_real   (q) ,//输入数据————实部
    	.sink_imag   (8'd0) ,//输入数据————虚部
    	.sink_error  (1'b0) ,//置0,错误信号
    	.sink_ready  (ready) ,//置1时,输入数据有效
    	.source_ready(1'b1) ,//置1时,输出数据有效
    	.source_error(source_error) ,//1表示出现错误
    	.source_sop  (source_sop) ,//输出周期起始信号
    	.source_eop  (source_eop) ,//输出周期截至信号
    	.source_valid(source_valid) ,//使能(输出有效)
    	.source_exp  (source_exp) ,//缩放因子
    	.source_real (source_real) ,//输出数据————实部
    	.source_imag (source_imag ) //输出数据————虚部
    );
    
    endmodule
    

    3. 更新仿真环境

    确保你的仿真环境使用的 fft_ip.vo 文件与 IP 核的当前版本一致。这可以通过重新生成 IP 核并更新仿真文件来实现。

    4. 重新编译和仿真

    修改代码后,重新编译并运行仿真,检查是否解决了位宽不匹配的问题。

    5. 进一步调试

    如果问题仍然存在,你可能需要进一步调试,或者考虑以下可能性:

    • 仿真文件版本不一致:确保仿真文件与你的 IP 核版本一致。
    • 仿真设置问题:检查仿真设置,确保没有其他配置错误。

    6. 联系技术支持

    如果以上步骤都无法解决问题,建议联系 IP 核的技术支持,提供详细的错误信息和你的代码,寻求进一步的帮助。

    通过这些步骤,你应该能够解决位宽不匹配的问题,并成功进行联合仿真。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月24日
  • 创建了问题 7月24日

悬赏问题

  • ¥15 c#转安卓 java html
  • ¥15 os.listdir文件路径找不到
  • ¥15 使用gojs3.0,如何在nodeDataArray设置好text的位置,再go.TextBlock alignment中进行相应的改变
  • ¥15 psfusion图像融合指标很低
  • ¥15 银河麒麟linux系统如何修改/etc/hosts权限为777
  • ¥50 医院HIS系统代码、逻辑学习
  • ¥30 docker离线安装mysql报错,如何解决?
  • ¥15 构建工单的总账影响在哪里查询或修改
  • ¥15 三个简单项目写完之后有重赏之后联系我
  • ¥15 python报内存不能read错误