HDLBits练习(十一)Circuits_Sequential Logic_Latches and Flip-Flops(2)

DFF+gate

要求:实现下图电路。

module top_module (
    input clk,
    input in, 
    output out);

    wire d;
    
    assign d = in ^ out;
    
    always@(posedge clk)
        out <= d;
        
endmodule

Mux and DFF (Mt2015 muxdff)

要求:考虑下面的时序电路,其中使用了具有触发器和选择器的子模块的三个实例化,为该子模块编写Verilog代码(包含一个触发器和一个选择器)

module top_module (
	input clk,
	input L,
	input r_in,
	input q_in,
	output reg Q);

    always@(posedge clk)
        if(L == 1'b1)
            Q <= r_in;
        else
            Q <= q_in;

endmodule

 Mux and DFF (Exams/2014 q4a)

要求:为下图电路的子模块编写Verilog代码(包含触发器和选择器)

module top_module (
    input clk,
    input w, R, E, L,
    output Q
);
    wire mux_out;
    
    assign mux_out = E ? w : Q;
    
    always@(posedge clk)
        if(L == 1'b1)
            Q <= R;
        else
            Q <= mux_out;

endmodule

DFFs and gates

要求:描述如下的电路,假设D触发器在开始之前初始复位为零。

module top_module (
    input clk,
    input x,
    output z
); 

    reg q1,q2,q3;
    wire d1,d2,d3;

    assign d1 = q1 ^ x;
    assign d2 = ~q2 & x;
    assign d3 = ~q3 | x;
    assign z = ~(q1 | q2 | q3);
    
    always@(posedge clk)
        begin
            q1 <= d1;
            q2 <= d2;
            q3 <= d3;
        end

endmodule

 Creat circuit from truth table

要求:根据下图真值表实现JK触发器。

module top_module (
    input clk,
    input j,
    input k,
    output Q); 

    always@(posedge clk)
        begin
            case({j,k})
                2'b00 : Q <= Q;
                2'b01 : Q <= 1'b0;
                2'b10 : Q <= 1'b1;
                2'b11 : Q <= ~Q;
            endcase
        end
        
endmodule

 Edgedetect

要求:对于 8 位向量中的每一位,检测输入信号何时从一个时钟周期的 0 变为下一个时钟周期的 1(类似于上升沿检测)。下面的波形图为in[1] 和 pedge[1] 的示意。

分析:

检测上升沿,即检测信号从0到1的变化;

对输入信号in打一拍得到in_reg,那么上升沿对应的位置应该是in为1且in_reg为0的地方。

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] pedge
);
    reg  [7:0] reg_in;
    
    always@(posedge clk)
        reg_in <= in;
    
    integer i;
    always@(posedge clk)
        for(i = 0; i <= 7; i = i + 1)
            begin
                pedge[i] = in[i] & ~reg_in[i];   
            end

endmodule

 Detect both edges(Edgedetect2)

要求:对于 8 位向量中的每一位,检测输入信号何时从一个时钟周期变为下一个时钟周期(检测任何边沿)。 下面的波形图为in[1] 和 anyedge[1] 的示意。

 分析:

检测上升沿和下降沿,即检测信号从0到1或从1到0的变化;

对输入信号in打一拍得到in_reg,那么边沿对应的位置应该是in和in_reg对应的值不一样的位置。

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] anyedge
);
    
    reg [7:0] reg_in;
    
    always@(posedge clk)
        reg_in <= in;
        
    integer i;
    always@(posedge clk)
        for(i = 0; i <= 7; i = i + 1)
            begin
                anyedge[i] = in[i] ^ reg_in[i];   
            end
            
endmodule

Edgecapture

要求:对于 32 位向量中的每一位,在输入信号从一个时钟周期的 1 变为下一个时钟周期的 0 时进行捕捉。“捕获”表示输出将保持为 1,直到寄存器复位(同步复位)。

每个输出位的行为类似于 SR 触发器:输出位应在 1 到 0 转换发生后的周期设置(为 1)。当复位为高电平时,输出位应在正时钟沿复位(为 0)。如果上述两个事件同时发生,则复位优先。

分析:

在输入信号从一个时钟周期的 1 变为下一个时钟周期的 0 时进行捕捉,即捕获下降沿,捕获后保持输出为1,直到复位信号有效;

对输入信号in打一拍得到in_reg,那么下降沿对应的位置应该是in为0且in_reg为1的地方。

module top_module (
    input clk,
    input reset,
    input [31:0] in,
    output [31:0] out
);

    reg [31:0] reg_in;
    always@(posedge clk)
        reg_in <= in;
        
    always@(posedge clk)
        if(reset == 1'b1)
            out <= 32'd0;
        else
            out <= (~in & reg_in) | out;   
            
endmodule


Dualedge

要求:构建一个功能类似于双边沿触发器的电路,FPGA中没有双边沿触发器,并且不接受always @(posedge clk or negedge clk)作为敏感列表。

 分析:

先分别构建上升沿触发和下降沿触发电路,上升沿到来后clk为高电平,下降沿到来后clk为低电平,通过clk选择输出为上升沿或下降沿,可实现双边沿触发电路。

module top_module (
    input clk,
    input d,
    output q
);

    reg q1,q2;
    
    always@(posedge clk)
        q1 <= d;
    
    always@(negedge clk)
        q2 <= d;
        
    assign q = clk ? q1 : q2;

endmodule

总结:本小节是一些基础的时序电路,其中边沿检测电路在实际工程中会经常需要用到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值