Verilog 状态机 示例

状态机设计:3 段式(推荐)

状态机设计如下:
(0) 首先,根据状态机的个数确定状态机编码。利用编码给状态寄存器赋值,代码可读性更好。
(1) 状态机第一段,时序逻辑,非阻塞赋值,传递寄存器的状态。
(2) 状态机第二段,组合逻辑,阻塞赋值,根据当前状态和当前输入,确定下一个状态机的状态。
(3) 状态机第三代,时序逻辑,非阻塞赋值,因为是 Mealy 型状态机,根据当前状态和当前输入,确定输出信号。

// vending-machine
// 2 yuan for a bottle of drink
// only 2 coins supported: 5 jiao and 1 yuan
// finish the function of selling and changingmodule  vending_machine_p3  (input           clk ,input           rstn ,input [1:0]     coin ,     //01 for 0.5 jiao, 10 for 1 yuanoutput [1:0]    change ,output          sell    //output the drink);//machine state decodeparameter            IDLE   = 3'd0 ;parameter            GET05  = 3'd1 ;parameter            GET10  = 3'd2 ;parameter            GET15  = 3'd3 ;//machine variablereg [2:0]            st_next ;reg [2:0]            st_cur ;//(1) state transferalways @(posedge clk or negedge rstn) beginif (!rstn) beginst_cur      <= 'b0 ;endelse beginst_cur      <= st_next ;endend//(2) state switch, using block assignment for combination-logic//all case items need to be displayed completely    always @(*) begin //st_next = st_cur ;//如果条件选项考虑不全,可以赋初值消除latchcase(st_cur)IDLE:case (coin)2'b01:     st_next = GET05 ;2'b10:     st_next = GET10 ;default:   st_next = IDLE ;endcaseGET05:case (coin)2'b01:     st_next = GET10 ;2'b10:     st_next = GET15 ;default:   st_next = GET05 ;endcaseGET10:case (coin)2'b01:     st_next = GET15 ;2'b10:     st_next = IDLE ;default:   st_next = GET10 ;endcaseGET15:case (coin)2'b01,2'b10:st_next = IDLE ;default:   st_next = GET15 ;endcasedefault:    st_next = IDLE ;endcaseend//(3) output logic, using non-block assignmentreg  [1:0]   change_r ;reg          sell_r ;always @(posedge clk or negedge rstn) beginif (!rstn) beginchange_r       <= 2'b0 ;sell_r         <= 1'b0 ;endelse if ((st_cur == GET15 && coin ==2'h1)|| (st_cur == GET10 && coin ==2'd2)) beginchange_r       <= 2'b0 ;sell_r         <= 1'b1 ;endelse if (st_cur == GET15 && coin == 2'h2) beginchange_r       <= 2'b1 ;sell_r         <= 1'b1 ;endelse beginchange_r       <= 2'b0 ;sell_r         <= 1'b0 ;endendassign       sell    = sell_r ;assign       change  = change_r ;endmodule

状态机修改:2 段式

将 3 段式状态机 2、3 段描述合并,其他部分保持不变,状态机就变成了 2 段式描述。
修改部分如下:

//(2) state switch, and output logic
//all using block assignment for combination-logic
reg  [1:0]   change_r ;
reg          sell_r ;
always @(*) begin //all case items need to be displayed completelycase(st_cur)IDLE: beginchange_r     = 2'b0 ;sell_r       = 1'b0 ;case (coin)2'b01:     st_next = GET05 ;2'b10:     st_next = GET10 ;default:   st_next = IDLE ;endcase // case (coin)endGET05: beginchange_r     = 2'b0 ;sell_r       = 1'b0 ;case (coin)2'b01:     st_next = GET10 ;2'b10:     st_next = GET15 ;default:   st_next = GET05 ;endcase // case (coin)endGET10:case (coin)2'b01:     beginst_next      = GET15 ;change_r     = 2'b0 ;sell_r       = 1'b0 ;end2'b10:     beginst_next      = IDLE ;change_r     = 2'b0 ;sell_r       = 1'b1 ;enddefault:   beginst_next      = GET10 ;change_r     = 2'b0 ;sell_r       = 1'b0 ;endendcase // case (coin)GET15:case (coin)2'b01: beginst_next     = IDLE ;change_r    = 2'b0 ;sell_r      = 1'b1 ;end2'b10:     beginst_next     = IDLE ;change_r    = 2'b1 ;sell_r      = 1'b1 ;enddefault:   beginst_next     = GET15 ;change_r    = 2'b0 ;sell_r      = 1'b0 ;endendcasedefault:  beginst_next     = IDLE ;change_r    = 2'b0 ;sell_r      = 1'b0 ;endendcase
end

