【芯片设计- RTL 数字逻辑设计入门 11.1 -- 状态机实现 移位运算与乘法 1】

news2024/9/25 19:19:39

文章目录

    • 移位运算与乘法
      • 状态机简介
      • SystemVerilog中的测试平台
      • VCS 波形仿真
    • 阻塞赋值和非阻塞赋值
      • 有限状态机(FSM)与无限状态机的区别

本篇文章接着上篇文章【芯片设计- RTL 数字逻辑设计入门 11 – 移位运算与乘法】 继续介绍,这里使用状态机来实现。

移位运算与乘法

已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)
在这里插入图片描述

在这里插入图片描述

状态机简介

在Verilog中实现状态机通常包括三个主要部分:状态声明状态转换输出逻辑。状态机可以是"Moore"或"Mealy"类型,区别在于输出是仅由当前状态决定(Moore),还是由当前状态和输入决定(Mealy)。

以下是一个 错误的 Moore 状态机的 Verilog 代码示例:

module moore_state_machine( 
	input clk, 
	input rstn, 
	output reg done 
	);

// 状态声明 
localparam [1:0] S_IDLE = 2'b00, S_START = 2'b01, S_DONE = 2'b10;

// 状态寄存器 
reg [1:0] current_state, next_state;

// 状态转换逻辑 
always @(posedge clk or posedge reset) begin 
	if (!rstn) begin
		done = 0; 
		current_state <= S_IDLE; 
	end 
	else begin 
		current_state <= next_state; 
	end 
end

// 下一个状态和输出逻辑 
always @(*) begin 
	case (current_state) 
		S_IDLE: begin 
			if (start) begin 
				next_state = S_START;
			end 
		end 

		S_START: begin 
			// 执行一些操作... 
			next_state = S_DONE; 
		end 

		S_DONE: begin 
			done = 1'b1; 
			next_state = S_IDLE; 
		end 

		default: 
			next_state = S_IDLE; 
	endcase 
end

endmodule 

此外,还需要注意以下几点:

  • 开始状态,这个状态通常都是做一些信号的初始化,然后再执行下一个状态;
  • 结束状态,也就是最后一个状态,这时需要回到最开始的状态;
  • default 的情况,通常都是回到开始状态。

SystemVerilog中的测试平台

以下是上述状态机的SystemVerilog测试平台(testbench)代码示例:

