Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog:像always&;可综合_Verilog - Fatal编程技术网

Verilog:像always&;可综合

Verilog:像always&;可综合,verilog,Verilog,是否有其他功能,如始终(只有在敏感信号发生变化时才会运行,只要信号保持不变,就不会迭代)可以单独级联,或在始终中级联,但可以在Verilog中合成。虽然我认为Verilog中没有这样的结构,有一个简单的方法可以做到这一点。如果你对你想要敏感的信号进行边缘检测,你可以在你的always块中对其进行“如果”。例如: reg event_detected; reg [WIDTH-1:0] sensitive_last; always @ (posedge clk) begin if (sens

是否有其他功能,如
始终
(只有在敏感信号发生变化时才会运行,只要信号保持不变,就不会迭代)可以单独级联,或在
始终
中级联,但可以在Verilog中合成。

虽然我认为Verilog中没有这样的结构,有一个简单的方法可以做到这一点。如果你对你想要敏感的信号进行边缘检测,你可以在你的always块中对其进行“如果”。例如:

reg event_detected;
reg [WIDTH-1:0] sensitive_last;
always @ (posedge clk) begin
    if (sensitive_signal != sensitive_last) begin
        event_detected <= 1'b1;
    end else begin
        event_detected <= 1'b0;
    end
    sensitive_last <= sensitive_signal;
end

// Then, where you want to do things:
always @ (posedge clk) begin
    if (event_detected ) begin
        // Do things here
    end
end
检测到
reg事件;
reg[WIDTH-1:0]敏感\u last;
始终@(posedge clk)开始
如果(灵敏信号!=灵敏信号最后一次)开始

检测到的事件assign
语句最接近您可以得到的
always
<代码>分配只能用于连续分配。左侧赋值必须是
导线
;SystemVerilog还允许
逻辑

我更喜欢
始终
块而不是
分配
。我发现,当通常同时更新的信号组合在一起时,模拟可以提供更好的性能。我相信合成器中的优化器可以在
始终
的情况下做得更好,但这可能取决于所使用的合成器

对于同步逻辑,您需要一个
始终
块。读取always块中的硬件开关没有问题。fpga板可能已经为您解除输入反弹。如果没有,则在将输入与代码一起使用之前,通过两相管线发送输入。这有助于解决潜在的设置/保持问题

always @(posedge clk) begin
  pre_sync_human_in <= human_in;
  sync_human_in <= pre_sync_human_in;
end
always @* begin
  //...
  case( sync_human_in )
  0 : // do this
  1 : // do that
  // ...
  endcase
  //...
end
always @(posedge clk) begin
  //...
  if ( sync_human_in==0 )  begin /* do this */ end
  else begin /* else do */ end
  //...
end
始终@(posedge clk)开始

这将是非常好的,但我不知道有什么方法可以在Verilog中级联
始终
逻辑。如何合成它是显而易见的,但我不认为任何合成工具都能做到这一点。当我们想要一些具有人工(硬件开关)速度的输入,但想要用clk周期处理它们时,这是一个非常有用的逻辑。应该有一些类似的东西。如果您想检测@e19293001信号的边缘,您提供的代码(不是答案)很好且简单。塔克斯!顺便提一下你的名字等于无穷大。。。这就是问题所在??如果
sensitive\u信号
已经在
clk
时钟域中被触发,那么
event\u detected
应该是组合的
always@*event\u detected=(sensitive\u signal!=sensitive\u last)智能合成器会将其视为智能合成器。它可以保存一次触发器,但您仍然需要将所有位触发器设置为
敏感\u last
,除非可以应用编码/压缩。如果输入同步到时钟域,那么调试/合成/时序分析并没有那么糟糕。这是一个很好的组合调用。W.R.T.模拟和调试更加困难,我的意思是,如果
sensitive_last
是推断的,而不是显式的(正如问题似乎提出的那样),则没有方便的方法查看sim卡中的寄存器(因为它没有标识符)。“它只能用于异步组合逻辑”有任何同步组合逻辑吗?还是怎样“对于同步过程逻辑,您需要一个
始终
块”那么异步过程逻辑呢?不是很困惑@托德,我把措辞弄清楚了<代码>分配
是连续分配(异步)。我从来没有说过不能有异步过程逻辑。我说我更喜欢将组合逻辑分组到
始终
块中,甚至给出了示例。现在它更有意义了吗?当您添加“(async)”时,这会使它看起来有问题。你不把“连续赋值”限制在组合/组合逻辑的情况下吗?然而,异步逻辑是顺序逻辑的一个子类。因此,它应该是这样的:对于顺序逻辑,需要程序性Verilog(即
始终
块)。“
分配
只能用于连续分配”或者Verilog中的连续分配只使用
分配
。你也可以提到逻辑类型。你的代码很好!但很抱歉,这不是答案!!我对3个case状态做了同样的事情,看到了另一个更简单的代码,其中2个always@()块对@e19293001 thanx提供的1个信号做了同样的事情!
always @(posedge clk) begin
  case(state)
  // ...
  PRE_HUMAN_IN :
    begin
      // ...
     state <= WAIT_HUMAN__FOR_NOT_READY;
    end
  WAIT_HUMAN_FOR_NOT_READY :
    begin
      // ready bit is still high for the last input, wait for not ready
      if (sync_human_in[READ_BIT])
        state <= WAIT_HUMAN_FOR_NOT_READY; 
      else
        state <= WAIT_HUMAN_FOR_READY;
    end
  WAIT_HUMAN_FOR_READY :
    begin
      // ready bit is low, wait for it to go high before proceeding
      if (sync_human_in[READ_BIT])
        state <= WORK_WITH_HUMAN_INPUT; 
      else
        state <= WAIT_HUMAN_FOR_READY;
    end
  // ...
  endcase
end