本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同学,都能从中有所收获。

首先附上传送门:Exams/ece241 2014 q5b

Exams/ece241 2014 q5b​hdlbits.01xz.net

Problem 140 Serial two's complementer (Mealy FSM)

牛刀小试

本题和上一题 Serial two's complementer (Moore FSM) 一样,使用状态机实现一个二进制补码生成器,不同的是此题使用米里型状态机实现。

在本题与上一题中的米里型和摩尔型状态机最简单的区别在于:两者在输出时,摩尔型 FSM 有一个周期延迟。

米里型的输出由当前状态和输入信号的组合逻辑实现,输出信号与输入信号同步

而摩尔型状态机的输出仅由当前状态决定,与输入信号异步,往往存在延迟。

图片来自下方链接文章,出处见水印

有关两种状态机的知识,大家可以移步下方的文章。

Power小强:FPGA菜鸟学习笔记——4、有限状态机​zhuanlan.zhihu.com

书归正传,本题中给出了状态转移图,我们可以直接看图实现状态机。

存在两个状态,复位状态 A,在输入 x 为 1 后状态转移为 B,并保持在状态 B。

状态 A 中输出 z 与输入 x 相同;状态 B 中输出 z 与输入 x 相反。

简单的状态机,但这是如何实现二进制补码的呢?我们根据例子来看:

输入序列为:001101000,即原码,补码通过将原码取反加 1 实现。
取反:             110010111
加 1              110011000

将原码和补码放在一起观察:

001101    000
110011    000

可以发现前半部两者取反,而后半部分两者相同(均为0),两者的分界即是低位第一个 1 。所以有了上图中的状态转移图。

这里我们没有深究原理,只是从状态机的角度出发来实现该题目。(老实说一开始笔者也没想出来如何用状态机来实现这个电路 `_`)

解答与分析

