LJgibbs · 2020年10月16日

HDLBits:在线学习 Verilog (十九 · Problem 90 - 94)

转载自:知乎

首先附上传送门

Mt2015 muxdff - HDLBits

Problem 90 Mux and DFF

牛刀小试

考虑下图所示的时序电路问题:

我们用3个包含触发器和多路选择器的子模块来实现图中电路。题目要求我们写出包含一个触发器和一个多路选择器的子模块。

答案与解析

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

    wire temp;

    assign temp = L ? r_in : q_in;  //2 to 1 选择器

    always @ (posedge clk ) //触发器
        begin
           Q <= temp; 
        end

endmodule

Problem 91 Mux and DFF

牛刀小试

考虑一个 n-bit 移位寄存器。

如上图所示,我们还是实现包含选择器和触发器的部分。

答案与解析

module top_module (
    input clk,
    input w, R, E, L,
    output Q
);

    wire temp1, temp2;

    assign temp1 = E ? w:Q; 
    assign temp2 = L ? R:temp1;
    //与上题类似,不做赘述

    always @ (posedge clk)
        begin
           Q <= temp2; 
        end

endmodule

Problem 92 DFFS and gates

牛刀小试

如下图所示的状态机,假设D触发器在状态机启动之前初始化为0,实现该电路:

答案与解析

本题为门电路与触发器的结合,上图包含三个触发器、异或门、与门和或门。只需要注意后两个触发器输出是取反即可。

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

    reg q1 = 0;
    reg q2 = 0;
    reg q3 = 0;

    always @ (posedge clk)
        begin
            q1 <= x ^ q1; 
        end

    always @ (posedge clk)
        begin
            q2 <= x & (~q2);
        end

    always @ (posedge clk)
        begin
            q3 <= x | (~q3);
        end

    assign z = ~(q1 | q2 | q3); 

endmodule

Problem 93 Create circuit from truth table

牛刀小试

JK触发器的真值表如下图所示,仅使用D触发器和门电路来实现该JK触发器。其中Qold是D触发器在时钟上升沿之前的输出。

答案与解析

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

Problem 94 Detect an Edge

牛刀小试

对于每个8bit的变量,检测这些信号什么时候从0变为1(类似检测上升沿),输出应该在0到1 变化之后才有值。

下图给我们展示了输入in[1]和输出pedge[1]的时序关系图:

解答与解析: 边沿检测的特性就是两边电平发生了变化,无非是0变1上升沿,1变0下降沿。

(具体可参考)

https://blog.csdn.net/qq\_31799983/article/details/81544707​blog.csdn.net

具体的设计可以采用一个寄存器Q来存储上一个时钟沿的输入值D,当寄存器输出Q与输入D的值分别为1、0时,则检测到下降沿。

如图:

这就像本题代码, D就是in, Q就是temp。

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] pedge
);

    reg [7:0] temp;

    always @ (posedge clk)
        begin
            temp <= in; //temp始终比in晚一个周期
            pedge <= ~temp & in; //当输出为1时检测到上升沿
            //本题刚好与所示时序图相反,其中Q就相当于temp, D就相当于in,检测下降沿是对in取反就好。
        end

endmodule

推荐阅读

关注此系列,请关注专栏FPGA的逻辑
推荐阅读
关注数
10614
内容数
577
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息