状态机修改:1 段式(慎用)

将 3 段式状态机 1、 2、3 段描述合并,状态机就变成了 1 段式描述。
修改部分如下:

//(1) using one state-variable do describereg  [1:0]   change_r ;reg          sell_r ;always @(posedge clk or negedge rstn) beginif (!rstn) beginst_cur     <= 'b0 ;change_r   <= 2'b0 ;sell_r     <= 1'b0 ;endelse begincase(st_cur)IDLE: beginchange_r  <= 2'b0 ;sell_r    <= 1'b0 ;case (coin)2'b01:     st_cur <= GET05 ;2'b10:     st_cur <= GET10 ;endcaseendGET05: begincase (coin)2'b01:     st_cur <= GET10 ;2'b10:     st_cur <= GET15 ;endcaseendGET10:case (coin)2'b01:     st_cur   <=  GET15 ;2'b10:     beginst_cur   <= IDLE ;sell_r   <= 1'b1 ;endendcaseGET15:case (coin)2'b01:     beginst_cur   <= IDLE ;sell_r   <= 1'b1 ;end2'b10:     beginst_cur   <= IDLE ;change_r <= 2'b1 ;sell_r   <= 1'b1 ;endendcasedefault:  beginst_cur    <= IDLE ;endendcase // case (st_cur)end // else: !if(!rstn)end

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

okcc呼叫系统如何配置呼入?

配置OKCC的呼入需要进行以下步骤&#xff1a; 1. 登录OKCC管理界面&#xff1a;使用管理员账号和密码登录OKCC的管理界面。通常可以在浏览器中输入OKCC的IP地址或域名来访问管理界面。 2. 确认网关配置&#xff1a;在OKCC管理界面中&#xff0c;确认已正确配置了网关&#xf…

在windows11系统上利用docker搭建linux记录

我的windows11系统上&#xff0c;之前已经安装好了window版本的docker&#xff0c;没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤&#xff1a; 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…

rtm姿态跟踪

6年前&#xff1a; GitHub - YuliangXiu/PoseFlow: PoseFlow: Efficient Online Pose Tracking (BMVC18) 报错&#xff1a; Clarification on min_keypoints in tracking Issue #1411 open-mmlab/mmpose GitHub https://github.com/open-mmlab/mmpose/blob/c8e91ff456d82c…

根能抵达的节点(二分法、DFS)C++

给定一棵由 N个节点构成的带边权树。节点编号从 0到 N−1&#xff0c;其中 0 号点为根节点。最初&#xff0c;从根节点可以抵达所有节点&#xff08;包括自己&#xff09;。如果我们将所有边权小于 X 的边全部删掉&#xff0c;那么从根节点可以抵达的节点数目就可能发生改变。 …

全国首创:福建协和医院成功完成长期型人工心脏微创植入

导语 微创技术在心脏手术领域正逐渐发展&#xff0c;并取得了突破性进展。最近&#xff0c;福建协和医院成功进行了全球第二例微创EVAHEART左心室辅助装置手术&#xff0c;为心脏病患者带来新的希望和治疗选择。 2023年11 月&#xff0c;中华医学会胸心血管外科学分会第八届…

从零开始学Python:分支结构

应用场景 迄今为止&#xff0c;我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题&#xff0c;比如我们设计一个游戏&#xff0c;游戏第一关的通关条件是玩家获得1000分&#xff0c;那么在完成本…

电商建表常用前缀[ams/mms/pms/oms/cms/wms/crm]

ams&#xff1a;代表 "Admin Management System"&#xff0c;即管理后台系统。该模块通常用于管理用户、权限、订单等与后台管理相关的功能。 mms&#xff1a;代表 "Merchant Management System"&#xff0c;即商家管理系统。该模块通常用于管理商家账户、…

Duality

对偶 拉格朗日对偶函数 考虑优化问题 min ⁡ f 0 ( x ) s.t. f i ( x ) ≤ 0 , i 1 , … , m h i ( x ) 0 , i 1 , … , p \begin{array}{ll} \min & f_0\left(\mathbf{x}\right) \\ \text {s.t.} & f_i\left(\mathbf{x}\right) \leq 0, \quad i1, \ldots, m \\ …