module top_module (input clk,input areset,    // Asynchronous active-low resetinput x,output z ); reg [1:0]   state;reg [1:0]   nxt_state;localparam A = 0;localparam B = 1;// State transition logic (combinational)always @(*) begincase (state)A:beginif(x)nxt_state = B;elsenxt_state = A;endB:beginnxt_state = B;enddefault: beginnxt_state = A;endendcaseend// State flip-flops (sequential)always @(posedge clk or posedge areset) beginif(areset)state   <=  A;else beginstate   <=  nxt_state;end  end//output logicassign  z    =   state == A ? x:~x ;
endmodule

使用独热码的方式实现了一个双状态状态机。输出 z 取决于状态以及输入信号 x,z = x 或者 z = ~x

Problem 141 Q3a:FSM

牛刀小试

接下来一系列题目是状态机的练习题,出处应该是原作者任教学校的考试题目,适合初学者巩固状态机的编码能力。对于一定基础的学习者来说适合进行一次快速通过 Fast Through.(也适合国内高校的相关课程学习一下)

本题需要实现一个双状态状态机,状态转移并不复杂,由输入变量 s 决定。

稍显复杂的是输出逻辑,由输入变量 w 决定。当处于状态 B 时,以三个时钟为一个周期,如果三个周期中有两个周期 w 为 1,则 z 输出一个周期高电平。

值得注意的是:需要三个周期中 exactly 两个周期为 1 。

解答与分析

module top_module (input clk,input reset,   // Synchronous resetinput s,input w,output z
);reg [3:0]   state;reg [3:0]   nxt_state;wire        w_shft_ena;reg[1:0]    w_cntr;localparam A = 0;localparam B = 1;localparam B1 = 2;localparam B2 = 4;// State transition logic (combinational)always @(*) begincase (state)A:beginif(s)nxt_state = B;elsenxt_state = A;endB:beginnxt_state = B1;endB1:beginnxt_state = B2;endB2:beginnxt_state = B;enddefault: beginnxt_state = A;endendcaseend// State flip-flops (sequential)always @(posedge clk ) beginif(reset)state   <=  A;else beginstate   <=  nxt_state;end  endalways @(posedge clk ) beginif(reset)w_cntr   <=  2'b0;else if(state == B)beginw_cntr   <=  w;endelse if(state == B1 || state == B2)beginw_cntr   <=  w_cntr + w;end   endassign  z    =   state == B &&  w_cntr == 2 ? 1'b1 : 1'b0;endmodule

实现中值的注意的是,为了便于每三个时钟为一个单位检查输入 w 的值。笔者将状态 B 划分为 B1 B2 B3 三个子状态。使用计数器 w_cntr 在子状态中统计 w 为 1 的次数。

输出阶段为 B1 状态,当计数器值为 2 时输出 1,对应于 三个周期中 exactly 两个周期为 1

Problem 142 Q3b:FSM

牛刀小试

这是一道简单的根据状态转移实现状态机的题目,实现完整的三段式状态机

解答与分析

module top_module (input clk,input reset,    // Asynchronous active-low resetinput x,output z ); `define STT_W 3`define STT_W1 `STT_W - 1reg [`STT_W1:0]   state;reg [`STT_W1:0]   nxt_state;localparam IDLE  = `STT_W'd0;localparam s_1   = `STT_W'd1;localparam s_10  = `STT_W'd2;localparam s_11  = `STT_W'd3;localparam s_100 = `STT_W'd4;// State transition logic (combinational)always @(*) begincase (state)IDLE:beginif(x)nxt_state = s_1;elsenxt_state = IDLE;ends_1:beginif(x)nxt_state = s_100;elsenxt_state = s_1;ends_10:beginif(x)nxt_state = s_1;elsenxt_state = s_10;ends_11:beginif(x)nxt_state = s_10;elsenxt_state = s_1;ends_100:beginif(x)nxt_state =s_100;elsenxt_state = s_11;enddefault: beginnxt_state = IDLE;endendcaseend// State flip-flops (sequential)always @(posedge clk ) beginif(reset)state   <=  IDLE;else beginstate   <=  nxt_state;end  endassign  z    =   state >= s_11;endmodule

有没有巩固自己的状态机编码能力或者 Fast Through 呢?

Problem 143 Q3c:FSM logic

牛刀小试

本题和前一题的区别在于,本题的当前状态于端口输入,只需要实现三段式中的状态跳转逻辑以及输出逻辑,不需要实现状态触发器。

我看过了,状态转移同上一题相同

解答与分析

module top_module (input clk,input [2:0] y,input x,output Y0,output z
);`define STT_W 3`define STT_W1 `STT_W - 1wire [`STT_W1:0]   state = y;reg [`STT_W1:0]   nxt_state;localparam IDLE  = `STT_W'd0;localparam s_1   = `STT_W'd1;localparam s_10  = `STT_W'd2;localparam s_11  = `STT_W'd3;localparam s_100 = `STT_W'd4;// State transition logic (combinational)always @(*) begincase (state)IDLE:beginif(x)nxt_state = s_1;elsenxt_state = IDLE;ends_1:beginif(x)nxt_state = s_100;elsenxt_state = s_1;ends_10:beginif(x)nxt_state = s_1;elsenxt_state = s_10;ends_11:beginif(x)nxt_state = s_10;elsenxt_state = s_1;ends_100:beginif(x)nxt_state =s_100;elsenxt_state = s_11;enddefault: beginnxt_state = IDLE;endendcaseendassign  Y0   =   nxt_state[0];assign  z    =   state >= s_11;endmodule

输入端口中的 y 输入当前状态,按照题目要求输出次状态最低位 Y0

Problem 144 Q6b:FSM next-state logic

牛刀小试

下图为状态机状态转移图。本题需要根据状态转移图以及输入的当前状态 y[3:1]实现状态跳转逻辑,输出次状态的一部分 Y2.

状态机中共有 6 个状态 A - F 分别用 000,001... 101 表示。使用二进制方式编码状态。

解答与分析

module top_module (input [3:1] y,input w,output Y2);`define STT_W 3`define STT_W1 `STT_W - 1wire [`STT_W1:0]   state = y;reg [`STT_W1:0]   nxt_state;localparam sA  = `STT_W'd0;localparam sB  = `STT_W'd1;localparam sC  = `STT_W'd2;localparam sD  = `STT_W'd3;localparam sE  = `STT_W'd4;localparam sF  = `STT_W'd5;// State transition logic (combinational)always @(*) begincase (state)sA:beginif(w)nxt_state = sA;elsenxt_state = sB;endsB:beginif(w)nxt_state = sD;elsenxt_state = sC;endsC:beginif(w)nxt_state = sD;elsenxt_state = sE;endsD:beginif(w)nxt_state = sA;elsenxt_state = sF;endsE:beginif(w)nxt_state = sD;elsenxt_state = sE;endsF:beginif(w)nxt_state = sD;elsenxt_state = sC;enddefault: beginnxt_state = sA;endendcaseendassign  Y2   =   nxt_state[1];endmodule

值得注意的是 Y2 输出的是对应 Y[2] 的次态,但 Y 在输入时取的是 Y[3:1] ,所以 Y2 取次态 nxt_state[1] 而不是 nxt_state[2]。


状态机的题目似乎愈发简单,说明读者你已掌握了其中的精髓。但不要忽视其中的细节,要细品~

verilog 简单module_HDLBits:在线学习 Verilog (二十九 · Problem 140-144)相关推荐

  1. JavaScript学习(二十九)—JS常用的事件

    JavaScript学习(二十九)-JS常用的事件 一.页面相关事件 onload事件:当页面中所有的标签都加载完成后厨房该事件,格式:window.onload <body><sc ...

  2. verilog 计数器_HDLBits: 在线学习 Verilog ()

    本系列文章将向大家推荐一个学习 Verilog 的好去处:HDLBits. HDLBits 在提供 Verilog 基础语法教程的同时,还能够在线仿真你的 Verilog 模块,将你的输出与正确的时序 ...

  3. 深度学习(二十九)——Normalization进阶, CTC

    Normalization进阶 和Batch Normalization类似的概念还有Weight Normalization和Layer Normalization. Batch Normaliza ...

  4. 深度学习(二十九)Batch Normalization 学习笔记

    Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce 一.背景意义 ...

  5. 系统学习深度学习(二十九)--模型压缩

    参考:https://blog.csdn.net/wspba/article/details/75671573 若有不对,欢迎指正,先谢了 目前,通常意义上的网络模型压缩,主流思路有两个方向,一个是设 ...

  6. 凸优化学习-(二十九)有约束优化算法——增广拉格朗日法、交替方向乘子法(ADMM)

    凸优化学习 我们前面说过,拉格朗日法在实际中应用不大.为什么呢?因为 α \alpha α的取值很难取,这就导致拉格朗日法鲁棒性很低,收敛很慢,解很不稳定.于是就有了今天的增广拉格朗日法和ADMM. ...

  7. 嵌入式Linux系统编程学习之二十九线程的互斥

    文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言   在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...

  8. OpenFire源码学习之二十九:openfire集群配置

    集群 Openfire的给集群提供了多种方案.一种是基于Hazelcast插件,还有基于Oracle的coherence插件. Oracle的coherence插件中文开发文档:http://down ...

  9. opencv学习笔记二十九:SIFT特征点检测与匹配

    SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points) ...

最新文章

  1. Linux文本比较命令:diff
  2. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第9章-固定翼飞行器的编队跟踪与队形旋转控制
  3. 说说后台开发的一些事
  4. html禁止文本选择,[译]用CSS来禁止文本选择
  5. vim插件推荐之auto-pairs
  6. boost::qvm::deduce_scalar相关的测试程序
  7. 【Redis学习】Redis管理命令总结
  8. html4废弃了哪些元素,HTML中的一些废弃元素_html
  9. Java学习笔记7-2——注解与反射
  10. MySQL工作笔记-使用rand生成随机数及用随机数填充记录
  11. c语言迷宫求解毕业设计,毕业设计(论文)-基于Windows平台C语言实现迷宫游戏的设计.doc...
  12. 关于投篮的数学建模模型_数学建模 投篮命中率的数学模型
  13. python :编写装饰器
  14. latex放一张大图在作者和正文之间
  15. JS中的运算符号(加号)
  16. tf.keras.metrics.Accuracy;tf.keras.metrics.Precision;tf.keras.metrics.Recall
  17. mtk智能机平台LCM,CTP的ESD防护处理
  18. 【Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)屏幕水幕特效的实现
  19. treeShaking和sideEffects详解
  20. 2023届暑期实习京东二面

热门文章

  1. 3D开发-AR.js 自定义Marker
  2. Unigam标注和Ngram标注
  3. Web 前端知识体系精简
  4. 《Java技术》第七次作业计科1501赵健宇
  5. CSS3学习笔记(3)—左右飞入的文字
  6. asp.net页面中Menu控件下拉菜单被frame挡住和iframe自适应高度的解决办法
  7. linux系统中make install 时指定安装路径
  8. Android-JNI开发系列《五》局部引用全局引用全局弱引用缓存策略
  9. java jxdatepicker_在Java Swingx中修剪JXDatePicker
  10. Android项目持续集成之Jenkins的使用