Verilog:甚至在时钟上设置恒定值

Mic*_*chs 2 verilog

我是Verilog的新手,所以这个问题可能很愚蠢。

我正在尝试的是:我有一个具有clk,8位输入和8位输出的组件。它应该做的是:

如果时钟事件为下降沿,则应将输出设置为0。如果时钟事件为上升沿,则应将输出设置为该边缘事件此刻的任何输入。在时钟的高相位期间,无论输入如何变化,输出都不应改变。

到目前为止我尝试过的是:

always @(negedge clk)
    _ledOut <= 0;

always @(posedge clk)
    _ledOut[RowSize-1:0] <= ledIn[RowSize-1:0];
Run Code Online (Sandbox Code Playgroud)

这告诉我,它无法解析net _ledOut的多个常量驱动程序。

但是,将它们放在一起始终为@(negedge clk,posege clk)告诉我,它不能同时测试这两种情况。

因此,我尝试仅制作一个始终@(clk)块,然后使用if语句:

always @(clk) begin
    if(clk == 0)
        _ledOut <= 0;
    else if(clk == 1)
        _ledOut[RowSize-1:0] <= ledIn[RowSize-1:0];
end
Run Code Online (Sandbox Code Playgroud)

但这不只是打开clk事件。在时钟的高电平阶段,它将_ledOut与ledIn链接在一起,因此ledIn的更改也确实会对_ledOut产生影响。我在这里做错了什么?

最好的问候,迈克尔

小智 5

这告诉我,它无法解析net _ledOut的多个常量驱动程序。

对于综合,您不能从多个Always块分配reg类型。

但是,将它们放在一起始终为@(negedge clk,posege clk)告诉我,它不能同时测试这两种情况。

这实质上描述了DDR寄存器。尽管许多FPGA器件都具有这些器件,但它们通常无法合成。如果确实需要此功能,赛灵思将使用ODDR2和IDDR2原语。

如果时钟事件为下降沿,则应将输出设置为0。如果时钟事件为上升沿,则应将输出设置为该边缘事件此刻的任何输入。在时钟的高相位期间,无论输入如何变化,输出都不应改变。

如果这是您所需要的,那么您可以使用D触发器,在输出端带有AND门。触发器将在clk的每个上升沿采样ledIn,并且只要时钟为零,AND门就会屏蔽输出。这是不理想的,因为您通常不希望时钟触及非顺序逻辑,但是避免这种情况可能意味着更改您的要求。

正如toolic所指出的那样,您发布的代码可以使用,但是您应该理解该代码将合成为由clk控制的多路复用器。