Verilog设计与逻辑综合实例解析(含代码)(触发器&锁存器)

存储单元

在逻辑综合中可以推断出两种存储元素,即触发器和锁存器。 本节介绍这两个元素之间的实现和比较

1、不同类型触发器的RTL模板
从RTL中综合出的触发器或锁存器的类型取决于它们的代码风格。 以下是几个不同触发器和锁存器的RTL示例。 在触发器RTL中,posedge clk推断出正边沿触发器,negedge clk推断出负边沿触发器。

1.简单的D触发器

module dff(clk,d,q) ;
  input clk ,d ;
  output  q ;
  reg q ;
  always@(posedge clk ) begin
        q <= d ;
  end
endmodule

在SystemVerilog中,可以使用always\_ff代替always实现相同的代码,如下所示:

always_ff @(posedge clk) begin
        q<= d ;
end

2.异步置位触发器

正边沿触发,高电平有效异步置位

module asff(clk,d,set,q) ;
    input clk ,d,set ;
    ouput q ;
    reg q ;
    always@(posedge clk or posedge set) begin
        if(set) begin
            q <= 1’b1 ;
        end
        else begin
            q <= d ;
        end
    end
endmodule

3.异步复位触发器
正边沿触发,高电平有效异步复位

module arff(clk ,d,reset,q) begin
    input clk ,d,reset ;
    output q ;
    reg q ;
always@(posedge clk or posedge reset) begin
        if(reset) begin
            q <= 1’b0 ;
        end
        else begin
            q <= d ;
        end
end
endmodule

4.异步置位和复位触发器
正边沿触发,高电平有效的异步置位,复位

module arsff(clk,d,set,reset) ;
     input clk ,d,set,reset ;
     output q ;
    reg q ;
    always@(posedge clk or posedge set or posedge reset)         begin
            if(set) begin
                q <= 1’b1 ;
            end
 
            else if(reset) begin
                q <= 1’b0 ;
            end
            else begin
                q<= d ;
            end
end
endmodule

5、同步置位触发器
正边沿触发,高电平有效的同步置位

module ssff(clk , d,set,q) ;
    input clk ,d,set ;
    output q ;
    reg q ;
    always@(posedge clk ) begin
        if(set) begin
            q <= 1’b1 ;
        end
        else begin
            q <= d ;
        end
end
endmodule

6、同步复位触发器
正边沿触发,高电平有效的同步复位

module srff(
    input clk ,d,reset ;
    output q );
    reg q ;
    always@(posedge clk ) begin
        if(reset) begin
            q <= 1’b0 ;
        end
        else begin
            q <= d ;
        end
    end
endmodule

7、同步置位和复位触发器
正边沿触发,高电平有效的同步置位和复位

module ssrff(
    input clk ,
    input d ,
    input set ,
    input reset ,
    output q ) ;
    reg q ;
    always@(posedge clk) begin
        if(set) begin
            q <= 1’b1 ;
        end
        else if(reset) begin
            q <= 1’b0 ;
        end
        else begin
            q <= d ;
        end
endmodule

不同类型锁存器的RTL模板

1、 简单的D锁存器

module d1(sel ,d ,q) ;
    input sel ,d ;
    output q ;
    reg q ;
always@(*) begin
        if(sel) begin
                q <=d ;
        end // note the else is missing
end
endmodule

在systemverilog中可以用always\_latch代替always,无需指定敏感列表。

always_latch // no explicit sensitivity list
        If(sel) begin
            q <= d ;
        end

2. 异步置位锁存器

module asl (sel,d,set,q)  ;
      input sel ,d ,set;
      output q ;
        reg q ;
        always@(*) begin
           if(set) begin
              q = 1’b1 ;
            end
            else if(sel) begin
               q = d ;
            end
        end
endmodule

3、异步复位锁存器

module arl(sel,d,reset,q) ;
      input sel , d ,reset ;
      output q ;
      reg q ;
    always@(*) begin
           if(reset) begin
                  q = 1’b0 ;
            end
            else if(sel) begin
                  q = d ;
            end
    end
endmodule

4、异步复位置位锁存器

module asrl(sel ,d, set,reset,q) ;
    input sel ,d,set,reset ;
    output q ;
    reg q ;
    always@(*) begin
          if(reset) begin
              q = 1’b0 ;
            end
 
        else if(set) begin
              q = 1’b1 ;
        end
        else if(sel) begin
          q =d ;
        end
end
endmodule

以上所有示例都是一位存储元件。可以增加reg声明的位宽来增加触发器或锁存器的宽度。例如,

reg [3:0] out1;

这将创建4位触发器或锁存器。

触发器中异步或同步复位,哪一个更好?

异步复位:

1、复位信号不是数据路径中的一部分

2、复位能在任何时候发生

3、不建议由内部逻辑生成异步复位

示例:

always@(posedge clk or negedge reset) begin
       if(!reset) begin
       out1 <= 0 ;
        end
        else begin
           out1 <= in1 ;
        end
end

同步复位:
1、复位信号是数据路径的一部分

2、复位只能在时钟的有效边沿发生

3、可以由内部逻辑生成同步复位

示例:

always@(posedge clk ) begin
    if(!reset) begin
        out2 <= 0 ;
    end
    else begin
        out2 <= in2 ;
    end
end

推荐阅读

  • Verilog设计与逻辑综合实例解析(有限状态机)
  • Verilog设计与逻辑综合实例解析(最小化面积)
  • Verilog设计与逻辑综合实例解析(case&if-else)

想了解更多内容,欢迎关注芯片数字实验室专栏

发表评论

邮箱地址不会被公开。 必填项已用*标注