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

news/2024/10/14 17:42:19

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 @(*) begincase (sel)2'b00: q = d;       // 不延迟2'b01: q = q1;      // 延迟 1 个时钟周期2'b10: q = q2;      // 延迟 2 个时钟周期2'b11: q = q3;      // 延迟 3 个时钟周期default: q = 8'b0;  // 默认情况endcaseend
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),从而实现灵活的信号延迟控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

IntelliJ IDEA 2024激活码(亲测有效,仅供学习和交流)

资源是从官网购买,仅供学习和交流 激活码链接地址

任务类型和字段自定义,支撑个性化业务管理

一句话介绍 任务类型和任务字段自定义,面向企业内部不同业务部门,在管理各自任务的时候有不同信息管理差异的场景。企业根据自己的任务管理需求,自定义任务类型,配置不同的任务字段,解决差异化的任务管理场景。 应用场景某互联网企业,企业内部有研发部,有销售部 研发部通…

解决Scaffold-DbContext Build failed的问题

以前使用Entity Framework时,Visual Studio直接提供了相应的功能可以从数据库生成数据实体。现在升级到Entity Framework Core后,无法再使用Visual Studio来生成数据实体了,需要调用 Scaffold-DbContext 命令。先简单介绍一下如何使用Scaffold-DbContext为数据库生成实体类型…

Squid代理服务器搭建和简单使用

1 Squid的介绍 1.1 前言简介 代理服务器(Proxy Server)的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站,是个人网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。 [1] 代理服务器作为连接Internet与Intranet的…

win电脑快速关机的另类方法

1、在桌面上新建一个快捷方式 2、填写对应参数目标:%windir%\System32\SlideToShutDown.exe 起始位置:%windir%\System32 快捷键按自己喜好来,我这里输入:%windir%\System32 如下图所示:接下来按双击或者使用自己的快捷键就可以实现关机啦Love for Ever Day

CAP 8.3 版本发布通告

前言 我们很高兴宣布 CAP 发布 8.3 版本正式版,我们在这个版本中主要根据用户反馈添加了一些细节的功能增强特性,例如RabbitMQ对于Queue的配置控制选项和Kafka的额外失败消费者重试等,同时升级了依赖的NuGet包到最新版本。 下面,具体看一下我们新版本的功能吧。 总览 可能有…

参赛故事|我也想成为一名金蝶云苍穹开发布道师

金蝶云苍穹开发者大赛参赛有感!迷茫到突破 站在人生的十字路口,作为一名大三学生,我感受到了前所未有的压力。毕业的脚步越来越近,校园内的竞争愈发激烈,身边的同学早已通过奖学金、竞赛获奖等为自己的简历增光添彩。而我,望着自己那份平淡无奇的简历,不禁感到迷茫和焦虑…

UE-GAS CreateDefaultSubobjectUAbilitySystemComponent返回为nullptr

前因 原先在项目中用了默认的ASC(UAbilitySystemComponent),后面因为新的需求导致需要改为自己的ASC。结果改了之后,发现在Pre-Init(构造函数)时,CreateDefaultSubobject的返回值是nullptr。 过程 于是去论坛求助:论坛的人的回答是,你修改了ASC的类,导致前一个ASC反序…