Verilog学习之路(8)— 时序电路的设计
Verilog学习之路(8)— 时序电路的设计
一、前言
时序逻辑电路的输出不仅与当前时刻输入变量的取值有关,而且与电路的原状态,即与过去的输入情况有关。
时序逻辑电路的两个特点:
- 时序逻辑电路包括组合逻辑电路和存储电路两部分,存储电路具有记忆功能,通常由触发器组成;
- 存储电路的状态反馈到组合逻辑电路输入端,与外部输入信号共同决定组合逻辑电路的输出。
时序逻辑电路的结构框图如下所示:
其中各部分代表的含义如下:
- X(x1, x2, …, xn)是外部输入信号,;
- Q(q1, q2, … , qj)是存储电路的状态输出,也是组合逻辑电路的内部输入;
- Z(z1, z2, …, zm)为外部输出信号;
- Y(y1, y2, …, yk)为存储电路的激励信号,也是组合电路的内部输出。
我们可以写出三大方程如下所示:
方程中的上标n和n+1表示相邻的两个离散时间(或称为相邻的两个节拍),n表示当前状态,n+1表示下一状态。
二、状态机
鉴于时序电路在工作时是在电路的有限个状态间按一定的规律转换的,所以又将时序电路称为状态机(State Machine, 简称SM )、有限状态机(Finite State Machine, 简称FSM)或算法状态机(Algorithmic State Machine, 简称ASM)。
有时还会根据输出信号的特点将状态机分成米利(Mealy)型状态机和摩尔(Moore)型状态机两种。
- 摩尔型状态机:输出仅仅取决于储存电路的状态;
- 米利型状态机:输出不仅取决于存储电路的状态,而且还取决于输入变量。
另外,根据状态机的描述方式,可以分为一段式、两段式以及三段式状态机。
- 一段式:整个状态机写到一个always 模块里面。在该模块中既描述状态转移,又描述状态的输入和输出。
- 两段式:用两个always模块来描述状态机。其中一个always 模块采用同步时序描述状态转移,另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律及其输出。
- 三段式:使用3个always模块。一个always 块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件和描述其状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
三、序列检测器
- 设计一个
111
的序列检测器,当输入三个或三个以上1
时,电路输出为1,否则为0。
我们可以得到状态转移图如下所示:
我们即可编写代码check0.v
如下所示
module checker0(Z, X, clk, rst_n);output reg Z; // 输出检测结果input X, clk, rst_n; // 输入序列,时钟,复位// 对状态进行定义parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11,s3 = 2'b10;reg[1:0] state, next_state;// 描述状态转移always@(posedge clk or negedge rst_n) beginif(!rst_n) beginstate = s0;next_state = s0;endelsestate <= next_state;end // 判断状态转移条件和状态输出 always@(X, state) begincase(state) s0: if(X) beginnext_state <= s1;Z <= 0;end else beginnext_state <= s0;Z <= 0;end s1: if(X) beginnext_state <= s2;Z <= 0;end else beginnext_state <= s0;Z <= 0;end s2: if(X) beginnext_state <= s3;Z <= 1;end else beginnext_state <= s0;Z <= 0;end s3: if(X) beginnext_state <= s3;Z <= 1;end else beginnext_state <= s0;Z <= 0;end endcaseend endmodule
编写测试代码tb.sv
如下所示
module tb;reg clk, rst_n, X;wire Z;bit data_in[] = {0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0};checker0 dut(Z, X, clk, rst_n);always#10 clk = ~clk;initial beginclk = 0; rst_n = 0;#51 rst_n = 1'b1;foreach(data_in[i]) begin#20;X = data_in[i];end #100;$stop;endendmodule
仿真波形如下所示
我们可以看到,这是一个米利型的状态机,输出不仅和当前状态有关,还和输入有关。
四、附录
上一篇:Verilog学习之路(7)— 数字加法器
下一篇:Verilog学习之路(9)—计数器和移位寄存器
Verilog学习之路(8)— 时序电路的设计相关推荐
- Verilog学习之路(6)— 组合电路的设计
组合电路的设计 一.前言 组合电路的特点是电路中任意时刻的稳态输出仅仅取决于该时刻的输入,而与电路之前的状态无关,组合电路没有记忆功能. 在使用Verilog设计中组合电路的描述方法主要有四种:真值表 ...
- Verilog学习之路(4)— Verilog HDL的程序设计语句
Verilog HDL的程序设计语句 一.连续赋值语句 连续赋值语句通常用来描述组合逻辑电路,连续赋值的目标类型主要是标量线网和向量线网两种,标量线网如"wire a,b;",向量 ...
- 四、四相节拍脉冲发生器、带启停电路的时序电路(含电路图)
实验时间:11.10 目录 1.四相节拍脉冲发生器 2.带启停电路的时序电路 2.带启停电路的时序电路 Quartus II的使用,封装,总线的使用可以参考笔者之前的博客. 创建D触发器 FILE ...
- EDA实验(Quartus Ⅱ+fpga) (二)---时序电路的设计-模可变计数器设计
前言: 本文主要介绍了EDA原理与应用这门课程的相关实验及代码.使用的软件是Quartus Ⅱ,该实验使用fpga芯片为cycloneⅤ 5CSEMA5F31C6. (一)实验目的 (1)进一步熟悉E ...
- Verilog学习之路
Verilog编程规范 1.冒号前后==同时==出现变量 2.模块接口写法 2.1 parameter . localparam.`define 1.冒号前后同时出现变量 在已知所需位宽的情况下,可使 ...
- C# 学习之路--百度网盘爬虫设计与实现(一)
百度网盘爬虫 现在市面上出现了很多网盘搜索引擎,写这系列博文及爬虫程序的初衷: 更方面的查找资源 学习C# 学习爬虫的设计与实现 记录学习历程 自我监督 能力有限,如有不妥之处,还请各位看官点评.同在 ...
- 电源学习(1):stm32单片机buck电路可调电源设计介绍
最近,搞了一块stm32单片机的降压电路板,效果还不错分享分享给大家. 首先上图看效果! 下图 输入电压在20v不变,效果如图所示. 然后我又测了几组数据供大家参考一下,具体电路后续在写了 可见负载调 ...
- Verilog学习之移位运算与乘法设计
文章目录 前言 一.题目描述 二.实现思路 1.理解移位运算与状态机 1)移位运算 1>算数移位 2>逻辑移位 2)状态机 1>什么是状态机 2>状态机的类型 Moore 型状 ...
- 十四、关于利用卡诺图快速解决时序电路自启动问题的研究
目录 1 卡诺图简介 2 常规的时序电路设计方法 3 精简后的时序电路的设计方法
最新文章
- MFC中获取任务栏大小
- WPF 和 windows Form Application的区别
- 软件测试遇到的异常情况,豪之诺软件测试项目开发中遇到比较多的Bug总结
- CIO大咖专访 | 从实战中提炼的企业数字化转型要点
- The Generalist和Visualize Value在去中心化内容发布平台Mirror上发起众筹
- oracle怎么截取long类型,Oracle 数据库中 Long 类型字段的读取
- Code[VS]1302 小矮人
- 思维导图不会画,没关系,实用思维导图模板分享
- php阿拉伯数字转换大写,php 阿拉伯数字如何转大写
- 关于医学影像中的轴位面(横断面)、冠状面、矢状面
- iOS 添加自定义字体
- Spring Boot入门到精通(超详细)
- 数字图像处理实验八图像的傅里叶变换
- 使用VS2022编译Telegram桌面端(tdesktop)
- ELSEVIER期刊论文投稿全流程实例讲解
- 【人工智能】— 逻辑Agent、一般逻辑、Entailment 蕴涵、命题逻辑、前向链接、反向链接、Resolution归结
- 计算机系统(1)实验二 LC-3机器码编程试验
- python之Scapy 中文文档:三、使用方法
- 达内python培训体系
- 我们只不过在忙碌地穷着——读《贫穷的本质》