VL2-异步复位的串联T触发器

一、 题目描述

用verilog实现两个串联的异步复位的T触发器的逻辑,结构如图:
信号示意图:
VL2-异步复位的串联T触发器_第1张图片

波形示意图:
VL2-异步复位的串联T触发器_第2张图片

输入描述:
输入信号 data, clk, rst; 类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:
输出信号 q ;类型 reg

二、实现思路

1、异步复位和同步复位
同步复位就是指复位信号只有在时钟上升沿到来时,才能有效

always @(posedge clk)
    begin
//*************code***********//

//*************code***********//
end

异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位

always @(posedge clk or negedge rst_n)
begin
//*************code***********//

//*************code***********//
end

2、T触发器
真值表:1来翻转,0来保持

T Q n Q^n Qn Q n + 1 Q^{n+1} Qn+1 状态
0 0 0 保持
0 1 1 保持
1 0 1 翻转
1 1 0 翻转

T触发器波形图
VL2-异步复位的串联T触发器_第3张图片
3、时序逻辑电路用非阻塞赋值<=

三、代码展示

设置一个中间变量q_temp。
第一个T触发器中,输入data为1时,q_temp自身翻转;data为0时,q_temp自身保持不变。
第二个T触发器中,输入q_temp为1时,q自身翻转;q_temp为0时,q自身保持不变。

`timescale 1ns/1ns
module Tff_2 (
input wire data, clk, rst,
output reg q  
);
//*************code***********//
reg q_temp; //reg不声明默认一位

always @ (posedge clk or negedge rst)
begin
  if(!rst) begin
    q_temp<=1'b0;
  end
  else begin
    if(data)
      q_temp<=~q_temp;
    else
      q_temp<=q_temp;
  end
end
//第二个T触发器
always @ (posedge clk or negedge rst)
begin
  if(!rst) begin
    q<=1'b0;
  end
  else begin
    if(q_temp)
      q<=~q;
    else
      q<=q;
  end
end
//*************code***********//
endmodule

输出结果波形图:
在这里插入图片描述

你可能感兴趣的:(Verilog刷题,fpga开发)