专栏首页数字积木HDLBits:在线学习 Verilog (二十 · Problem 95 - 99)

HDLBits:在线学习 Verilog (二十 · Problem 95 - 99)

本系列内容来自于知乎专栏,链接如下:https://zhuanlan.zhihu.com/c_1131528588117385216 本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同学,都能从中有所收获。

Problem 95 Detect both edges

牛刀小试

在一个8bit的变量中,从一个周期到另一个周期期间,检测输入信号变化。即上升沿变化或下降沿变化。输出应在0变为1后产生。

如下图所示为输入与输出的时序关系

解答与解析

本题需要大家来检测信号上升沿或下降沿的变化。在Problem94中我们是用 & 来检测信号的上升沿,但在本题总我们可以采取 xor 的形式来检测。

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

    reg [7:0] in_temp;

    always @ (posedge clk)
        begin
            in_temp <= in;
            anyedge <= in ^ in_temp;
        end

endmodule

Problem 96 Edge capture register

牛刀小试

对于32bit中的每一个变量,我们需要捕获输入信号的上升沿。其中捕获的意思就是说在寄存器复位之前,输出一直保持为 ‘1’ 。

每一个输出bit类似SR触发器:输出信号从1变0发生时会保持一个周期。输出会在时钟上升沿和reset信号为高时复位。如果上述事件在同一时间发生,reset有更高的优先级。在下图所示的最后4个周期内,reset信号比set信号早一个周期,所以没有冲突发生。

解答与解析

本题就是需要我们在检测到输入信号的上升沿后,输出信号在复位之前保持为'1'。类似Problem94.

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

    //同理,我们先检测输入信号的上升沿。
    always @ (posedge clk)
        begin
           temp <= in;
        end
    //这里如果采用reg的话会出现时序错误。
    assign capture = ~in & temp;

    //检测到上升沿之后,来确定我们的输出
    always @ (posedge clk)
        begin
            if(reset)
                out <= 32'b0;
            else
                begin
                    for (int i=0; i<32; i=i+1)
                        begin
                            if(capture[i] == 1'b1)
                                out[i] <= 1'b1;
                        end
                end
        end

endmodule

Probelm 97 Dual-edge triggered flip-flop

我们现在对时钟上升沿与下降沿都已经很熟悉了。但是FPGA没有一个同时检测双边沿的触发器,而且always中的敏感列表也不支持(posedge clk or negedge clk)。

牛刀小试

设计一个双边沿检测的触发器,时序如下图所示:

在本题中主要考察的是电路设计,而非verilog代码的能力。

解答与解析

本题有两中解题思路,一种是用MUX,一种是用XOR

MUX代码如下:

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

    reg q1, q2;

    //这里来实现clk的上升沿与下降沿
    assign q = clk?q1:q2;

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

    always @ (negedge clk)
        begin
           q2 <= d;
        end

endmodule

XOR代码如下:

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

    reg p, n;

    // clk的上升沿
    always @(posedge clk)
        p <= d ^ n;

    // clk的下降沿
    always @(negedge clk)
        n <= d ^ p;

    //在上升沿时候,p=d^n, 则q=d^n^n=d;
    //在下降沿时候,n=d^p, 则q=p^d^p=d;
    //加载一个新值时会取消旧值。
    assign q = p ^ n;


    // 这样写是无法综合的
    /*always @(posedge clk, negedge clk) begin
        q <= d;
    end*/


endmodule

Problem 98 Four-bit binary counter

设计一个4bit的计数器,从0~15,共16个周期。reset是同步复位且复位为0。

解答与解析

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output reg [3:0] q);

    always @ (posedge clk)
        begin
            if(reset)
                q <= 4'b0000;
            else
                q <= q + 1'b1;
        end

endmodule

Problem 99 Decade counter

同样是4bit计数器,上一题是0~15, 本题我们只计算到0~9。还是同步复位且复位为0。时序图如下:

解答与解析

与上图不同就是限制条件不一样了而已。

