我是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控制的多路复用器。
| 归档时间: |
|
| 查看次数: |
2546 次 |
| 最近记录: |