基于人脸识别的智慧校园方案—校内区域智能管理(2)

实验室人脸识别 实验是教师、学生和科研人员进行教学和科学研究的重要场地,也是学校教务管理中的重要组成部分,高校实验室管理质量直接影响教学科研工作质量。 随着在校学生的日益增多,实验室资源如何分配利用、实验室设施安全如何保障也成为一大难题。运用智能管理系统开…

windows安装Elasticsearch后使用ik分词器报错解决办法

最近在学习Elasticsearch&#xff0c;安装完成后下载了ik分词器压缩到plugins目录下启动es报错如下&#xff1a; java.security.AccessControlException: access denied (“java.io.FilePermission” “D:…\plugins\ik-analyzer\config\IKAnalyzer.cfg.xml” “read”)咋一看…

外贸建站主机哪个好?海洋建站系统怎么样?

外贸建站主机的选择攻略&#xff1f;搭建电商网站用哪个主机好&#xff1f; 要在互联网上建立一个成功的外贸网站&#xff0c;选择一款稳定可靠的外贸建站主机是至关重要的一环。海洋建站将探讨在众多选择中&#xff0c;如何寻找一款适合自己业务需求的外贸建站主机。 外贸建…

PCF8563转STM32 RTC避坑指南

问题一&#xff0c;时间读取错误 原因&#xff0c;读写时间必须Time在前&#xff0c;Date在后 HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BCD); HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BCD); HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BCD); …

【AI视野·今日Sound 声学论文速览 第四十四期】Tue, 9 Jan 2024

AI视野今日CS.Sound 声学论文速览 Tue, 9 Jan 2024 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers DJCM: A Deep Joint Cascade Model for Singing Voice Separation and Vocal Pitch Estimation Authors Haojie Wei, Xueke Cao, Wenbo Xu…

【深度学习 | 风格迁移】神经网络风格迁移,原理详解附详细案例源码

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

【Linux】Linux 系统编程——相对路径和绝对路径

文章目录 概述绝对路径相对路径绝对路径的作用相对路径的作用系统是怎么通过相对路径定位文件的&#xff1f; 概述 相对路径和绝对路径是文件系统中定位文件和目录的两种主要方法。它们的主要区别在于如何引用文件的位置。 绝对路径 定义: 绝对路径是从文件系统的根目录&…

我国实施个人信息出境认证的要点

文章目录 前言一、个人信息保护认证与个人信息出境认证的关系二、欧盟提供了个人信息出境认证的制度先例(一)欧盟立法规定了认证制度是数据出境方式之一(二)欧盟设计完整的数据安全认证机制(三)欧盟内承认多种数据安全认证制度并存(四)欧盟数据安全认证主题多样化(五)…

yolov8 瑞芯微 RKNN 的 C++部署,部署工程难度小、模型推理速度快

之前写过两次yolov8目标检测部署&#xff0c;后续继续思考&#xff0c;针对部署还有优化空间&#xff0c;本示例的部署方式优化了部署难度&#xff0c;加快了模型推理速度&#xff08;略微增加了后处理的时耗&#xff09;。 特别说明&#xff1a;如有侵权告知删除&#xff0c;…

麒麟OS + DM8数据库(Graalvm for JDK17) 测试

1、添加依赖 implementation com.dameng:DmJdbcDriver18:8.1.3.62 implementation com.baomidou:mybatis-plus-boot-starter:3.5.4 2、application.yml 数据源配置 spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver #com.mysql.cj.jdbc.Driver url: jdbc:d…

【linux】linux中硬链接和符号链接的区别

在Linux系统中&#xff0c;硬链接&#xff08;Hard Link&#xff09;和符号链接&#xff08;Symbolic Link&#xff0c;也称为软链接&#xff09;是两种不同类型的文件链接方式&#xff0c;它们的主要区别如下&#xff1a; 硬链接&#xff08;Hard Link&#xff09;&#xff1a…

高效微调大型预训练模型的Prompt Learning方法

目录 前言1 prompt learning简介2 prompt learning步骤2.1 选择模型2.2 选择模板&#xff08;Template&#xff09;2.3 Verbalizer的构建 3 Prompt Learning训练策略3.1 Prompting组织数据&#xff0c;优化参数3.2 增加Soft Prompts&#xff0c;冻结模型&#xff0c;优化Prompt…