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

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

文章目录

    • 移位运算与乘法
      • 状态机简介
      • 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) begindone = 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 
endendmodule 

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

  • 开始状态,这个状态通常都是做一些信号的初始化,然后再执行下一个状态;
  • 结束状态,也就是最后一个状态,这时需要回到最开始的状态;
  • 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” 的多行赋值语句, 在同一时间内同时赋值。

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

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

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

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

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

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

有限状态机(FSM)

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

无限状态机

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

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

相关文章:

  • RabbitMQ-4.MQ的可靠性
  • Qt Windows和Android使用MuPDF预览PDF文件
  • mac电脑flutter环境配置,解决疑难问题
  • 力扣:47. 全排列 II
  • Oracle12c之Sqlplus命令行窗口基本使用
  • LLaMA 模型中的Transformer架构变化
  • LabVIEW电能质量监测系统
  • 详述FlinkSql Join操作
  • c++设计模式之装饰器模式
  • 为电子表格嵌入数据库,Excel/WPS一键升级为管理系统
  • 零基础学Python之网络编程
  • 【Linux】缓冲区与缓冲区的刷新策略
  • 微信自动预约小程序开发指南:从小白到专家
  • 中兴R5300G4服务器查看服务器、主板序列号及硬盘RAID信息
  • 小白都能看懂的力扣算法详解——链表(一)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • C语言笔记(第一章:C语言编程)
  • Docker: 容器互访的三种方式
  • Git 使用集
  • HTML5新特性总结
  • IOS评论框不贴底(ios12新bug)
  • javascript数组去重/查找/插入/删除
  • JavaScript新鲜事·第5期
  • Java多态
  • JS字符串转数字方法总结
  • maven工程打包jar以及java jar命令的classpath使用
  • Web标准制定过程
  • 计算机常识 - 收藏集 - 掘金
  • 聊一聊前端的监控
  • 码农张的Bug人生 - 见面之礼
  • 使用docker-compose进行多节点部署
  • 微信小程序设置上一页数据
  • 延迟脚本的方式
  • 移动端 h5开发相关内容总结(三)
  • FaaS 的简单实践
  • Linux权限管理(week1_day5)--技术流ken
  • UI设计初学者应该如何入门?
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #includecmath
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (九)c52学习之旅-定时器
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)c52学习之旅-流水LED灯
  • (原創) 物件導向與老子思想 (OO)
  • .md即markdown文件的基本常用编写语法
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NetCore实践篇:分布式监控Zipkin持久化之殇