Verilog - 像VHDL一样在一个块中有多个边?

时间:2015-02-24 22:20:57

标签: verilog quartus

我正在使用Quartus II,版本11.0,我正在尝试将我的VHDL代码移植到Verilog(仅用于练习)。

我需要检查 - 'a'线有多长。有工作的VHDL代码:

process (clock, a)
begin
    -- on each rising edge of clock...
    if (rising_edge(clock))
    then -- count how long 'a' is low
        if (a = '0' and a_low_time < 3)
        then
            a_low_time <= a_low_time + 1;
        end if;
    end if;
    -- reset counter if 'a' is not low
    if a = '1' then
        a_low_time <= 0;
    end if;
end process;

很简单,它工作得很好。但是我怎么能用Verilog做呢? 这段代码:

// on each rising edge of clock...
always @ (posedge clock)
begin
    // count how long 'a' is low
    if (!a && a_low_time < 3)
        a_low_time <= a_low_time + 1;
end

// reset counter if 'a' is high
always @ (*)
begin
    if (a)
        a_low_time <= 0;
end

抛出“无法解决多个常量驱动程序”错误。这个:

always @ (posedge clock, posedge a)
begin
    if (!a && a_low_time < 3)
        a_low_time <= a_low_time + 1;
    else if (a)
        a_low_time <= 0;
end

抛出“无法将条件中的操作数与始终构造”错误的封闭事件控件中的相应边匹配。

此代码正常工作

always @ (posedge clock)
begin
    if (!a && a_low_time < 3)
        a_low_time <= a_low_time + 1;
    else if (a)
        a_low_time <= 0;
end

但我需要在'a'变高后立即重置a_low_time,但不要在时钟的上升沿重置。

我该怎么办?不敢相信我做不到这么简单的任务。

1 个答案:

答案 0 :(得分:1)

为什么需要异步重置a_low_time?在任何情况下,也许您可​​以使用a作为重置行:

always @(posedge clock or posedge a)
begin
    if (a)
        a_low_time <= 0;
    else if (!a && a_low_time < 3)
        a_low_time <= a_low_time + 1;

实际上,由于a是你的重置,你不应该检查它是否增加:

always @(posedge clock or posedge a)
begin
    if (a)
        a_low_time <= 0;
    else if (a_low_time < 3)
        a_low_time <= a_low_time + 1;