0

我有一个问题(由于缺乏理解),我在另一个文件中构建了一个模块,并希望我的更高级别(不一定是顶级)模块通过提供输入和获取模块的输出来使用它。下面是简化形式的代码片段,以说明我的问题。

module translate_packet_data(rx_packet, packet_size, do_analysis, output_ascii);

reg [7:0] gps_utc_hour;
reg [7:0] gps_utc_min;
reg [7:0] gps_utc_sec;
reg [31:0] gps_utc_milli;

wire [3:0] utc_hour_hundreds_w,utc_hour_tens_w,utc_hour_ones_w;
reg [3:0] utc_hour_hundreds,utc_hour_tens,utc_hour_ones;


binary8_to_BCD utc_hour_BCD(
    .binary(gps_utc_hour), 
    .Hundreds(utc_hour_hundreds_w), 
    .Tens(utc_hour_tens_w),
    .Ones(utc_hour_ones_w)
);

always @ (posedge do_analysis) begin
 //Do all my logic stuff
    gps_utc_hour = rx_packet[pointer-:8];
 //more logic stuff, but thats besides the point

 //Here is where illegal stuff happen that I don't know how to get around, even though it is synthesizable, the simulation reveals it is wrong
    utc_hour_tens = utc_hour_tens_w;
    utc_hour_tens = utc_hour_tens + 48;
    reg_output_ascii = {reg_output_ascii, utc_hour_tens};

end

正如您可能从我的代码片段中看到的那样,utc_hour_tens_w 尚未解决,我将从模拟中获得 XXXX。所以我的问题是,如果我想在这个模块中维护所有翻译逻辑,我该如何解决这个问题?(是的,我知道这个代码不起作用,这是对问题相关部分的粗略复制/粘贴工作,完整代码有大约 600 行你都不想看到)

目标主要是获取一个数据包,提取有意义的部分,将其转换为 BCD,然后将其转换为 ASCII 并将其存储到将馈送到计算机的输出寄存器中。

4

2 回答 2

2

我认为你的敏感列表是错误的。

always @ (posedge do_analysis) begin
 //Do all my logic stuff
    gps_utc_hour = rx_packet[pointer-:8];
 //more logic stuff, but thats besides the point

 //Here is where illegal stuff happen that I don't know how to get around, even though it is synthesizable, the simulation reveals it is wrong
    utc_hour_tens = utc_hour_tens_w;
    utc_hour_tens = utc_hour_tens + 48;
    reg_output_ascii = {reg_output_ascii, utc_hour_tens};

end

如果这只是一个组合块(不是时钟时序逻辑),那么您应该只使用推断的灵敏度列表always @*。这将确保 utc_hour_tens_w 包含在敏感度中,并且您的输出将尽快更新utc_hour_tens_w

如果您试图阻止输出在do_analysis低电平时发生变化,则在块内创建一个 if 条件,不要试图通过弄乱灵敏度列表来控制组合逻辑。

于 2013-05-30T20:52:44.657 回答
0

问题是您试图在一个顺序块中分配一个寄存器两次,第二次使用从其自身派生的数据。您可以尝试将这对utc_hour_tens = ...作业替换为utc_hour_tens <= utc_hour_tens+48

于 2013-05-30T20:43:30.780 回答