• 【HDLBits 刷题 6】Circuits(2)Sequential Logic---Latches and Filp Flops


    目录

     

    写在前面

    Latches and Filp Flops

    Dff

    Dff8

    Dff8r

    Dff8p

    Dff8ar

    Dff16e

    D Latch

    DFF1

    DFF2

    DFF gate

    Mux and DFF1

    Mux and DFF2

    DFFs and gates

    creat circuit

    Edgedetect

    Edgedetect2

    Edgecapture

    Dualedge

    总结


     

    写在前面

    本篇博客对 Circuits 部分的组合逻辑前两节做答案和部分解析,一些比较简单的题目就直接给出答案,有些难度再稍作讲解,每道题的答案不一定唯一,可以有多种解决方案,欢迎共同讨论。

    Latches and Filp Flops

    Dff

    创建单个 D 触发器

    1. module top_module (
    2. input clk,
    3. input d,
    4. output reg q
    5. );
    6. always @(posedge clk) begin
    7. q <= d;
    8. end
    9. endmodule

    Dff8

    创建8位D触发器 

    1. module top_module (
    2. input clk,
    3. input [7:0] d,
    4. output [7:0] q
    5. );
    6. always @(posedge clk) begin
    7. q <= d;
    8. end
    9. endmodule

    Dff8r

    创建具有主动高同步复位功能的 8 D 触发器。所有 DFF 都应由 clk 的正边缘触发。 

    1. module top_module (
    2. input clk,
    3. input reset,
    4. input [7:0] d,
    5. output [7:0] q
    6. );
    7. always @(posedge clk) begin
    8. if (reset) begin
    9. q <= 'd0;
    10. end
    11. else begin
    12. q <= d;
    13. end
    14. end
    15. endmodule

    Dff8p

    创建具有主动高同步复位功能的 8 D 触发器。触发器必须重置为0x34而不是零。所有 DFF 都应由 clk 的负边沿触发。 

    1. module top_module (
    2. input clk,
    3. input reset,
    4. input [7:0] d,
    5. output [7:0] q
    6. );
    7. always @(negedge clk) begin
    8. if (reset) begin
    9. q <= 8'h34;
    10. end
    11. else begin
    12. q <= d;
    13. end
    14. end
    15. endmodule

    Dff8ar

    创建具有有源高异步复位功能的 8 D 触发器。所有 DFF 都应由 clk 的正边缘触发。

    1. module top_module (
    2. input clk,
    3. input areset,
    4. input [7:0] d,
    5. output [7:0] q
    6. );
    7. always @(posedge clk or posedge areset) begin
    8. if (areset) begin
    9. q <= 'd0;
    10. end
    11. else begin
    12. q <= d;
    13. end
    14. end
    15. endmodule

    Dff16e

    创建 16 D 触发器。有时,仅修改一组触发器的一部分是很有用的。字节使能输入控制在该周期内是否应写入 16 个寄存器中的每个字节。byteena[1] 控制上字节 d[15:8],而 byteena[0] 控制下字节 d[7:0]。复位是同步、低电平有效复位。所有 DFF 都应由 clk 的正边缘触发。

    1. module top_module (
    2. input clk,
    3. input resetn,
    4. input [1:0] byteena,
    5. input [15:0] d,
    6. output [15:0] q
    7. );
    8. always @(posedge clk) begin
    9. if (!resetn) begin
    10. q <= 'd0;
    11. end
    12. else if (byteena==2'b11) begin
    13. q <= d;
    14. end
    15. else if (byteena==2'b10) begin
    16. q[15:8] <= d[15:8];
    17. end
    18. else if (byteena==2'b01) begin
    19. q[7:0] <= d[7:0];
    20. end
    21. end
    22. endmodule

    D Latch

    创建锁存器

    1. module top_module (
    2. input d,
    3. input ena,
    4. output q
    5. );
    6. always @(*) begin
    7. if (ena) begin
    8. q = d;
    9. end
    10. end
    11. endmodule

    DFF1

    异步复位

    1. module top_module (
    2. input clk,
    3. input d,
    4. input ar,
    5. output q
    6. );
    7. always @(posedge clk or posedge ar) begin
    8. if (ar) begin
    9. q <= 'd0;
    10. end
    11. else begin
    12. q <= d;
    13. end
    14. end
    15. endmodule

    DFF2

    同步复位

    1. module top_module (
    2. input clk,
    3. input d,
    4. input r,
    5. output q
    6. );
    7. always @(posedge clk) begin
    8. if (r) begin
    9. q <= 'd0;
    10. end
    11. else begin
    12. q <= d;
    13. end
    14. end
    15. endmodule

    DFF gate

    根据电路图实现 Verilog 逻辑

    0a9ba296814b46ec8ef1d9810c645dfe.png

    1. module top_module (
    2. input clk,
    3. input in,
    4. output out
    5. );
    6. wire a;
    7. assign a = in ^ out;
    8. always @(posedge clk) begin
    9. out <= a;
    10. end
    11. endmodule

    Mux and DFF1

    假设要为此电路实现分层 Verilog 代码,使用子模块的三个实例化,该子模块中包含触发器和多路复用器。为此子模块编写一个名为 top_module 的 Verilog 模块(包含一个触发器和多路复用器)。

    485ed2c99c88474c842a583cd09338dc.png

    1. module top_module (
    2. input clk,
    3. input L,
    4. input r_in,
    5. input q_in,
    6. output reg Q
    7. );
    8. wire D;
    9. assign D = L?r_in:q_in;
    10. always @(posedge clk) begin
    11. Q <= D;
    12. end
    13. endmodule

    Mux and DFF2

    为该电路的一级编写一个名为top_module的Verilog模块,包括触发器和多路复用器。

    14637b5cae6248b5a6f66f445c13abd4.png

    1. module top_module (
    2. input clk,
    3. input w, R, E, L,
    4. output Q
    5. );
    6. wire C,D;
    7. assign C = E?w:Q;
    8. assign D = L?R:C;
    9. always @(posedge clk) begin
    10. Q <= D;
    11. end
    12. endmodule

    DFFs and gates

    给定如图所示的有限状态机电路,假设D触发器在机器开始之前最初复位为零。

    d35f46c42977405bbba64e1733bf23d8.png

    1. module top_module (
    2. input clk,
    3. input x,
    4. output z
    5. );
    6. reg Q1,Q2,Q3;
    7. wire D1,D2,D3;
    8. assign D1 = x ^ Q1;
    9. assign D2 = x & (~Q2);
    10. assign D3 = x | (~Q3);
    11. always @(posedge clk) begin
    12. Q1 <= D1;
    13. end
    14. always @(posedge clk) begin
    15. Q2 <= D2;
    16. end
    17. always @(posedge clk) begin
    18. Q3 <= D3;
    19. end
    20. assign z = ~(Q1 | Q2 | Q3);
    21. endmodule

    creat circuit

    实现 JK 触发器,真值表如下:

    fb56d3311ce14c9da53d8ca4c88915e1.png

    1. module top_module (
    2. input clk,
    3. input j,
    4. input k,
    5. output Q
    6. );
    7. always @(posedge clk) begin
    8. if (~j & ~k) begin
    9. Q <= Q;
    10. end
    11. else if (~j & k) begin
    12. Q <= 'd0;
    13. end
    14. else if (j & ~k) begin
    15. Q <= 'd1;
    16. end
    17. else if (j & k) begin
    18. Q <= ~Q;
    19. end
    20. end
    21. endmodule

    Edgedetect

    上升沿检测:对输入信号打一拍,打一拍的信号取反与原信号相与就可以检测出上升沿
    上升沿检测:对输入信号打一拍,打一拍的信号与原信号取反相与就可以检测出上升沿

    1ee3ec52693e41dea440f5a6018b6ebc.png 

    1. module top_module (
    2. input clk,
    3. input [7:0] in,
    4. output [7:0] pedge
    5. );
    6. reg [7:0] in_reg;
    7. always @(posedge clk) begin
    8. in_reg <= in;
    9. end
    10. always @(posedge clk) begin
    11. pedge <= in & (~in_reg);
    12. end
    13. endmodule

    Edgedetect2

    对于 8 位矢量中的每个位,检测输入信号何时从一个时钟周期变为下一个时钟周期(检测任何边沿)。输出位应在0到1转换发生后设置周期。

    e06bc84f4f134b3a8c791a881ce7f491.png

    1. module top_module (
    2. input clk,
    3. input [7:0] in,
    4. output [7:0] anyedge
    5. );
    6. reg [7:0] in_reg;
    7. always @(posedge clk) begin
    8. in_reg <= in;
    9. end
    10. always @(posedge clk) begin
    11. anyedge <= in ^ in_reg;
    12. end
    13. endmodule

    Edgecapture

    对于 32 位矢量中的每个位,当输入信号在一个时钟周期内从 1 变为下一个时钟周期中的 0 时进行捕获。“捕获”意味着输出将保持1,直到寄存器复位(同步复位)。每个输出位的行为类似于SR触发器:输出位应设置为(至1)1,转换发生1至0后的周期。当复位为高电平时,输出位应在正时钟边沿复位(至0)。如果上述两个事件同时发生,则重置优先。在下面示例波形的最后4个周期中,“复位”事件发生比“set”事件早一个周期,因此这里没有冲突。

    9fad9e7f868848d38f39c140ff45cbfd.png

    1. module top_module (
    2. input clk,
    3. input reset,
    4. input [31:0] in,
    5. output [31:0] out
    6. );
    7. reg [31:0] in_reg;
    8. always @(posedge clk) begin
    9. in_reg <= in;
    10. end
    11. always @(posedge clk) begin
    12. if (reset) begin
    13. out <= 'd0;
    14. end
    15. else begin
    16. out <= ~in & in_reg | out;
    17. end
    18. end
    19. endmodule

    Dualedge

    熟悉在时钟的上升沿或时钟的下降沿触发的。双边沿触发触发器在时钟的两个边沿触发。但是,FPGA没有双边触发触发器,并且@(posedge clk or negedge clk)是不能够被综合的。构建一个在功能上表现得像双边沿触发触发器的电路:

    4ba4d52a90854acb8802c75a65511a78.png

     以下提供两种方法:

    1. module top_module (
    2. input clk,
    3. input d,
    4. output q
    5. );
    6. reg d1,d2;
    7. always @(posedge clk) begin
    8. d1 <= d;
    9. end
    10. always @(negedge clk) begin
    11. d2 <= d;
    12. end
    13. assign q = clk?d1:d2;
    14. endmodule
    15. //second
    16. module top_module (
    17. input clk,
    18. input d,
    19. output q
    20. );
    21. reg q1,q2;
    22. always @(posedge clk) begin
    23. q1 <= d ^ q2;
    24. end
    25. always @(negedge clk) begin
    26. q2 <= d ^ q1;
    27. end
    28. assign q = q1 ^ q2;
    29. endmodule

    总结

    这部分的内容比较简单,主要就是学习了创建触发器和锁存器,以及在实际设计中常用的边沿检测。

     

  • 相关阅读:
    web前端学习笔记二
    2023.11.22使用flask做一个简单的图片浏览器
    pyqt5 学习笔记三 (窗口设置)
    Flink系列文档-(YY11)-watermark工作机制
    redis6.0引入多线程
    SL3037内置MOS管 耐压60V降压恒压芯片 降12V或降24V 电路简单
    leetcode1221. 分割平衡字符串
    【6k字】详解Python装饰器和生成器
    使用matlab辨识工具来估算震动系统的传递函数
    shell编程增强
  • 原文地址:https://blog.csdn.net/m0_61298445/article/details/126213267