当前位置: 首页 > article >正文

【HDLBits 刷题 13】Buliding Larger Circuits

目录写在前面Buliding Larger Circuitscount1kshiftcountfsm seqfsmshiftfsmfancytimerfsm onehot写在前面以下的解题方法不一定为最佳解决方案有更好的方法欢迎提出共同学习共同进步Buliding Larger Circuitscount1k构建一个计数从 0 到 999包括 0 和 999的计数器周期为 1000 个周期。复位输入是同步的应将计数器复位为0。module top_module ( input clk, input reset, output [9:0] q ); always (posedge clk) begin if (reset) begin q d0; end else if (qd999) begin q d0; end else begin q q d1; end end endmoduleshiftcount这是一系列五个练习中的第一个组件该练习从几个较小的电路中构建一个复杂的计数器。构建一个四位移位寄存器该寄存器也可用作向下计数器。当shift_ena为 1 时首先以最高有效位移位。当count_ena为1时移位寄存器中的当前数字将递减。由于整个系统不使用shift_ena和count_ena因此如果两个控制输入均为1则电路的作用无关紧要这主要意味着哪种情况获得更高的优先级并不重要。module top_module ( input clk, input shift_ena, input count_ena, input data, output [3:0] q ); always (posedge clk) begin if (shift_ena) begin q {q[2:0],data}; end else if (count_ena) begin q q - d1; end else begin q q; end end endmodulefsm seq这是一系列五个练习中的第二个组件该练习从几个较小的电路中构建一个复杂的计数器。构建一个在输入位流中搜索序列 1101 的有限状态机。找到序列后应将 start_shifting 设置为 1直到重置。陷入最终状态的目的是模拟在尚未实现的更大的FSM中进入其他状态。我们将在接下来的几个练习中扩展此 FSM。module top_module ( input clk, input reset, // Synchronous reset input data, output start_shifting ); //状态申明 parameter IDLE d1; parameter A_1 d2; parameter B_1 d3; parameter C_0 d4; parameter D_1 d5; //现态和次态 reg [2:0] state; reg [2:0] next_state; //状态机第一段状态初始化时序逻辑非阻塞赋值 always (posedge clk) begin if (reset) begin state IDLE; end else begin state next_state; end end //状态机第二段状态跳转阻塞赋值 always (*) begin next_state state; case(state) IDLE: begin if (data) begin next_state A_1; end else begin next_state IDLE; end end A_1: begin if (data) begin next_state B_1; end else begin next_state IDLE; end end B_1: begin if (~data) begin next_state C_0; end else begin next_state B_1; end end C_0: begin if (data) begin next_state D_1; end else begin next_state IDLE; end end D_1: begin next_state D_1; end default: begin next_state IDLE; end endcase end //状态机第三段结果输出组合逻辑 assign start_shifting (stateD_1); endmodulefsmshift这是一系列五个练习中的第三个组件该练习从几个较小的电路中构建一个复杂的计数器。作为用于控制移位寄存器的FSM的一部分我们希望能够在检测到正确的位模式时使移位寄存器精确4个时钟周期考虑前面的处理序列检测因此 FSM 的这一部分仅处理启用移位寄存器 4 个周期。每当FSM复位时置位shift_ena 4个周期然后永远为0直到复位。module top_module ( input clk, input reset, // Synchronous reset output shift_ena ); reg [1:0] cnt; always (posedge clk) begin if (reset) begin cnt d0; end else begin cnt cnt d1; end end always (posedge clk) begin if (reset) begin shift_ena d1; end else if (cntd3) begin shift_ena d0; end else begin shift_ena shift_ena; end end endmodulefsm这是一系列五个练习中的第四个组件该练习从几个较小的电路中构建一个复杂的计数器。想要创建一个计时器在检测到特定模式 1101 时启动再移位 4 位以确定延迟的持续时间等待计数器完成计数以及通知用户并等待用户确认计时器。在这个问题中只实现控制计时器的有限状态机。此处不包括数据路径计数器和某些比较器。串行数据在数据输入引脚上可用。当接收到模式1101时状态机必须断言输出shift_ena正好4个时钟周期。之后状态机断言其计数输出以指示它正在等待计数器并等待输入done_counting为高电平。此时状态机必须断言 done 以通知用户计时器已超时并等到输入 ack 为 1然后重置以查找下一个匹配的开始序列 1101。状态机应重置为开始搜索输入序列1101的状态。下面是预期输入和输出的示例。“x”状态可能读起来有点混乱。它们表明密克罗尼西亚联邦不应关心该周期中的特定输入信号。例如一旦检测到 1101 模式FSM 将不再查看数据输入直到完成其他所有操作后恢复搜索。module top_module ( input clk, input reset, // Synchronous reset input data, input ack, input done_counting, output shift_ena, output counting, output done ); //状态申明 parameter IDLE d1; parameter A_1 d2; parameter B_1 d3; parameter C_0 d4; parameter CNT_1 d5; parameter CNT_2 d6; parameter CNT_3 d7; parameter CNT_4 d8; parameter CNT d9; parameter WAIT d10; //现态和次态 reg [3:0] state; reg [3:0] next_state; //状态机第一段状态初始化时序逻辑非阻塞赋值 always (posedge clk) begin if (reset) begin state IDLE; end else begin state next_state; end end //状态机第二段状态跳转阻塞赋值 always (*) begin next_state state; case(state) IDLE: begin if (data) begin next_state A_1; end else begin next_state IDLE; end end A_1: begin if (data) begin next_state B_1; end else begin next_state IDLE; end end B_1: begin if (~data) begin next_state C_0; end else begin next_state B_1; end end C_0: begin if (data) begin next_state CNT_1; end else begin next_state IDLE; end end CNT_1: begin next_state CNT_2; end CNT_2: begin next_state CNT_3; end CNT_3: begin next_state CNT_4; end CNT_4: begin next_state CNT; end CNT: begin if (done_counting) begin next_state WAIT; end else begin next_state CNT; end end WAIT: begin if (ack) begin next_state IDLE; end else begin next_state WAIT; end end default: begin next_state IDLE; end endcase end //状态机第三段结果输出组合逻辑 assign shift_ena (stateCNT_1) | (stateCNT_2) | (stateCNT_3) | (stateCNT_4); assign counting stateCNT; assign done stateWAIT; endmodulefancytimer这是一系列五个练习中的第五个组件该练习从几个较小的电路中构建一个复杂的计数器。想要创建一个具有一个输入的计时器当检测到特定输入模式 1101 时启动再移位 4 位以确定延迟的持续时间等待计数器完成计数以及通知用户并等待用户确认计时器。串行数据在数据输入引脚上可用。当接收到码型1101时电路必须在接下来的4位中移位最高有效位在先。这 4 位决定了定时器延迟的持续时间。我把它称为延迟[30]。之后状态机断言其计数输出以指示它正在计数。状态机必须精确计数延迟[30] 1* 1000个时钟周期。例如delay0 表示计数 1000 个周期delay5 表示计数 6000 个周期。同时输出当前剩余时间。这应该等于延迟 1000 个周期然后延迟-1 表示 1000 个周期依此类推直到 0 表示 1000 个周期。当电路不计数时计数[30]输出是“不在乎”任何值都方便你实现。此时电路必须断言完成以通知用户计时器已超时并等到输入ack为1然后重置以查找下一个出现的开始序列1101。电路应复位到开始搜索输入序列1101的状态。下面是预期输入和输出的示例。“x”状态可能读起来有点混乱。它们表明密克罗尼西亚联邦不应关心该周期中的特定输入信号。例如一旦读取了1101和延迟[30]电路就不再查看数据输入直到完成其他所有操作后恢复搜索。在本例中电路计数为 2000 个时钟周期因为延迟 [30] 值为 4b0001。最后几个周期以延迟[30] 4b1110开始另一个计数这将计数15000个周期。module top_module ( input clk, input reset, // Synchronous reset input data, input ack, output [3:0] count, output counting, output done ); //状态申明 parameter IDLE d1; parameter A_1 d2; parameter B_1 d3; parameter C_0 d4; parameter SHIFT_1 d5; parameter SHIFT_2 d6; parameter SHIFT_3 d7; parameter SHIFT_4 d8; parameter CNT d9; parameter WAIT d10; //现态和次态 reg [3:0] state; reg [3:0] next_state; reg [3:0] delay; reg [15:0] delay_cnt; reg [3:0] delay_num; wire delay_cnt_done; //当计数到设定的计数值时将延时计数完成标志信号拉高 assign delay_cnt_done (delay_cnt ((delay d1) * d1000))?d1:d0; //状态机第一段状态初始化时序逻辑非阻塞赋值 always (posedge clk) begin if (reset) begin state IDLE; end else begin state next_state; end end //状态机第二段状态跳转阻塞赋值 always (*) begin next_state state; case(state) IDLE: begin if (data) begin next_state A_1; end else begin next_state IDLE; end end A_1: begin if (data) begin next_state B_1; end else begin next_state IDLE; end end B_1: begin if (~data) begin next_state C_0; end else begin next_state B_1; end end C_0: begin if (data) begin next_state SHIFT_1; end else begin next_state IDLE; end end SHIFT_1: begin next_state SHIFT_2; delay[3] data; end SHIFT_2: begin next_state SHIFT_3; delay[2] data; end SHIFT_3: begin next_state SHIFT_4; delay[1] data; end SHIFT_4: begin next_state CNT; delay[0] data; end CNT: begin if (delay_cnt_done) begin next_state WAIT; end else begin next_state CNT; end end WAIT: begin if (ack) begin next_state IDLE; end else begin next_state WAIT; end end default: begin next_state IDLE; end endcase end //delay_cnt always (posedge clk) begin if (reset) begin delay_cnt d0; end else if (next_state WAIT) begin delay_cnt d0; end else if (next_state CNT) begin delay_cnt delay_cnt d1; end else begin delay_cnt delay_cnt; end end //对于延时计数的范围值确定具体的count值 always (*) begin if (delay_cnt d1000) begin delay_num d0; end else if (delay_cnt d1000 delay_cnt d2000) begin delay_num d1; end else if (delay_cnt d2000 delay_cnt d3000) begin delay_num d2; end else if (delay_cnt d3000 delay_cnt d4000) begin delay_num d3; end else if (delay_cnt d4000 delay_cnt d5000) begin delay_num d4; end else if (delay_cnt d5000 delay_cnt d6000) begin delay_num d5; end else if (delay_cnt d6000 delay_cnt d7000) begin delay_num d6; end else if (delay_cnt d7000 delay_cnt d8000) begin delay_num d7; end else if (delay_cnt d8000 delay_cnt d9000) begin delay_num d8; end else if (delay_cnt d9000 delay_cnt d10000) begin delay_num d9; end else if (delay_cnt d10000 delay_cnt d11000) begin delay_num d10; end else if (delay_cnt d11000 delay_cnt d12000) begin delay_num d11; end else if (delay_cnt d12000 delay_cnt d13000) begin delay_num d12; end else if (delay_cnt d13000 delay_cnt d14000) begin delay_num d13; end else if (delay_cnt d14000 delay_cnt d15000) begin delay_num d14; end else if (delay_cnt d15000 delay_cnt d16000) begin delay_num d15; end else begin delay_num d0; end end //状态机第三段结果输出组合逻辑 assign count (state CNT)?(delay - delay_num):d0; assign counting (state CNT); assign done (state WAIT); endmodulefsm onehot假设使用以下单热编码则通过检查派生下一状态逻辑方程和输出逻辑方程SS1S11S110B0B1B2B3计数等待 10b000000000110b0000000001010b00000000100...10b10000000000module top_module( input d, input done_counting, input ack, input [9:0] state, // 10-bit one-hot current state output B3_next, output S_next, output S1_next, output Count_next, output Wait_next, output done, output counting, output shift_ena ); parameter S0, S11, S112, S1103, B04, B15, B26, B37, Count8, Wait9; assign B3_next (state[B2]); assign S_next (state[S] ~d) | (state[S1] ~d) | (state[S110] ~d) | (state[Wait] ack); assign S1_next (state[S] d); assign Count_next (state[B3] | (state[Count] ~done_counting)); assign Wait_next (state[Count] done_counting) | (state[Wait] ~ack); assign done state[Wait]; assign counting state[Count]; assign shift_ena (state[B0] | state[B1] | state[B2] | state[B3]); endmodule

相关文章:

【HDLBits 刷题 13】Buliding Larger Circuits

目录 写在前面 Buliding Larger Circuits count1k shiftcount fsm seq fsmshift fsm fancytimer fsm onehot 写在前面 以下的解题方法不一定为最佳解决方案,有更好的方法欢迎提出,共同学习,共同进步! Buliding Larger …...

无符号类型给有符号类型赋值符号位的问题

记一次bug问题分析问题 再写modbus通信协议解析的时候遇到一个问题,计算CRC的时候返回值是一个unsigned short,接受的时候我定义的结构体里的CRC是一个有符号 short,也是头一次遇到有无符号位的问题。下面我把具体代码贴出来。 if(pModbusWr…...

【HDLBits 刷题 9】Circuits(5)Finite State Manchines 1-9

目录 写在前面 Finite State Manchines Fsm1 Fsm1s Fsm2 Fsm2s Fsm3comb Fsm3onehot Fsm3 Fsm3s Design a Moore FSM 写在前面 HDLBits 刷题来到了最为重要的一部分---有限状态机,都说 Verilog 设计的精髓就是状态机的设计,可见状态机设计的重…...

【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分

目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 60060Hz,分别显示三种颜色。 实验环境 开发环境:vivado 2021.2 FPGA 器件&a…...

【接口协议】FPGA 驱动 VGA 显示实验(一)原理部分

目录 VGA介绍 VGA 接口管脚 VGA 色彩原理 VGA 工作原理 VGA 时序 VGA介绍 VGA(Video Graphics Array)视频图形阵列是 IBM 于 1987 年提出的一个使用模拟信号的电脑显示标准。VGA 接口即电脑采用 VGA 标准输出数据的专用接口。VGA 接口共有 15 针&am…...

COMSOL单相变压器温度场三维模型:解析热点温度与流体流速分布

comsol单相变压器温度场三维模型,可以得到变压器热点温度,流体流速分布 搞变压器温度场仿真最头疼的就是三维流固耦合。去年做配电变压器温升项目时,硬是跟COMSOL死磕了两周才摸到门道。今天给大家分享下怎么用非等温流接口抓取热点温度和油…...

【牛客网刷题】VL3 奇偶校验

👉 写在前面 👉 本系列博客记录牛客网刷题记录 👉 日拱一卒,功不唐捐! 目录 题目描述 奇偶校验 题目分析 仿真结果 题目描述 现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果(1输出奇校验&a…...

【牛客网刷题】VL2 异步复位的串联T触发器

👉 写在前面 👉 本系列博客记录牛客网刷题记录 👉 日拱一卒,功不唐捐! 目录 题目描述 题目分析 Verilog 代码 testbench 代码 仿真结果 题目描述 用verilog实现两个串联的异步复位的T触发器的逻辑&#x…...

minio安装 后台自启动

1:下载miniowget https://dl.min.io/server/minio/release/linux-amd64/minio2:授权chmod x minio3:设置开机自启动进入该目录下cd /etc/systemd/system/ 创建minio.service文件1: cd /etc/systemd/system/ 2:touch mi…...

【BBF系列协议】Data Models Library数据模型库设计与实现

目录Data Models Library (dmlib)dmlib的设计dmlib 的代码结构:dmlib 主要数据结构操作上下文对象(dmctx)对象定义(DMOBJ)参数定义(DMLEAF)多实例遍历函数实现(browseinstobj)参数树…...

基于JS实现的鸿蒙游戏——二十四点纸牌

目录 前言 概述 正式开始 一、创建项目 二、编码 1.项目结构 2.实现思路 3.主要代码块 三、页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩过纸牌游戏,本项目是基于JS实现的鸿蒙小游戏二十四点纸牌&…...

vue截取字符串(商城系统非常常用的小知识)

1.截取指定字符串{{row.real_name.substr(2, 3)}}2.截取字符串最后一位{{row.real_name.charAt(row.real_name.length - 1)}}3.看一下效果如何...

【BBF系列协议】TR-140 TR-069支持存储服务的设备的数据模型

目录TR-140 TR-069支持存储服务的设备的数据模型执行摘要1.目的和范围目的范围2 案例2.1 BASIC MANAGED STORAGE SERVICE(基本托管存储服务)2.2 REMOTE STORAGE BACK-UP SERVICE(远程存储备份服务)2.3 Remote access of Storage S…...

【BBF系列协议】TR-135 支持TR-069的STB的数据模型

TR-135 支持TR-069的STB的数据模型 执行摘要 TR-135,启用TR-069的STB的数据模型,定义了用于通过TR-069和TR-106中定义的CWMP远程管理机顶盒(STB)设备上的数字电视(IPTV或广播)功能的数据模型。它包括用于…...

【BBF系列协议】TR-106 CWMP端点和USP代理的数据模型模板

目录TR-106 CWMP端点和USP代理的数据模型模板执行摘要1 介绍CWMPUSP规范结构2 架构2.1 数据层次结构2.2 对象版本控制2.3 配置文件2.4 DEPRECATED 和 OBSOLETED 条目3 对象定义3.1 通用符号3.2 数据类型和表示3.3 供应商特定要素A参数:单个实例对象:单个命令:单个事…...

【亲测免费】【推荐】基于Vue3的全能H5模板:vue3-h5-template

标题:【推荐】基于Vue3的全能H5模板:vue3-h5-template 【免费下载链接】vue3-h5-template My starter template for Vue3, with vite, quark design, sass(含viewport 适配方案, axios 封装) 项目地址: https://gitcode.com/gh_mirrors/vue3/vue3-h5-t…...

Scalding执行模型揭秘:从Job到Execution的演进之路

Scalding执行模型揭秘:从Job到Execution的演进之路 【免费下载链接】scalding A Scala API for Cascading 项目地址: https://gitcode.com/gh_mirrors/sc/scalding Scalding是一个基于Scala的Cascading API,专为大规模数据处理而设计。这个强大的…...

探索DockerGS:一键启动动漫游戏服务器的利器

探索DockerGS:一键启动动漫游戏服务器的利器 【免费下载链接】DockerGS DockerGC is a container that run Grasscutter (anime game) with just a single command. 项目地址: https://gitcode.com/gh_mirrors/do/DockerGS 在数字娱乐的世界中,各…...

推荐项目:IdentityServer4.AccessTokenValidation - 混合型JWT和参考令牌验证利器

推荐项目:IdentityServer4.AccessTokenValidation - 混合型JWT和参考令牌验证利器 【免费下载链接】IdentityServer4.AccessTokenValidation IdentityServer Access Token Validation for ASP.NET Core 项目地址: https://gitcode.com/gh_mirrors/id/IdentityServ…...

推荐:用Flowershow打造你的优雅知识分享网站

推荐:用Flowershow打造你的优雅知识分享网站 【免费下载链接】flowershow 💐 Publish your obsidian digital garden or any markdown site easily and elegantly. 项目地址: https://gitcode.com/gh_mirrors/fl/flowershow 1、项目介绍 &#x…...

RITM 交互式分割项目使用教程

RITM 交互式分割项目使用教程 【免费下载链接】ritm_interactive_segmentation 项目地址: https://gitcode.com/gh_mirrors/rit/ritm_interactive_segmentation 1. 项目的目录结构及介绍 RITM 交互式分割项目的目录结构如下: ritm_interactive_segmentati…...

RITM交互式分割算法实战指南

RITM交互式分割算法实战指南 【免费下载链接】ritm_interactive_segmentation 项目地址: https://gitcode.com/gh_mirrors/rit/ritm_interactive_segmentation 项目介绍 RITM(Real-Time Interactive Image Segmentation with Memory-Augmented U-Net&#…...

从论文到代码:Performer核心公式的PyTorch逐行实现

从论文到代码:Performer核心公式的PyTorch逐行实现 【免费下载链接】performer-pytorch An implementation of Performer, a linear attention-based transformer, in Pytorch 项目地址: https://gitcode.com/gh_mirrors/pe/performer-pytorch Performer是一…...

Jupyter Notify 使用教程

Jupyter Notify 使用教程 【免费下载链接】jupyter-notify A Jupyter Notebook magic for browser notifications of cell completion 项目地址: https://gitcode.com/gh_mirrors/ju/jupyter-notify 项目介绍 Jupyter Notify 是一个为 Jupyter Notebook 设计的扩展&…...

react-shimmer自定义加载效果:打造属于你的独特加载动画

react-shimmer自定义加载效果:打造属于你的独特加载动画 【免费下载链接】react-shimmer 🌠 Async loading, performant Image component for React.js 项目地址: https://gitcode.com/gh_mirrors/re/react-shimmer react-shimmer是一个为React.j…...

diffvg底层原理揭秘:可微光栅化技术如何让矢量图形支持梯度下降优化

diffvg底层原理揭秘:可微光栅化技术如何让矢量图形支持梯度下降优化 【免费下载链接】diffvg Differentiable Vector Graphics Rasterization 项目地址: https://gitcode.com/gh_mirrors/di/diffvg diffvg是一个创新的开源项目,它实现了可微矢量图…...

系统颜色选择器:macOS 的色彩控制强化版

系统颜色选择器:macOS 的色彩控制强化版 【免费下载链接】System-Color-Picker 🎨 The macOS color picker as an app with more features 项目地址: https://gitcode.com/gh_mirrors/sy/System-Color-Picker 项目介绍 🎨 系统颜色选…...

微型Lisp开源项目指南

微型Lisp开源项目指南 【免费下载链接】micro-lisp 🎄A very small Lisp programming language 😀that used to be under 200 lines of C🎄 项目地址: https://gitcode.com/gh_mirrors/mi/micro-lisp 项目介绍 🌟 微型Lis…...

RLS历史回顾:Rust IDE工具链的演进之路

RLS历史回顾:Rust IDE工具链的演进之路 【免费下载链接】rls Repository for the Rust Language Server (aka RLS) 项目地址: https://gitcode.com/gh_mirrors/rl/rls 作为Rust语言的官方IDE工具链,RLS(Rust Language Server&#xff…...

开源项目《Aviator》安装与使用指南

开源项目《Aviator》安装与使用指南 【免费下载链接】aviator Level up your Aviator game! This app employs its prediction prowess to help you maximize your profit - and its completely free! 项目地址: https://gitcode.com/gh_mirrors/avia/aviator 本指南旨在…...