Т-триггер не даст результатов - PullRequest
0 голосов
/ 02 марта 2020

Я создал некоторый verilog-код и тестовый стенд для создания триггера T, но не могу заставить выходные данные изменить что-либо, кроме x. Я попытался сделать o / p как reg в модуле и тестовом стенде, а затем назначил tb reg для провода, но это не сработало. Не уверен, куда он вешает трубку.

Ниже представлен модуль триггера:

module Tflipflop(input T, S, R, En, clk, output reg Q, output Qn);

assign Qn = ~Q;

always@(posedge clk | R | S) begin
    if(R == 1'b1)
        Q <= 1'b0;
    else if (S ==1'b1)
        Q <= 1'b1;
    else if (En==1'b1) begin
        case(T)
            1'b1: Q <= ~Q;
            1'b0: Q <= Q;
        default: Q <= Q;
        endcase
    end
    else
        Q <= Q; 
end
endmodule

Ниже находится тестовый стенд:

`timescale 1ns/1ps

module Tflipflop_tb();

reg T, S, R, En, clk;
wire Qn, Q;

Tflipflop TFF_1(.T(T), .S(S), .R(R), .En(En), .clk(clk), .Q(Q), .Qn(Qn));

initial begin
clk = 0; T = 1; S = 0; R = 0; En = 1; #5;
clk = 1;                              #5;
clk = 0;                              #5;
clk = 1;                              #5;
clk = 0;                              #5;
clk = 0;                              #5;
clk = 1;                              #5;
clk = 0;                      En = 0; #5;         
clk = 1;                              #5;
clk = 0;                              #5;
clk = 1;                              #5;
end

endmodule

изображение симуляции в modelsim:

t_flip_flop simulation

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

У вас две проблемы внутри кода DUT и кода тестового стенда.

  • DUT: используйте оператор события or, а не побитовый логический оператор. Вам не нужен код, чувствительный к переднему фронту выражения (clk | R | S). См. эту ссылку для объяснения.
  • ТБ: Вам нужно установить R или S в 1, чтобы вывести флоп из неизвестного состояния.
1 голос
/ 02 марта 2020

Это потому, что начальное значение Q в Tflipflop по умолчанию равно x. Либо задайте ему другое начальное значение, подобное этому:

initial Q = 0;

Или используйте для ввода значения R или S.

...