使用intel FPGA,verlog语言,项目由多个v文件构成的系统,分为第一层的top,第二层的uart,第三层的idc.
现在问题是idc的reg值无法把数值反馈给uart。
使用signaltap调试,可以看到在uart层寄存器有数值,但在uart里面看到这个值为0;
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结果如下:
我感觉是模块间参数传递的问题,以及寄存器声明的写法?
可能的问题有:
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模块上。
仅供参考,望采纳,谢谢。