FPGA|CPLD|ASIC论坛
直播中

Boboao

4年用户 6经验值
擅长:可编程逻辑 嵌入式技术
私信 关注

xilinx vivado调用cordic IP核进行实现时报错多重驱动?

用vivado2019.2建立工程,工程中调用cordic IP核进行atan求解,功能仿真时正常且满足要求;综合时正常;实现时报错提示多重驱动。

如果经cordic计算后的输出值不用于后续的操作,只将该值引出,则能通过实现。如果将cordic输出值经寄存器打拍后再输出,能进行实现,但是message有电路警告,仍旧提示多重驱动。

本工程中,将cordic计算后的输出值用于 1、数值范围判断(if...else...);2、做位拼接,拼接后的数据用于做加。

问题:不知道什么原因,IP核不应该有这种问题吧,但是回看自己的工程代码,也不觉得哪里有问题,目的是要把计算结果用于后续操作,并没有对将其作为操作数进行赋值。

当局者迷,敬请各前辈赐教!

调用cordic ip的代码模块如下:

`timescale 1ns/1ps
module cordic_rad
(   input   wire                        i_clk,
    input   wire                        i_en,
    input   wire    signed  [ 8:0]      i_xin,
    input   wire    signed  [ 8:0]      i_yin,
 
    output  wire                        o_data_valid,
    output  wire    signed  [15:0]      o_theta_rad
);
    
    wire signed [ 8:0] w_x_in;
    wire [31:0] w_y_in_x_in;
    
    assign w_x_in = i_yin == 9'b0_0000_0000 ? 16'sd1 : i_xin;          
    assign w_y_in_x_in = {{7{i_yin[8]}}, i_yin, {7{w_x_in[8]}}, w_x_in};
    //手动扩位处理,保持与cordic ip输入数据位宽要求一致

    cordic_0 cordic_0_inst (
        .aclk                       (i_clk),        // input wire aclk
        .s_axis_cartesian_tvalid    (i_en),         // input wire s_axis_cartesian_tvalid
        .s_axis_cartesian_tdata     (w_y_in_x_in),  // input wire [31 : 0] s_axis_cartesian_tdata
        .m_axis_dout_tvalid         (o_data_valid),// output wire m_axis_dout_tvalid
        .m_axis_dout_tdata          (o_theta_rad)  // output wire [15 : 0] m_axis_dout_tdata
    );

endmodule

cordic ip配置页面如下:
image.png

vivado message窗口,实现时报错信息截图如下:
image.png

RTL视图多重驱动的信号线截图如下:
image.png

附加,综合时关于cordic ip的一些警告信息,如下:
image.png

回帖(3)

卿小小_9e6

2023-6-6 18:37:25
大概率是语法问题,以下仅供参考:

2 举报
  • 卿小小_9e6: 文字回复总是失败,所以截图回复……
  • Boboao 回复 卿小小_9e6: 您好,感谢回复。这个这么写应该没有问题吧,但是加上也无妨,我还发现后面的赋值写成了16bit。同时进行修改,仍旧是实现出现错误。

Boboao

2023-6-7 16:33:03
已解决,顶层引出使用的线网再声明时赋了初值,导致多驱动冲突。去掉赋初值问题就解决了。
举报

王鑫

2024-5-27 17:56:28
clk,
        input   wire                         rst_n,          //reset信号(低电平有效)
        input   wire    [31:0]              x_in,          //输入角度
        output  reg     [31:0]              atan_out,      //atan(x_in)的输出
        output  reg     [31:0]              y_out,         //cordic计算结果(sin(x_in))
        output  reg     [31:0]              x_out          //cordic计算结果(cos(x_in))
     );

/*  定义CORDIC IP的I/O端口  */
wire    [31:0]  atan_out_wire;
wire    [31:0]  y_out_wire;
wire    [31:0]  x_out_wire;
reg     [31:0]  reset_val = 1;        //CORDIC IP的reset值

/*  实例化CORDIC IP核 */
CORDIC_IP u_cordic_ip (
                .ATAN_OUT(atan_out_wire),
                .Y_OUT(y_out_wire),
                .X_OUT(x_out_wire),
                .CLK(clk),
                .RSTN(~rst_n),          //注意:IP的reset要取反输入
                .X_IN(x_in)
                );

/*  赋值  */
always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        atan_out <= reset_val;
        y_out    <= reset_val;
        x_out    <= reset_val;
    end else begin
        atan_out <= atan_out_wire;
        y_out    <= y_out_wire;
        x_out    <= x_out_wire;
    end
end

endmodule

这是调用CORDIC IP核的代码模块,如果代码中没有问题,可能是IP核配置或者使用不当导致的问题。建议检查IP核的配置是否与硬件平台和使用场景相符合。同时,也可以尝试在IP核上增加控制信号,控制输出信号是否有效,或者将输出信号经过寄存器等数据缓存后再引出,以减小IP核输出对后续电路的影响。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分