HDLBits刷题Day16(D flip-flop~DFFs and gates)

3.2.1 Latches and Flip-Flops
3.2.1.1 D flip-flop
问题陈述:

AD触发器是一种存储位并定期更新的电路,在时钟信号的(通常)上升沿。
当使用时钟控制的always 块时,逻辑合成器会创建 D 触发器AD触发器是“组合逻辑块后接触发器”的最简单形式,其中组合逻辑部分只是一条线。
创建一个 D 触发器。
在这里插入图片描述

Verilog代码:

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//

    always@(posedge clk)
        begin
            q<=d;
        end
endmodule

3.2.1.2 D flip-flop
问题陈述:

创建 8 个 D 触发器。所有 DFF 都应由clk的上升沿触发。

Verilog代码:

module top_module (
    input clk,
    input [7:0] d,
    output [7:0] q
);
    integer i;
    always@(posedge clk)
        begin 
            for (i=0;i<=7;i++)
                q[i]<=d[i];
        end
endmodule

3.2.2.3 DFF with reset
问题陈述:

创建 8 个具有高电平有效同步复位的 D 触发器。所有 DFF 都应由clk的上升沿触发。

verilog代码:

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk)
        begin 
            if(!reset)
                q<=d;
            else
            q<=8'b0;
        end
endmodule

3.2.2.4 DFF with reset value
问题陈述:

创建 8 个具有高电平有效同步复位的 D 触发器。触发器必须重置为 0x34 而不是零。所有 DFF 都应由clk的下降沿触发。

Verilog代码:

module top_module (
    input clk,
    input reset,
    input [7:0] d,
    output [7:0] q
);
    always @(negedge clk)begin
        if(reset)
            q=8'h34;
        else
            q<=d;
    end

endmodule

3.2.2.5 DFF with asynchronous reset
问题陈述:

创建 8 个具有高电平有效异步复位的 D 触发器。所有 DFF 都应由clk的上升沿触发。

Verilog代码:

module top_module (
    input clk,
    input areset,   // active high asynchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk or posedge areset)
        begin
            if(areset)
                q<=8'b0;
            else
                q<=d;
        end
endmodule

3.2.2.6 DFF with byte enable
问题陈述:

创建 16 个 D 触发器。有时只修改一组触发器的一部分很有用。字节使能输入控制 16 个寄存器中的每个字节是否应在该周期写入。byteena[1]控制高字节d[15:8],而byteena[0]控制低字节d[7:0]。

resetn是一个同步的低电平有效复位。

所有 DFF 都应由clk的上升沿触发。

Verilog代码:

module top_module (
    input clk,
    input resetn,
    input [1:0] byteena,
    input [15:0] d,
    output [15:0] q
);
    always@(posedge clk)
        begin
            if(!resetn)
                q<=16'b0;
            else
                begin
                if(byteena[0])
                    q[7:0]<=d[7:0];
            	if(byteena[1])
                q[15:8]<=d[15:8];
                end
        end
endmodule

3.2.2.7 D Latch
问题陈述:

实现以下电路:
在这里插入图片描述
请注意,这是一个锁存器,因此预计会出现关于已推断锁存器的 Quartus 警告。

Verilog代码:

module top_module (
    input d, 
    input ena,
    output q);
    always @(*) begin
        if(ena)
            q<=d;
    end
endmodule

3.2.2.8 DFF
问题陈述:

实现以下电路:在这里插入图片描述

Verilog代码:

module top_module (
    input clk,
    input d, 
    input ar,   // asynchronous reset
    output q);
    always@(posedge clk or posedge ar)
        begin 
            if(ar)
                q<=1'b0;
            else
                q<=d;
        end
endmodule

3.2.2.9 DFF
问题陈述:

实现以下电路:

请添加图片描述

Verilog代码:

module top_module (
    input clk,
    input d, 
    input r,   // synchronous reset
    output q);
    always @(posedge clk )
        begin
            if(!r)
                q<=d;
            else
                q<=1'b0;
        end
endmodule

3.2.2.10 DFF+gate
问题陈述:

实现以下电路:

在这里插入图片描述

Verilog代码:

module top_module (
    input clk,
    input in, 
    output out);
    always@(posedge clk)
        begin
            out<=in^out;
        end
    
endmodule

3.2.2.11 Mux and DFF
问题陈述:

考虑下面的时序电路:

在这里插入图片描述
假设您要为此电路实现分层 Verilog 代码,使用其中具有触发器和多路复用器的子模块的三个实例化。为此子模块编写一个名为top_module的 Verilog 模块(包含一个触发器和多路复用器)。

Verilog代码:

module top_module (
	input clk,
	input L,
	input r_in,
	input q_in,
	output reg Q);
	wire D;
    assign D=L? r_in:q_in;
    always @(posedge clk)
        begin
            Q<=D;
        end
endmodule

3.2.2.12 Mux and DFF
问题陈述:

考虑如下所示 的n位移位寄存器电路:
在这里插入图片描述
为该电路的一个阶段编写一个名为 top_module 的 Verilog 模块,包括触发器和多路复用器。

Verilog代码:

module top_module (
    input clk,
    input w, R, E, L,
    output Q
);
    wire o1,D;
    assign o1=E? w:Q;
    assign D=L?R:o1;
    always@(posedge clk)
        begin
            Q<=D;
        end
endmodule

3.2.2.13 DFFs and gates
问题陈述:

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

建立这个电路。
在这里插入图片描述

Verilog代码:

> module top_module (
    input clk,
    input x,
    output z
); 
    wire D1,D2,D3,Q1,Q2,Q3;
    assign D1=x^Q1;
    assign D2=x&~Q2;
    assign D3=x|~Q3;
    assign z=~(Q1|Q2|Q3);
    always@(posedge clk)
		begin
            Q1<=D1;
            Q2<=D2;
            Q3<=D3;
        end
endmodule
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值