1. Fsm1(Simple FSM 1 - asynchronous reset)

        状态机可分为两类:

        (1)Mealy状态机:输出由当前状态和输入共同决定。输入变化可能立即改变输出。

        (2)Moore状态机:输出仅由当前状态决定,与输入无关。输出更稳定,但可能对输入响应较慢。

注意:本题是实现Moore状态机,但其状态转移逻辑是由当前状态与输入共同决定的,该点容易混淆。

        首先根据当前状态值得出输出

                out = (state == B);

然后根据Fsm1的状态转移图判断出其状态转移逻辑,该部分使用组合逻辑电路实现。状态转移表具体如表1所示:

表1  Fsm1的状态转移表

当前状态下一状态输出
in = 0in = 1
BAB1
ABA0

最后对当前状态值进行更新赋值,该部分使用时序逻辑电路实现。

module top_module
#(parameter 	A = 0,parameter 	B = 1
)
(output	out,input 	clk,input 	areset,input 	in
);reg state;reg next_state;// 状态值更新always @(posedge clk, posedge areset) beginif (areset == 1'b1) beginstate <= B;end else beginstate <= next_state;endend// 状态值转换always @(*) begincase (state)A: next_state = (in) ? A : B;B: next_state = (in) ? B : A;endcaseend// 输出赋值assign out = (state==B);
endmodule

2. Fsm1s(Simple FSM 1 - synchronous reset)

注意:由于本题中输出赋值与状态值更新处于同一寄存器中,所以变量 present_state 得充当中间变量,使用阻塞赋值语句,否则会其值的更新会落后一个时钟周期,输出 out 无法被正确赋值。

        对于阻塞赋值的中间变量, 使用关键字 logic 进行定义。

module top_module(clk, reset, in, out);output 	out; input 	clk;input 	reset;input 	in;reg 	out;parameter A = 0;parameter B = 1;always @(posedge clk) beginlogic present_state;logic next_state;if (reset == 1'b1) begin  present_state	= B;out				<= present_state;end else begin// 状态值转换case (present_state)A: next_state = (in) ? A : B;B: next_state = (in) ? B : A;endcase// 状态值更新present_state = next_state;   // 输出赋值case (present_state)A: out <= 0;B: out <= 1;endcaseendend
endmodule

3. Fsm2(Simple FSM 2 - asynchronous reset)

module top_module
#(parameter 	OFF	= 0,parameter 	ON	= 1
)
(output 	out,input 	clk,input 	areset,input 	j,input 	k
); reg state;reg	next_state;// 状态值更新always @(posedge clk, posedge areset) beginif (areset == 1'b1) beginstate <= OFF;end else beginstate <= next_state;endend// 状态值转换always @(*) begincase (state)OFF:	next_state = (j) ? ON : OFF;ON:		next_state = (k) ? OFF : ON;endcaseend// 输出赋值assign out = (state == ON);
endmodule

4. Fsm2s(Simple FSM 2 - synchronous reset)

module top_module
#(parameter 	OFF	= 0,parameter	ON	= 1 
)
(output 	out,input 	clk,input 	reset,input 	j,input 	k
);reg state;reg next_state;// 状态值更新always @(posedge clk) beginif (reset == 1'b1) beginstate <= OFF;end else beginstate <= next_state;endend// 状态值转换always @(*) begincase (state)OFF:	next_state = (j) ? ON : OFF;ON:		next_state = (k) ? OFF : ON;endcaseend// 输出赋值assign out = (state == ON);
endmodule

5. Fsm3comb(Simple state transitions 3)

module top_module 
#(// 充当数值parameter A = 0, parameter B = 1, parameter C = 2, parameter D = 3
)
(output 			out,output 	[1:0]	next_state,input 			in,input 	[1:0] 	state
);// 状态值变换always @(*) begincase (state)A: next_state = (in) ? B : A;B: next_state = (in) ? B : C;C: next_state = (in) ? D : A;D: next_state = (in) ? B : C;endcaseend// 输出赋值assign out = (state == D);
endmodule

6. Fsm3onehot(Simple one-hot state transitions 3)

module top_module 
#(// 充当序号parameter A = 0, parameter B = 1, parameter C = 2, parameter D = 3
)
(output 			out,output 	[3:0] 	next_state,input 			in,input 	[3:0]	state
);// 输出赋值assign out = state[3];// 状态值变换assign next_state[A] = state[0]&(~in)	| state[2]&(~in);assign next_state[B] = state[0]&in 		| state[1]&in 		| state[3]&in;assign next_state[C] = state[1]&(~in) 	| state[3]&(~in);assign next_state[D] = state[2]&in;
endmodule

7. Fsm3(Simple FSM 3 - asynchronous reset)

