首页 > 其他分享 >HDLBits 练习题:8位移位寄存器

HDLBits 练习题:8位移位寄存器

时间:2024-10-14 17:32:31浏览次数:7  
标签:练习题 q1 触发器 q2 周期 HDLBits 寄存器 延迟 时钟

HDLBits 练习题:8 位移位寄存器

原题

This exercise is an extension of module_shift. Instead of module ports being only single pins, we now have modules with vectors as ports, to which you will attach wire vectors instead of plain wires. Like everywhere else in Verilog, the vector length of the port does not have to match the wire connecting to it, but this will cause zero-padding or trucation of the vector. This exercise does not use connections with mismatched vector lengths.

You are given a module my_dff8 with two inputs and one output (that implements a set of 8 D flip-flops). Instantiate three of them, then chain them together to make a 8-bit wide shift register of length 3. In addition, create a 4-to-1 multiplexer (not provided) that chooses what to output depending on sel[1:0]: The value at the input d, after the first, after the second, or after the third D flip-flop. (Essentially, sel selects how many cycles to delay the input, from zero to three clock cycles.)

The module provided to you is: module my_dff8 ( input clk, input [7:0] d, output [7:0] q );

The multiplexer is not provided. One possible way to write one is inside an always block with a case statement inside.

Module_shift8

题目描述

这道练习题是对 module_shift 模块的扩展。在这次练习中,模块的端口不再只是单个引脚,而是包含向量的端口,因此需要将线网向量连接到这些模块的端口,而不是普通的线网。在 Verilog 中,端口的向量长度可以与连接的线网不匹配,但这会导致零填充或截断向量。不过,这道题不涉及长度不匹配的连接。

你将实现一个 my_dff8 模块,它有两个输入和一个输出(实现一组 8 个 D 触发器)。你的任务是实例化三个这样的 my_dff8 模块,并将它们串联在一起,以构建一个宽度为 8 位、长度为 3 的移位寄存器。此外,创建一个 4 到 1 的多路复用器(未提供),根据 sel[1:0] 选择输出:输入 d 的值、经过第一个、第二个或第三个 D 触发器后的值(即,sel 选择输入延迟的时钟周期数,从零到三个时钟周期)。

代码实现

下面是一个可能的实现结构:

module shift_register (
    input clk,
    input [7:0] d,
    input [1:0] sel,
    output [7:0] y
);
    wire [7:0] q1, q2, q3;

    // 实例化三个 D 触发器
    my_dff8 dff1 (.clk(clk), .d(d), .q(q1));
    my_dff8 dff2 (.clk(clk), .d(q1), .q(q2));
    my_dff8 dff3 (.clk(clk), .d(q2), .q(q3));

    // 多路复用器
    always @(*) begin
        case (sel)
            2'b00: q = d;       // 不延迟
            2'b01: q = q1;      // 延迟 1 个时钟周期
            2'b10: q = q2;      // 延迟 2 个时钟周期
            2'b11: q = q3;      // 延迟 3 个时钟周期
            default: q = 8'b0;  // 默认情况
        endcase
    end
endmodule

原理解析

串联多个 D 触发器可以实现不同的时钟周期延迟,主要是因为 D 触发器在每个时钟边沿(上升或下降沿)对输入信号进行采样,并在输出端保持这个值直到下一个时钟边沿。

串联多个 D 触发器可以实现不同的时钟周期延迟,主要是因为 D 触发器在每个时钟边沿(上升或下降沿)对输入信号进行采样,并在输出端保持这个值直到下一个时钟边沿。具体原因如下:

  1. D 触发器的工作原理

    • D 触发器会在时钟信号的上升沿(或下降沿)将输入数据 d 的当前值锁存到输出 q 中。在时钟信号的下一个上升沿,D 触发器会更新其输出,显示新的输入值。
    • 也就是说,D 触发器在每个时钟周期的边沿时刻对输入进行采样,而在下一个时钟周期之前,输出保持不变。
  2. 串联连接的延迟

    • 当将多个 D 触发器串联连接时,第一个触发器的输出 q1 成为第二个触发器的输入 d,第二个触发器的输出 q2 成为第三个触发器的输入,依此类推。
    • 这样,输入信号 d 经过第一个 D 触发器后,在下一个时钟周期内将更新 q1 的值。在再下一个时钟周期,q1 的值将被传递给第二个 D 触发器,并在接下来的时钟周期内更新 q2
    • 因此,输入信号 d 在经过三个触发器时,分别会在时钟周期 1、2 和 3 后出现在 q1q2q3 的输出上。

举例说明

