我是靠谱客的博主 糊涂烤鸡,最近开发中收集的这篇文章主要介绍时序逻辑电路1.1 简介1.2 锁存器1.3 触发器1.4 寄存器1.5 计数器1.6 寄存器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

时序逻辑电路

  • 1.1 简介
  • 1.2 锁存器
    • 1.2.1 概念
    • 1.2.2 产生
  • 1.3 触发器
    • 1.3.1 概念
    • 1.3.2 分类
    • 1.3.2 两种触发方式
    • 1.3.3 程序设计与验证
  • 1.4 寄存器
    • 1.4.1 概念
    • 1.4.2 程序设计与验证
  • 1.5 计数器
    • 1.5.1 概念
    • 1.5.2 程序设计与验证
  • 1.6 寄存器
    • 1.6.1 概念
    • 1.6.2 程序设计与验证

1.1 简介

     时序逻辑由组合逻辑和存储逻辑构成,组合逻辑完成输入到输出的逻辑处理,
  处理的结果同时会进入存储逻辑里面存储下来,等到下一刻再和输入信号做逻辑
  处理,得到最终的处理结构。

时序逻辑示意图
时序逻辑示意图

      时序逻辑的存储电路一般由锁存器、触发器和寄存器构成。
      锁存器(latch)是电平出发的存储单元,数据存储的动作取决于输入时钟或者
   使能信号的电平值,即当锁存器处于使能状态时,输出才会随着数据输入发生变化。
      触发器(flipflop)是边沿敏感的存储单元,数据的存储动作由某一信号的上升
   或下降沿进行同步的。
      寄存器(register)是用来暂时存放参与运算的数据和运算结果。

由于触发器内有记忆功能,因此利用触发器可以方便地构成寄存器,一个触发器能够存储异味二进制码,所以把n个触发器的时钟端口连接起来就能构成一个存储n位二进制的寄存器。
从寄存数据的角度来讲,寄存器和锁存器的功能相同的,他们的主要区别是寄存器是同步时钟控制,而锁存器是电位信号控制。

1.2 锁存器

1.2.1 概念

     锁存器对脉冲电平敏感的存储单元电路,它只在输入脉冲的高电平(或低电平)
  期间对输入信号敏感并改变状态。在数字电路中可以记录二进制数字0和1。
     锁存器不锁存数据时,输出端的信号随输入信号变化,也被称为透明锁存器。
     分类:RS锁存器、门控RS锁存器、D锁存器
     注意:在绝大多数设计中我们要避免产生锁存器,最大的危害在于不能过滤毛刺
          和影响时序分析,所以只要能用触发器的地方就不用锁存器。

在这里插入图片描述
由上图可知,锁存器没有时钟信号,只有数据输入和使能以及输出q端,没有时钟信号也就说明没有办法进行时序分析。

1.2.2 产生

在组合逻辑中,if 或者 case 语句不完整的描述,比如if 少了else分支,case少了default分支。
解决办法:if 必须带else分支,case必须带default分支。
注意:只有不带时钟的always语句的if 或case语句 不完整 才会 产生latch,带时钟的语句if 或case语句 不完整 不会 产生latch。

1.3 触发器

1.3.1 概念

   触发器对脉冲边沿敏感的存储单元电路,它只在触发脉冲的上升沿或下降沿
瞬间改变其状态。

1.3.2 分类

一般包括:RS触发器、JK触发器、D触发器、T 触发器、T’触发器
实际使用中,我们一般使用D触发器,下图为其逻辑符号:
在这里插入图片描述
有两个相同的D锁存器以及两个非门连接而成。

1.3.2 两种触发方式

在这里插入图片描述
与或非门是组合电路的核心,边沿触发是时序电路的核心。

1.3.3 程序设计与验证

下面展示 功能代码


`timescale 1ns / 1ps
//

// Verilog 功能代码如下:

module flipflop(
//input
input    sys_clk,
input    sys_rst_n,
input     data,
//output
output  reg y
    );
    
always @ (posedge sys_clk or negedge sys_rst_n) begin
           if (sys_rst_n == 1'b0)
               y <= 1'b0;
           else
               y <= data;
           end
endmodule







// Verilog 仿真代码如下:

 module tb_flipflop();

  reg    sys_clk;
  reg    sys_rst_n;
  reg    data;
  
  wire   y;
   
   
 initial    begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    data = 1'b0;
 
    #100
    sys_rst_n  = 1'b1;

    #100
    data = 1'b1;

    #100
    data = 1'b0;
 
    #100
    data = 1'b1;
    
    #100
    data = 1'b0;
    
   end 
    
always  #10  sys_clk  =  ~ sys_clk ;
   
flipflop  u_flipflop(
//input
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .data(data),
//output
    .y(y)
 );
    
endmodule

在这里插入图片描述

1.4 寄存器

1.4.1 概念

  寄存器是多个触发器构成的,因此可以存储多bit二进制数据。
  只有时钟上升沿,数据采用变化,其他时候数据保持锁存状态。

1.4.2 程序设计与验证

下面展示 功能代码


`timescale 1ns / 1ps

