改变2中reg的值总是阻止的提示是什么?

时间:2016-03-14 06:43:40

标签: verilog

我有2个始终的块和finish_bcd有线信号,以便仅在转换完成时进行检测。 在转换之后,我想把它放在0,但它在另一个总是阻止......

wire finish_bcd;

bin2bcd BinTBcd (
 .binary(data),
 .thousands(w1),
 .hundreds(w2),
 .tens(w3),
 .ones(w4),
 .finish(finish_bcd)  //################ line 53
);

always @(posedge finish or posedge finish_bcd) begin
    if (finish_bcd == 1) begin
        case(enable)
            5'b00000: enable <= 5'b00001; //send the thousands
            5'b00001: enable <= 5'b00010; //send the hundreds
            5'b00010: enable <= 5'b00100; //send the tens
            5'b00100: enable <= 5'b01000; //send the ones
            5'b01000: enable <= 5'b10000; //send a ";"
            5'b10000: enable <= 5'b00000; // Everything is sent, I would like to do 'finish_bcd = 0;' here, at the end of the process in this always block.
            default: enable <= 5'b00000;
        endcase 
    end
end

bin2bcd模块是:

module bin2bcd (
    input [10:0] binary,
    output reg [3:0] thousands,
    output reg [3:0] hundreds,
    output reg [3:0] tens,
    output reg [3:0] ones,
    output reg finish);

integer i;

always @(binary) begin
    // set 100's, 10's, and 1's to zero
   thousands = 4'b0;
   hundreds = 4'b0;
   tens = 4'b0;
   ones = 4'b0;

   for (i=10; i>=0; i=i-1) begin
       // add 3 to columns >= 5
       if (thousands >= 5)
           thousands = thousands + 3;         
       if (hundreds >= 5)
           hundreds = hundreds + 3;
       if (tens >= 5)
           tens = tens + 3;
       if (ones >= 5)
           ones = ones + 3;
        // shift left one
       thousands = thousands << 1;
       thousands[0] = hundreds[3];
       hundreds = hundreds << 1;
       hundreds[0] = tens[3];
       tens = tens << 1;
       tens[0] = ones[3];
       ones = ones << 1;
       ones[0] = binary[i];
   end

     finish <= 1;  //############ line to detect when the conversion is done

end
endmodule

另一个问题:为什么我不能只改变“reg finish_bcd;”在顶级模块?

我收到此错误line 53 Reference to scalar reg 'finish_bcd' is not a legal net lvalue

我将为Xilinx FPGA合成此代码。

编辑:

我有一个二进制字,我想通过串行通信发送它然后我将这个二进制(11位)转换为BCD以发送ASCII数字。 我希望每次“二进制”更改时发送。 finish_bcd用于检测转换何时开始发送数据。 always @(posedge finish or posedge finish_bcd) begin块用于更改状态(为了发送数千个,然后是数百个...等等。

然后,binary更改,转换完成,finish_bcd = 1,它开始发送数据(数千个等等),每个发送的结尾都会被finish检测到 一切都在模拟中,但由于finish_bcd没有变为0,所以当它发送所有数字时,它就会停止。我需要在结尾处重置finish_bcd,以便检测新的binary更改并开始发送新值。

谢谢。

1 个答案:

答案 0 :(得分:2)

always @*是组合的,这需要在零时间内进行模拟。对于状态机,您需要使用时钟并暗示触发器用于状态。

组合逻辑不能保持状态,因此状态机本身并不好。组合部分通常在Moore FSM中用于解码状态到输出(基于状态)。

bin2bcd模块是组合的,因为没有时钟或触发器用于使其花费超过1个时钟周期,这意味着它需要0个时钟周期。你已经使用了for循环,你可能指的是执行它需要多少循环,for循环指定10.但是这是组合所以你暗示并行硬件的负载,只是因为它是verilog中的循环并不意味着它重用比较器。如果你想最小化硬件并花费10个时钟周期来计算结果,你需要建立一个状态机来控制和排序它。

第2部分

posedge finish or posedge finish_bcd并不意味着有效的硬件结构。

部分地,您在敏感度列表中有两个posedges,一个没有被用作异步重置或设置。这意味着你已经创建了一个带有两个时钟输入的触发器。这种硬件结构根本就不存在。

除此之外使用数据信号(完成)作为时钟将导致综合时出现各种时序问题。将此设计视为更大系统的一部分,您必须平衡所有时钟树,如果你不保持数据和时钟分开,这几乎是不可能的。