假设在时钟信号的第 1 个周期时输入 d8'b00000001,那么:

  • 第一个周期(时钟上升沿):

    • q1 = d = 8'b00000001 (延迟 0 周期)
  • 第二个周期(时钟上升沿):

    • q2 = q1 = 8'b00000001 (延迟 1 周期)
  • 第三个周期(时钟上升沿):

    • q3 = q2 = 8'b00000001 (延迟 2 周期)
  • 第四个周期(时钟上升沿):

    • 如果此时 d 变为 8'b00000010,那么:
      • q1 = 8'b00000010 (延迟 1 周期)
      • q2 = q1 = 8'b00000001 (延迟 2 周期)
      • q3 = q2 = 8'b00000001 (延迟 3 周期)

通过这种方式,我们可以利用串联的 D 触发器来控制信号的延迟,选择在 sel 控制下的输出值(即 dq1q2q3),从而实现灵活的信号延迟控制。

标签:练习题,q1,触发器,q2,周期,HDLBits,寄存器,延迟,时钟
From: https://www.cnblogs.com/LilMonsterOvO/p/18464666

相关文章

  • 刷c语言练习题8(牛客网)
    1、如果有inta=5,b=3,在执行!a&&b++;后a和b的值分别是()A、5,3B、0,1C、0,3D、5,4答案:A解析:按照优先级顺序,先计算!a,得到0。由短路法则,b++不进行计算,又!a并没有改变a的值,所以a和b的值分别是5,3,选择选项A。2、以下程序的输出结果是()1234567main(){     ......
  • 【汇编语言】第三章----寄存器(内存访问)(一)—— 内存中字的存储
    文章目录前言1.内存中字的存储2.问题3.问题分析与解答4.结论结语前言......
  • 【STM32开发之寄存器版】(十)-数模转换DAC
    一、前言本次DEMO目标:本文将使用STM32F103ZET6的DAC1来输出电压,通过ADC1的通道1采集DAC输出电压信息(需要将开发板的ADCPA1和DACPA4短接起来),通过串口打印在上位机XCOM上。二、数模转换原理与基本概念2.1数模转换的基本概念数模转换器(DAC)将数字信号转换为模拟信号,广泛......
  • linux练习题(二)
    习题练习前预备知识(如下图):##linux练习题(二)习题以及参考答案1、将/etc/passwd拷贝到/home下并更名为test。cp/etc/passwd/home/test2、在/tmp下建立test1到test9父子级目录,mkdir-p/tmp/test1/test2/test3/test4/test5/test6/test7/test8/test9如果说该条命令不符......
  • ARM中一共有哪些寄存器
    ARM架构中的寄存器集合可能会因不同版本(ARMv4、ARMv5、ARMv6、ARMv7等)和实现(如Cortex系列)的不同而略有差异,但基本的寄存器集是相似的。以下是ARM处理器典型的寄存器:通用寄存器(General-PurposeRegisters,GPRs)R0-R12:用于数据处理和地址计算的通用寄存器。R13(SP):栈指......
  • X86架构下的寄存器和ARM架构下的寄存器有什么区别
    x86架构和ARM架构的寄存器在数量、类型和用途方面有显著的差异。以下是两者寄存器的基本对比:x86架构寄存器在x86架构中,原始的32位体系结构(如x86)提供了以下几类寄存器:通用寄存器:EAX,EBX,ECX,EDX-主要用于数据操作和运算。ESI,EDI-用于字符串和内存数组操作。EBP-......
  • 【STM32开发之寄存器版】(九)-模数转换ADC
    一、前言本次DEMO目标:本文将使用STM32F103ZET6的ADC1通道1来采样外部电压值,并使用串口在上位机XCOM上打印出电压值。二、模数转换原理与基本概念2.1ADC基本概念模数转换器(ADC,Analog-to-DigitalConverter)是一种将模拟信号转换为数字信号的电子器件。它的主要功能是将......
  • 【STM32开发之寄存器版】(八)-定时器的编码器接口模式
    一、前言1.1编码器接口原理编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号(称为A相和B相),通过这两路信号,定时器可以判断编码器的旋转方向,并计数转动的脉冲数。1.2本次DEMO目标本次DEMO将使用STM32F103ZET6的PA6(......
  • 【STM32开发之寄存器版】(七)-PWM脉冲宽度调制
    一、前言PWM简介PWM(脉宽调制)是一种通过调节信号的脉冲宽度来控制功率输出的技术。其基本原理是保持固定频率的信号,将其高电平和低电平的持续时间调整,达到控制平均功率的目的。应用方面,PWM广泛用于电机控制、LED调光、音频放大、以及电源管理等领域,因为它能有效提高能效并减......
  • 【编程小白必看】Python编程练习题元组操作秘籍一文全掌握
    【编程小白必看】Python编程练习题元组操作秘籍......