【问题标题】:Converting this schematic to verilog code, compile unsuccessful将此原理图转换为verilog代码,编译不成功
【发布时间】:2018-07-17 10:13:58
【问题描述】:

以下是完整代码。 我只想将下面的示意图实现到 Verilog 代码中。只是有点困惑,我是否可以将组合逻辑和时序逻辑写在一个总是阻塞或不阻塞的地方。 其次,敏感列表需要记录脉冲和输入变化。这是一个手工解决的解决方案,但现在我想将它带入 Verilog 并在 Verilog 中实现它并查看输出。

module Q4a(
input x,
 input clock,
output z
);
reg z; 
reg y1,y2;
reg d1,d2;
//wire x;
//wire clock;

always @(x,y1,y2)
begin
d1=(~x)&y2;
d2=x;
z=x&y1; 
end

always @(clock)
begin 
//y1<=(~x)&y2;
//y2<=x;
//z<=x&y1;
y1<=d1;
y2<=d2;

end
endmodule

【问题讨论】:

    标签: verilog sequential


    【解决方案1】:

    x和z在Verilog中有特殊的含义,变量名最好用别的东西。

    module Q4a(
     input x,
     input clock,
     output reg z //Just declare as reg here
    );
    
    reg y1,y2;
    reg d1,d2;
    
    // Use automatic sensitivity list
    always @* begin
      d1=(~x)&y2;
      d2=x;
      z=x&y1; 
    end
    
    //Filp-flops use `posedge` to make edge sensitive
    always @(posedge clock) begin 
      y1<=d1;
      y2<=d2;
    end
    
    endmodule
    

    这会在 EDA Playground 上的 vcs 中编译。 但要审查我会写成:

    module Q4a(
     input      x,
     input      clock,
     output reg z
    );
    
    reg y1,y2;
    
    always @* begin
      z = x & y1; 
    end
    
    always @(posedge clock) begin 
      y1 <= ~x & y2;
      y2 <= x;
    end
    
    endmodule
    

    【讨论】:

    • 有必要不使用z和x还是你的建议(推荐)?
    • @摩根。谢谢你。两者在 Xilinx ISE 工具版本 14.2(64 位版本)中合成为相同的原理图。我将在原始帖子上更新生成的示意图。
    • @PrakashDarji 您可以使用 x 和 z 作为变量名,但我发现这非常令人困惑,即 a = xa = 'x 现在的含义截然不同。
    【解决方案2】:

    always begin ... end不必一直使用,可以直接用assign语句写组合电路。

    见以下代码:

    module Q4a (
                 input wire x,
                 input wire clock,
                 input wire rst_n,
                 output wire z
            );
    
    wire d1;
    reg  y1;
    reg  y2;
    
    assign d1 = ~x & y2;
    assign z  =  x & y1;
    
    always @ (posedge clock or negedge rst_n)
    begin
      if(rst_n) begin
        y1 <= 1'b0;
        y2 <= 1'b0;
      end else begin
        y1 <= d1;
        y2 <= x;  // x is d2 too.
      end
    end
    
    endmodule
    

    或者你也可以这样做,

    assign z  =  x & y1;
    
    always @ (posedge clock or negedge rst_n)
    begin
      if(rst_n) begin
        y1 <= 1'b0;
        y2 <= 1'b0;
      end else begin
        y1 <= ~x & y2;
        y2 <= x;  // x is d2 too.
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多