• 牛客刷题<二>异步复位的串联T触发器


    题目:异步复位的串联T触发器_牛客题霸_牛客网

    分析:T触发器的特点,输入T为1时,输出翻转;输入T为0时,输出保持,另外还要注意是异步复位。两个这种触发器串联起来,第一个的输出作为第二个的输入。

    解法一:使用异或运算,相同为0,不同为1

    1. `timescale 1ns/1ns
    2. module Tff_2 (
    3. input wire data, clk, rst,
    4. output reg q
    5. );
    6. //*************code***********//
    7. reg data_1;
    8. always@(posedge clk or negedge rst)
    9. begin
    10. if(rst == 1'b0)
    11. data_1 <= 1'b0;
    12. else
    13. data_1 <= data ^ data_1;
    14. end
    15. always@(posedge clk or negedge rst)
    16. begin
    17. if(rst == 1'b0)
    18. q <= 1'b0;
    19. else
    20. q <= data_1 ^ q;
    21. end
    22. //*************code***********//
    23. endmodule

    解法二:

    1. `timescale 1ns/1ns
    2. module Tff_2 (
    3. input wire data, clk, rst,
    4. output reg q
    5. );
    6. //*************code***********//
    7. reg data_1;
    8. always@(posedge clk or negedge rst)begin
    9. if(!rst)begin
    10. data_1 <= 1'b0;
    11. q <= 1'b0;
    12. end
    13. else begin
    14. data_1 <= data ^ data_1;
    15. q <= data_1 ^ q;
    16. end
    17. end
    18. //*************code***********//
    19. endmodule

    解法三:此方法使用了三态运算符

    1. `timescale 1ns/1ns
    2. module Tff_2 (
    3. input wire data, clk, rst,
    4. output reg q
    5. );
    6. reg reg1;
    7. always @(posedge clk or negedge rst) begin
    8. if(!rst) begin
    9. reg1 <= 0 ;
    10. q <= 0 ;
    11. end
    12. else begin
    13. reg1 <=data? ~reg1 : reg1 ;
    14. q <=reg1? ~q : q ;
    15. end
    16. end
    17. endmodule

    解法四:

    1. `timescale 1ns/1ns
    2. module Tff_2
    3. (
    4. input wire clk,rst,data,
    5. output reg q
    6. );
    7. reg data1;
    8. always@(posedge clk or negedge rst)
    9. begin
    10. if(!rst)
    11. data1 <= 1'b0;
    12. else if(data == 1'b1)
    13. data1 <= ~data1;
    14. else
    15. data1 <= data1;
    16. end
    17. always@(posedge clk or negedge rst)
    18. begin
    19. if(!rst)
    20. q <= 1'b0;
    21. else if(data1 == 1'b1)
    22. q <= ~q;
    23. else
    24. q <= q;
    25. end
    26. endmodule

    Testbench

    1. `timescale 1ns/1ns
    2. module testbench();
    3. reg clk=0;
    4. reg rst=0;
    5. //always #5 clk = ~clk; // Create clock with period=10
    6. reg data;
    7. wire q;
    8. // A testbench
    9. initial
    10. begin
    11. $dumpfile("out.vcd");
    12. $dumpvars(0, testbench);
    13. repeat(20)
    14. #2 clk = ~clk;
    15. end
    16. Tff_2 Tff_2_inst
    17. (
    18. .clk (clk),
    19. .rst (rst),
    20. .data (data),
    21. .q (q)
    22. );
    23. initial
    24. begin
    25. data = 0;
    26. #6
    27. rst = 1;
    28. data = 0;
    29. #6
    30. data =1;
    31. rst =1;
    32. #6
    33. data = 0;
    34. rst =1;
    35. #6
    36. data = 1;
    37. rst = 1;
    38. end
    39. endmodule

    注意:如果报错

    1. cannot be driven by primitives or continuous assignment
    2. Output port expression must support continuous assignment.

    那是因为reg不应连接到模块输出,改成wire就好

    verilog中repeat的用法和例子

    repeat循环语句执行指定循环次数,如果循环计数表达式的值不确定时,即为 x 或z 时,那么循环次数按 0 处理。repeat的语法是:

    repeat(循环次数表达式)begin

    语句块;

    end

    其中, “循环次数表达式”用于指定循环次数,可以是一个整数、变量或者数值表达式

    如果是变量或者数值表达式,其数值只在第一次循环时得到计算,从而得以事先确定循环次
    数; “语句块”为重复执行的循环体。

    在可综合设计中, “循环次数表达式”必须在程序编译过程中保持不变

  • 相关阅读:
    HCIA 访问控制列表ACL
    人大与加拿大女王大学金融硕士——与其羡慕他人,不如充实自己
    【护网急训2】帕鲁杯应急响应靶场
    fastjson2与fury的巅峰对决,谁会笑到最后?
    《羊了个羊》H5游戏开发挑战,3小时LAYA引擎制作核心玩法
    AzkabanExecutorServer自动注册分析
    区间修改,区间查询(线段树)
    CMake 将所有 Target 的工程在 Visual Studio 中加到同一个文件夹
    人工智能AI浪潮的掀起,打工人何去何从?
    二分查找的详解
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126340621