module top_module
#(parameter A = 0,parameter B = 1,parameter C = 2,parameter D = 3
)
(output 	reg	out,input 		clk,input 		in,input 		areset
);reg [1:0] sta;reg [1:0] nex_sta;// 状态值更新always @(posedge clk, posedge areset) beginif (areset == 1'b1) beginsta <= A;end else beginsta <= nex_sta;endend// 状态值转换always @(*) begincase (sta)A: nex_sta = (in) ? B : A;B: nex_sta = (in) ? B : C;C: nex_sta = (in) ? D : A;D: nex_sta = (in) ? B : C;endcaseend// 输出赋值assign out = (sta == D);
endmodule

8. Fsm3s(Simple FSM 3 - synchronous reset)

module top_module 
#(parameter A = 0,parameter B = 1,parameter C = 2,parameter D = 3
)
(output 	out,input 	clk,input 	in,input 	reset
); reg [1:0] sta;reg [1:0] nex_sta;// 状态值更新always @(posedge clk) beginif (reset == 1'b1) beginsta <= A;end else beginsta <= nex_sta;endend// 状态值变换always @(*) begincase (sta)A: nex_sta = (in) ? B : A;B: nex_sta = (in) ? B : C;C: nex_sta = (in) ? D : A;D: nex_sta = (in) ? B : C;endcaseend// 输出赋值assign out = (sta == D);
endmodule

9. Exams/ece241 2013 q4(Design a Moore FSM)

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

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

相关文章

多级缓存(亿级流量缓存)

传统缓存方案问题 多级缓存方案 流程 1.客户端浏览器缓存页面静态资源; 2. 客户端请求到Nginx反向代理;[一级缓存_浏览器缓存] 3.Nginx反向代理将请求分发到Nginx集群(OpenResty); 4.先重Nginx集群OpenResty中获取Nginx本地缓存数据;[二级缓存_Nginx本地缓存] 5.若Nginx本地缓存…

浅谈Rust语言特性

如大家所了解的&#xff0c;Rust是一种由Mozilla开发的系统编程语言&#xff0c;专注于内存安全、并发性和高性能&#xff0c;旨在替代C/C等传统系统编程语言。Rust 有着非常优秀的特性&#xff0c;例如&#xff1a;可重用模块 内存安全和保证&#xff08;安全的操作与不安全的…

React探索高性能Tree树组件实现——react-window、react-vtree

&#x1f680; 简介 在现代 Web 应用中&#xff0c;处理大量层级数据的树形结构是一个常见挑战。传统的树组件在面对成千上万个节点时往往会出现性能瓶颈&#xff0c;导致页面卡顿、内存占用过高等问题。本文将深入探讨如何使用 react-window 和 react-vtree 构建高性能的虚拟…

C++ 中的默认构造函数:非必要,不提供

《More Effective C&#xff1a;35个改善编程与设计的有效方法》 读书笔记&#xff1a;非必要不提供default constructor在 C 中&#xff0c;默认构造函数&#xff08;即无需任何参数即可调用的构造函数&#xff09;是对象“无中生有”的一种方式。它的核心作用是在没有外部信息…

如何选择低代码开发平台

选择低代码开发平台需要考虑平台的开发效率、灵活性和扩展能力、安全性和合规性、成本效益等关键因素。 具体来说&#xff0c;平台的灵活性和扩展能力尤为重要&#xff0c;这决定了平台是否能长期满足企业日益增长的复杂需求。例如&#xff0c;企业在评估平台时&#xff0c;应关…

电子数据取证领域的双轮驱动——手工分析 vs 自动化分析

在你刚步入电子数据取证领域时&#xff0c;可能很快就注意到一个普遍现象&#xff1a;大多数取证分析师前期都花费大量时间在网上查阅博客、PDF、推文等信息&#xff0c;寻找证据线索的“藏身之处”——例如注册表项、日志文件路径、可疑文件命名模式或远程登录痕迹等。这种信息…

《Python 实时通信全解:掌握 WebSocket 技术与 HTTP 的本质区别》

🚀《Python 实时通信全解:掌握 WebSocket 技术与 HTTP 的本质区别》 引言:通信方式的演进与 Python 的角色 在数字化世界里,**“实时性”**已经成为构建高质量应用的核心诉求。从聊天工具到股票交易系统,再到物联网设备管理——通信的即时响应能力直接决定用户体验。而…

GeoTools 自定义坐标系

前言在GIS开发中&#xff0c;坐标系统是重中之重&#xff0c;在接到任务时首先要确定的就是坐标系。大多数地图库或者互联网地图默认支持WGS84地理坐标系和Web墨卡托投影坐标系。而在我国要求使用自然资源数据使用2000国家大地坐标&#xff08;CGCS2000&#xff09;。1. 背景 经…