module tb_moore_state_machine; 
	// 测试平台信号 
	reg clk, reset, done; 

	// 实例化状态机模块 
	moore_state_machine uut( 
		.clk(clk), 
		.reset(reset), 
		.done(done) 
	); 

	// 时钟生成 
	always #5 clk = ~clk; 

	// 测试序列 
	initial begin 
		// 初始化信号 
		clk = 0; 
		rstn = 0; 
		#10; 
		
		// 释放复位 
		reset = 1; 
		#30; 

	// 断言检查状态机是否正确完成 
	assert (done === 1'b1) else $error("状态机未正确完成。"); 

	// 仿真结束 
	$finish; 
end 
endmodule 

VCS 波形仿真

在这里插入图片描述
所以可以看出来仿真结果并不是预期中的,这里主要是由于什么问题导致的?答案是阻塞赋值非阻塞赋值,接下来对它进行详细介绍。

阻塞赋值和非阻塞赋值

always 语句块中, Verilog 语言支持两种类型的赋值: 阻塞赋值和非阻塞赋值。 阻塞赋值使用
=” 语句; 非阻塞赋值使用“<=” 语句。

阻塞赋值: 在一个“begin…end” 的多行赋值语句, 先执行当前行的赋值语句, 再执行下一行的赋值语句。

非阻塞赋值: 在一个“begin…end” 的多行赋值语句, 在同一时间内同时赋值。

begin
	c = a;
	d = c + a;
end
begin
	c <= a;
	d <= c + a;
end

上面两个例子中, 第1个例子是阻塞赋值, 程序会先执行第 1 行, 得到结果后再执行第 2 行。第2个例子是非阻塞赋值, 两行的赋值语句是同时执行的。

组合逻辑中应使用阻塞赋值“=” , 时序逻辑中应使用非阻塞赋值“<=” 。 可以将这个规则牢牢记住, 按照这一规则进行设计绝对不会发生错误。

对代码做了如下两处修改(将阻塞赋值修改wield非阻塞赋值,同时检测任意信号变化):
在这里插入图片描述
仿真波形图如下:
在这里插入图片描述

如果再将 “下一个状态和输出逻辑” 中的 always @(*) begin 修改为always @(posedge clk or posedge reset) begin 之后则会出现仿真失败,波形图如下:
在这里插入图片描述
不太清楚是什么原因导致的这个问题!!!

有限状态机(FSM)与无限状态机的区别

有限状态机(FSM)

  • 有限状态机具有一个定义良好的状态集,这个集合是有限的。
  • 通常包括状态、转换、输入和(可选的)输出。
  • FSM可以是确定性的(每个状态和输入组合对应一个唯一的后继状态)也可以是非确定性的(一个状态和输入组合可以对应多个后继状态)。
  • FSM广泛用于硬件设计、协议实现、解析器和其他工程应用。

无限状态机

  • 理论上,无限状态机拥有无限多个状态,但这在实际硬件设计中不是可行的,因为硬件资源是有限的。
  • 在软件中,无限状态机可能通过数据结构和不断变化的状态信息来模拟无限状态的概念。
  • 无限状态机通常是指在概念模型中可能具有无限状态的系统,如某些类型的自动机或计算模型。

在实际硬件设计中,我们通常处理的是有限状态机。无限状态机更多地是计算理论的一部分,用于研究计算能力和复杂性等问题。

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

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

相关文章

LeetCode 0993. 二叉树的堂兄弟节点:深度优先搜索(BFS)

【LetMeFly】993.二叉树的堂兄弟节点&#xff1a;深度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/cousins-in-binary-tree/ 在二叉树中&#xff0c;根节点位于深度 0 处&#xff0c;每个深度为 k 的节点的子节点位于深度 k1 处。 如果二叉树的两个…

使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

一、前言 在业务系统开发过程中,我们必不可少的会使用数据库,在应用开发过程中,数据库连接信息往往都是以明文的方式配置到yaml配置文件中的,这样有密码泄露的风险,那么有没有什么方式可以避免呢?方案当然是有的,就是对数据库密码配置的时候进行加密,然后读取的时候再…

25、数据结构/二叉树相关练习20240207

一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> ty…

生物——文献笔记

生物——文献笔记 文章目录 前言藻类群体遗传学研究和进展&#xff08;综述&#xff09;海洋动物群体遗传学的研究进展1. 影响群体基因频率的因素2. 根据自然群体的繁殖体系&#xff0c;海洋动物群体遗传类型可分为以下几类3. 海洋动物群体遗传研究中常用的遗传标记4. 研究展望…

UML 2.5图形库

UML 2.5图形库 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储&#…

幻兽帕鲁服务器全自动部署教程,小白也能轻松上手

幻兽帕鲁太火了&#xff0c;官方palworld服务器不稳定&#xff1f;不如自建服务器&#xff0c;基于腾讯云幻兽帕鲁服务器成本32元全自动部署幻兽帕鲁服务器&#xff0c;超简单有手就行&#xff0c;全程自动化一键部署10秒钟即可搞定&#xff0c;无需玩家手动部署幻兽帕鲁游戏程…

深入探究 HTTP 简化:httplib 库介绍

✏️心若有所向往&#xff0c;何惧道阻且长 文章目录 简介特性主要类介绍httplib::Server类httplib::Client类httplib::Request类httplib::Response类 示例服务器客户端 总结 简介 在当今的软件开发中&#xff0c;与网络通信相关的任务变得日益普遍。HTTP&#xff08;Hypertext…

面向智算服务,构建可观测体系最佳实践

作者&#xff1a;蓟北 构建面向 AI、大数据、容器的可观测体系 &#xff08;一&#xff09;智算服务可观测概况 对于越来越火爆的人工智能领域来说&#xff0c;MLOps 是解决这一领域的系统工程&#xff0c;它结合了所有与机器学习相关的任务和流程&#xff0c;从数据管理、建…

K8s环境下rook-v1.13.3部署Ceph-v18.2.1集群

文章目录 1.K8s环境搭建2.Ceph集群部署2.1 部署Rook Operator2.2 镜像准备2.3 配置节点角色2.4 部署operator2.5 部署Ceph集群2.6 强制删除命名空间2.7 验证集群 3.Ceph界面 1.K8s环境搭建 参考&#xff1a;CentOS7搭建k8s-v1.28.6集群详情&#xff0c;把K8s集群完成搭建&…

单片机学习笔记---LED点阵屏的工作原理

目录 LED点阵屏分类 LED点阵屏显示原理 74HC595的介绍 一片74HC595的工作原理 多片级联工作原理 总结 LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合&#xff0c;如汽…

PdfFactory Pro软件下载以及序列号注册码生成器

PdfFactory Pro注册机是一款针对同名虚拟打印机软件所推出的用户名和序列号生成器。PdfFactory Pro是一款非常专业的PDF虚拟打印软件&#xff0c;通过使用这款注册机&#xff0c;就能帮助用户免费获取注册码&#xff0c;一键激活&#xff0c;永久免费使用。 pdffactory7注册码如…

【leetcode热题100】柱状图中最大的矩形

难度&#xff1a; 困难通过率&#xff1a; 29.6%题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该…

go语言进阶篇——面向对象(一)

什么是面向对象 在我们设计代码时&#xff0c;比如写一个算法题或者写一个问题结局办法时&#xff0c;我们常常会使用面向过程的方式来书写代码&#xff0c;面向过程主要指的是以解决问题为中心&#xff0c;按照一步步具体的步骤来编写代码或者调用函数&#xff0c;他在问题规…

12.状态模式

文章目录 状态模式总结 状态模式 介绍 状态模式它允许一个对象在其内部状态改变时改变其行为&#xff0c;使对象看起来似乎修改了其类。状态模式的主要目的是将对象的状态封装成不同的类&#xff0c;并将对象的行为委托给当前状态。 组成 Context&#xff08;环境&#xff09;&…

【JavaScript】Js中一些数组常用API总结

目录 前言 会改变原数组 push() pop()和shift() unshift() splice() sort() reverse() 不会改变原数组 slice() concat() filter() forEach() toString join(分隔符&#xff09; 小结 前言 Js中数组是一个重要的数据结构&#xff0c;它相比于字符串有更多的方法…

【RT-DETR有效改进】利用SENetV1重构化网络结构 (ILSVRC冠军得主)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何一个模型相结合…

Unity SRP 管线【第十讲:SRP/URP 图形API】

Unity 封装的图形API 文章目录 Unity 封装的图形API一、 CommandBuffer 要执行的图形命令列表1. CommandBuffer 属性2. CommandBuffer 常用图形API&#xff08;方法&#xff09;(1)设置(2)获取临时纹理 GetTemporaryRT以及释放(3)设置纹理为渲染目标 SetRenderTarget(4)Command…

一键放置柱子护角,你get了吗?

今天写个番外篇&#xff0c;给柱子添加护角。 记得几年前刚开始做BIM的时候&#xff0c;有次做车库导视方案模型&#xff0c;记得好像是鼎伦设计的车库一体化方案&#xff0c;当时柱子护角就给了两种方案&#xff0c;而且基本上每颗柱子上都要放护角&#xff0c;然后甲方竟然要…

MySQL8.0 最新版下载安装,手把手式的教程,小白都能安装成功!!

1、打开MySQL数据库官网的下载地址,根据自己的操作系统下载对应的安装包。我这里是Windows的,操作步骤如下: https://dev.mysql.com/downloads/installer/2、选择不登录下载 3、等待下载完成 4、然后点击下载下来的安装包 5、选择安装类型,Custom自定义安装 6、接…

【从Python基础到深度学习】1. Python PyCharm安装及激活

前言&#xff1a; 为了帮助大家快速入门机器学习-深度学习&#xff0c;从今天起我将用100天的时间将大学本科期间的所学所想分享给大家&#xff0c;和大家共同进步。【从Python基础到深度学习】系列博客中我将从python基础开始通过知识和代码实践结合的方式进行知识的分享和记…