描述
题目描述:
用 system verilog实现两个串联的异步复位的T触发器的逻辑,结构如图:
信号示意图:
波形示意图:
输入描述:
输入信号 data, clk, rst
类型 logic
在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:
输出信号 q
类型 logic
解答:
问题分析:
1)异步复位
同步复位就是指复位信号只有在时钟上升沿到来时,才能有效
代码示例
always_ff @(posedge clk) begin
if (!rst) begin
dout<=1'b0;
end else begin
dout<=din;
end
end
异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位
代码示例
always_ff @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
dout <= 1’b0;
end else begin
dout <= din;
end
end
2)T触发器
输入为1时,输出进行反转,输入为0时,输出保持。
3)代码分析
根据T触发器的原理,相当于将此刻输入值与上一个时钟的输入值进行异或。
4)代码如下
`timescale 1ns/1ns
module Tff_2 (
input logic data, clk, rst,
output logic q
);
//*************code***********//
logic data_1;
always_ff @ (posedge clk or negedge rst) begin
if (!rst) begin
data_1 <= 1'b0;
q <= 'b0;
end else begin
data_1 <= data ^ data_1 ;
q <= data_1 ^ q;
end
end
endmodule
5)测试代码
`timescale 1ns/1ns
module testbench();
logic clk=0;
always #5 clk = ~clk; // Create clock with period=10
// A testbench
logic data =0;
logic rst=0;
initial begin
data = 0;
rst = 0;
#5
rst =1;
#25
data =1;
#25
data =0;
#25
data =1;
end
Tff_2 u1_Tff_2(
.data(data),
.clk (clk),
.rst (rst),
.q (q)
);
endmodule
测试结果
运行时间:0ms
运行内存:0kb