[特殊字符] Java反射从入门到飞升:手撕类结构,动态解析一切![特殊字符]

【&#x1f50d;震撼揭秘】 你是否曾想窥探Java类的内部结构&#xff1f;&#x1f914; 是否好奇Spring框架如何实现"万物皆可注入"&#xff1f;✨ 本文将带你从反射小白晋升为反射高手&#xff0c;用一行代码透视任意类的构造方法、成员变量和私有方法&#xff01;&…

CMake与catkin_make的find_package()命令使用说明

在 CMake 中&#xff0c;find_package() 是一个核心函数&#xff0c;用于查找并加载外部依赖库的配置。它的主要作用是定位头文件、库文件&#xff0c;并设置相关变量&#xff0c;以便后续编译和链接。以下是详细解析&#xff1a; 1. 基本语法 find_package(<PackageName&g…

Spring--BeanFactoryPostProcessor的用法

原文网址&#xff1a;Spring--BeanFactoryPostProcessor的用法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Spring的BeanFactoryPostProcessor的用法。 BeanPostProcessor和BeanFactoryPostProcessor的区别 项BeanPostProcessorBeanFactoryPostProcessor处理的对象处理…

了解类加载器吗?类加载器的类型有哪些?

一、什么是类加载器&#xff08;ClassLoader&#xff09; 类加载器是 Java 虚拟机中的一部分&#xff0c;负责将 .class 文件加载到 JVM 内存中&#xff0c;生成对应的 Class 对象。 Java 程序中所有的类在使用前都必须通过类加载器加载进 JVM&#xff0c;才能被执行。二、类加…

PHP面向对象高级特性:魔术方法、对象迭代器与设计模式应用

引言 在前一篇文章中,我们探讨了PHP的Traits、匿名类和对象比较机制。本文将深入PHP面向对象编程的更多高级特性,包括魔术方法、对象迭代器以及常用设计模式的实际应用,这些特性能够帮助开发者构建更加灵活和强大的面向对象系统。 魔术方法深度解析 魔术方法是PHP中一组以…

【Java基础】一个月教你轻松掌握Java——第三篇Git

一、Java概述&#xff08;之前的文章&#xff09;二、版本控制工具Git其实这个与Java基础关系不大&#xff0c;但是这个工具还是很重要的&#xff0c;不管是团队之间打比赛还是就业都应该学会它&#xff0c;秉持着学的早一些&#xff0c;用的时间长一点&#xff0c;会更熟练。&…

【C# in .NET】16. 探秘类成员-索引器:通过索引访问对象

探秘类成员-索引器:通过索引访问对象 在 C# 中,索引器(Indexer)是一种独特的类成员,它允许类或结构的实例像数组一样被索引访问,为数据访问提供了极大的灵活性。本文将从基础概念出发,深入.NET 框架底层,剖析索引器的实现机制,并通过实战案例展示其强大的应用价值。 …

idea出现:java: Target level ‘1.7‘ is incompatible with source level ‘1.8‘.解决办法

在文件->设置->java编译器&#xff0c;把这里版本对应上。这里用的是8版本

ssms(SQL 查询编辑器) 添加快捷键 Ctrl+D(功能等于Ctrl+C + Ctrl+V),一步到位

1,打开ssms 工具&#xff0c;打开对应添加快捷键得地方2&#xff0c;分配 快捷键3&#xff0c;看效果

数学建模--层次分析法

层次分析法&#xff08;AHP&#xff09;笔记 一、核心概念 &#xff08;一&#xff09;问题本质 面对多方案、多准则决策&#xff0c;将复杂问题分层拆解&#xff0c;通过定性与定量结合&#xff0c;确定各因素权重&#xff0c;选出最优方案&#xff0c;比如选“微博之星”时综…

人工智能教研室暑期培训flask全栈开发培训

人工智能教研室暑期培训flask全栈开发培训第一天&#xff1a;Flask 基础入门与环境搭建实践项目&#xff1a;搭建个人博客首页&#xff0c;包含文章列表与详情页上午&#xff1a;环境搭建与 Flask 基础1. 安装 Python 与虚拟环境配置2. Flask 框架简介与第一个 "Hello Wor…

MySQL(141)如何处理重复数据问题?

处理重复数据问题是数据管理中的一个常见挑战。重复数据会影响数据库的性能、占用资源&#xff0c;并且可能导致数据分析结果的偏差。以下是处理重复数据问题的详细步骤以及结合代码的示例。 一、识别重复数据 首先&#xff0c;需要识别数据库中的重复数据。可以使用 SQL 查询来…