intel FPGA 模块传参问题

问题遇到的现象和发生背景

使用intel FPGA,verlog语言,项目由多个v文件构成的系统,分为第一层的top,第二层的uart,第三层的idc.
现在问题是idc的reg值无法把数值反馈给uart。

遇到的现象和发生背景,请写出第一个错误信息

使用signaltap调试,可以看到在uart层寄存器有数值,但在uart里面看到这个值为0;

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

Uart模块内:
1.需要获取的变量如下:

wire [15:0] HDOUT1_H ;

2.Uart实例化idc代码如下:

idc_model(
    .clk   (clk  ),
    .rst_n (rst_n),
    .HSET0 (HSET0),
    .HCOM0 (HCOM0),
    .HCOM1 (HCOM1),
    .HDOUT1_H(HDOUT1_H),
);

IDC模块内部:

module idc_model(
    input       clk,//clock input
    input       rst_n,//asynchronous reset input, low active
    output reg [15:0] HDOUT1_H,
    input [7:0] HCOM0,
    input [7:0] HCOM1,
    input [7:0] HSET0,
);

关键变量:
reg [19:0] sum_high1;
使用方式如下:

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cycle_H_cnt1 <= 0;
        sum_high1 <= 0;
        sum_h_cnt1 <= 0; add_flag <= 0; c_test_flag <= 0;
    end
    else begin
        if(add_cnt_high1) begin
            //这里的计数就是上升沿和下降沿之间的计数了
            cycle_H_cnt1 <= cycle_H_cnt1 + 1;
            add_flag <= ~add_flag;
        end
        else if(end_cnt_high1) begin
            if(sum_h_cnt1 == 5'd16)begin
                r_HDOUT1_H <= sum_high1[19:4];
                sum_high1 <= 0;
                sum_h_cnt1 <= 0;
            end
            else begin
                sum_high1 <= sum_high1 + cycle_H_cnt1;
                sum_h_cnt1 <= sum_h_cnt1 + 1;
            end
            cycle_H_cnt1 <= 0;
        end
        else if(H01EN == 0)begin
            cycle_H_cnt1 <= 0;
            sum_high1 <= 0;
            sum_h_cnt1 <= 0;
        end
    end
end
assign add_cnt_high1 = (H01EN == 1) && (pos_flag == 1) ;
assign end_cnt_high1 = (H01EN == 1) && (neg_flag == 1) && (cycle_H_cnt1 > 0);
运行结果及详细报错内容

HDOUT1_H在IDC里面的数值无法传递给uart模块,signaltap结果如下:

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

我感觉是模块间参数传递的问题,以及寄存器声明的写法?

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

可能的问题有:

IDC模块中的HDOUT1_H信号未正确连接到UART模块中的HDOUT1_H引脚。请检查连接是否正确。
IDC模块中的HDOUT1_H信号没有被正确更新。请检查是否存在对HDOUT1_H的更新操作。
IDC模块中的HDOUT1_H信号被其他信号覆盖了。请检查是否存在多余的赋值操作。
IDC模块中的时钟信号或复位信号未正确连接到UART模块中。请检查时钟和复位信号的连接是否正确。
建议使用调试工具,如Signaltap观察这些信号的值变化情况,以确定究竟是哪里出现了问题。

帮你改了代码,你试试。always块的最后加上下面的语句,来将值赋给 HDOUT1_H,这样就能传递给UART中的HDOUT1_H ,在UART 中输入变量 HDOUT1_H 没有被赋值。

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cycle_H_cnt1 <= 0;
        sum_high1 <= 0;
        sum_h_cnt1 <= 0; add_flag <= 0; c_test_flag <= 0;
    end
    else begin
        if(add_cnt_high1) begin
            //这里的计数就是上升沿和下降沿之间的计数了
            cycle_H_cnt1 <= cycle_H_cnt1 + 1;
            add_flag <= ~add_flag;
        end
        else if(end_cnt_high1) begin
            if(sum_h_cnt1 == 5'd16)begin
                r_HDOUT1_H <= sum_high1[19:4];
                sum_high1 <= 0;
                sum_h_cnt1 <= 0;
            end
            else begin
                sum_high1 <= sum_high1 + cycle_H_cnt1;
                sum_h_cnt1 <= sum_h_cnt1 + 1;
            end
            cycle_H_cnt1 <= 0;
        end
        else if(H01EN == 0)begin
            cycle_H_cnt1 <= 0;
            sum_high1 <= 0;
            sum_h_cnt1 <= 0;
        end
    end
    HDOUT1_H <= r_HDOUT1_H;
end
assign add_cnt_high1 = (H01EN == 1) && (pos_flag == 1) ;
assign end_cnt_high1 = (H01EN == 1) && (neg_flag == 1) && (cycle_H_cnt1 > 0);


可以试试从以下几个方面入手来解决这个问题:

1.首先检查代码是否有语法错误或编译错误。

2.检查UART和IDC模块之间的连接是否正确,是否有信号线没有连接上。

3.在UART和IDC模块的代码中添加断点或者使用调试工具来跟踪变量的变化,以确定哪些变量在哪里发生了变化。

4.检查时钟脉冲是否正确,确保时钟在IDC模块和UART模块中是同步的。

5.检查IDC模块中的sum_high1变量是否正确赋值,确保在sum_h_cnt1 == 5'd16时,sum_high1已经被重置为0, r_HDOUT1_H被赋值.

6.检查UART模块中是否有对HDOUT1_H变量进行了更新或者重新赋值。

7.检查IDC模块中是否有输出变量HDOUT1_H被连接到UART模块上。
仅供参考,望采纳,谢谢。

  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:Intel发布FPGA