module top_module (
    input clk,
    input reset,        // Synchronous active-high reset
    output [3:0] q);


    always @ (posedge clk)
        begin
            if(reset)
                q <= 4'b0000;
            else if(q <= 4'b1000)
                q <= q + 1'b1;
            else
                q <= 4'b0000;
        end 

endmodule

本文分享自微信公众号 - 数字积木(ggreat-top)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HDLBits:在线学习 Verilog (十二 · Problem 55 - 59)

    假设你正在设计一个电路来控制手机的振铃器和振动电机。当手机来电时(input ring),电路必须把震动( output motor = 1 )或响铃( out...

    数字积木
  • HDLBits:在线学习 Verilog (二十二 · Problem 105 - 109)

    用计数器设计一个带am/pm的12小时时钟。该计数器通过一个CLK进行计时,用ena使能信号来驱动时钟的递增。

    数字积木
  • HDLBits:在线学习 Verilog (二十一 · Problem 100 - 104)

    设计一个0~9的计数器,共10个周期。该计数器采用同步复位且复位为0。但是本题是希望该计数器并不是随着clk的变化而递增,而是随着一个slowena使能信号来控...

    数字积木
  • HDLBits:在线学习 Verilog (二十七 · Problem 130-134)

    前面Problem 125 Simple one-hot state transtion 3应该已经介绍过独热one-hot编码方式。这是一种生成逻辑最为简单的...

    数字积木
  • HDLBits:在线学习 Verilog (二十八 · Problem 135-139)

    Problem 135 PS/2 packet parser and datapath / Fsm ps2data

    数字积木
  • HDLBits:在线学习 Verilog (二十三 · Problem 110-114)

    相比于上一题 5-bit 线性移位寄存器,本题原理上相同,但作者希望我们结合实际的板子(DE1-SoC,可能是一个教学板)和其外部接口(KEY&LED),实现一...

    数字积木
  • HDLBits:在线学习 Verilog (二十四 · Problem 115-119)

    下表更详细地给出了跳变的规则,(可以视为状态转移表),元素下一个状态可以视作输出,输入为元素本身的状态与相应两个相邻元素的当前状态。

    数字积木
  • HDLBits:在线学习 Verilog (二十九 · Problem 140-144)

    Problem 140 Serial two's complementer (Mealy FSM)

    数字积木
  • HDLBits:在线学习 Verilog (十 · Problem 45 - 49)

    解析:如上图所示, 一个异或门,一个同或门,我声明一个wire型的temp来存放同或门的输出。

    数字积木
  • HDLBits:在线学习 Verilog (二 · Problem 10-14)

    什么是 Verilog 中的向量(vector)?向量是一组 wire 信号的集合,通过赋予这一组信号的集合一个名称,以便于访问其中的 wire 信号。

    数字积木
  • HDLBits:在线学习 Verilog (一 · Problem 0-9)

    本文是系列文章的第一篇,讨论下前十道习题和解答,HDLBits 共有约 180 题。Step one - HDLBits

    数字积木
  • HDLBits:在线学习 Verilog (十九 · Problem 90 - 94)

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

    数字积木
  • HDLBits:在线学习 Verilog (十六 · Problem 75 - 79)

    一个4输入a, b, c, d和一输出的逻辑电路,当输入为2, 7或15时,输出为1, 当输入为0, 1, 4, 5, 6, 9, 10, 13, 或 14 时...

    数字积木
  • HDLBits:在线学习 Verilog (十三 · Problem 60-64)

    Problem 60 : 2-to-1 multiplexer (Mux2to1)

    数字积木
  • HDLBits:在线学习 Verilog (十四 · Problem 65-69)

    本题中需要实现一个 2 进制 1bit 加法器,加法器将输入的两个 1bit 数相加,产生两数相加之和以及进位。

    数字积木
  • HDLBits:在线学习 Verilog (十五 · Problem 70 - 74)

    题目要求我们创建一个100bit的二进制的加法器,该电路共包含两个100bit的输入和一个cin, 输出产生sum和cout。

    数字积木
  • HDLBits:在线学习 Verilog (十一 · Problem 50 - 54)

    在前面的练习中,我们使用简单的逻辑门和多个逻辑门的组合。这些电路是组合电路的例子。组合意味着电路的输出只是其输入的函数(在数学意义上)。这意味着对于任何给定的输...

    数字积木
  • HDLBits:在线学习 Verilog (十七 · Problem 80-84)

    接下来的题目是属于触发器,锁存器的专题。我们会从用 Verilog 实现基础 D 触发器开始,学习触发器这一数字电路中最重要的电路之一。

    数字积木
  • HDLBits:在线学习 Verilog (十八 · Problem 85-89)

    Problem 85 : DFF with byte enable(Dff16e)

    数字积木

扫码关注云+社区

领取腾讯云代金券