// Verilog 功能代码如下:

module register(
//input
input    sys_clk,
input    sys_rst_n,
input     data,
//output
output  wire y
    );
 
 reg  data_0;
 reg  data_1;
 reg  data_2;
 reg  data_3;
    
always @ (posedge sys_clk or negedge sys_rst_n) begin
           if (sys_rst_n == 1'b0)begin
               data_0 <= 1'b0;
               data_1 <= 1'b0;
               data_2 <= 1'b0;
               data_3 <= 1'b0;
               end
           else begin
               data_0 <= data;
               data_1 <= data_0;
               data_2 <= data_1;
               data_3 <= data_2;
               end
           end
 assign  y = data_3;
endmodule







// Verilog 仿真代码如下:

 module tb_register();

  reg    sys_clk;
  reg    sys_rst_n;
  reg    data;
  
  wire   y;
   
   
 initial    begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    data = 1'b0;
 
    #100
    sys_rst_n  = 1'b1;

    #100
    data = 1'b1;

    #100
    data = 1'b0;
 
    #100
    data = 1'b1;
    
    #100
    data = 1'b0;
    
   end 
    
always  #10  sys_clk  =  ~ sys_clk ;
   
register  u_register(
//input
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .data(data),
//output
    .y(y)
 );
    
endmodule

在这里插入图片描述

1.5 计数器

1.5.1 概念

     计数器由寄存器和加法器组成,使用计数器可以实现精确的计时、分频控制和各种
  协议的接口时序。

三位计数器电路图:
在这里插入图片描述

1.5.2 程序设计与验证

下面展示 功能代码


`timescale 1ns / 1ps
//

// Verilog 功能代码如下:

module flipflop(
//input
input    sys_clk,
input    sys_rst_n,
input     data,
//output
output  reg y
    );
    
always @ (posedge sys_clk or negedge sys_rst_n) begin
           if (sys_rst_n == 1'b0)
               y <= 1'b0;
           else
               y <= data;
           end
endmodule







// Verilog 仿真代码如下:

 module tb_flipflop();

  reg    sys_clk;
  reg    sys_rst_n;
  reg    data;
  
  wire   y;
   
   
 initial    begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    data = 1'b0;
 
    #100
    sys_rst_n  = 1'b1;

    #100
    data = 1'b1;

    #100
    data = 1'b0;
 
    #100
    data = 1'b1;
    
    #100
    data = 1'b0;
    
   end 
    
always  #10  sys_clk  =  ~ sys_clk ;
   
flipflop  u_flipflop(
//input
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .data(data),
//output
    .y(y)
 );
    
endmodule

在这里插入图片描述

1.6 寄存器

1.6.1 概念

  寄存器是多个触发器构成的,因此可以存储多bit二进制数据。
  只有时钟上升沿,数据采用变化,其他时候数据保持锁存状态。

1.6.2 程序设计与验证

下面展示 功能代码


`timescale 1ns / 1ps

// Verilog 功能代码如下:

module counter(
//input
input    sys_clk,
input    sys_rst_n,
//output
output  reg  [2:0] add
    );
  
always @ (posedge sys_clk or negedge sys_rst_n) begin
           if (sys_rst_n == 1'b0)begin
               add <= 1'b0;
               end
           else begin
               add <= add + 1'b1;
               end
           end

endmodule







// Verilog 仿真代码如下:

module tb_counter();
  reg    sys_clk;
  reg    sys_rst_n;
  
  wire [2:0]  add;
   
   
 initial    begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    #100
    sys_rst_n  = 1'b1; 
   end 
    
always  #10  sys_clk  =  ~ sys_clk ;
   
counter  u_counter(
//input
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
//output
    .add(add)
 );
    
endmodule

在这里插入图片描述

最后

以上就是糊涂烤鸡为你收集整理的时序逻辑电路1.1 简介1.2 锁存器1.3 触发器1.4 寄存器1.5 计数器1.6 寄存器的全部内容,希望文章能够帮你解决时序逻辑电路1.1 简介1.2 锁存器1.3 触发器1.4 寄存器1.5 计数器1.6 寄存器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部