之前都是用的一段式状态机,逻辑与输出混在一起,复杂点的就比较吃力了。

所以就开始着手三段式状态机。

组合逻辑与时序逻辑分开,这样就能简单许多了。

但是两者在思考方式上也有着很大的区别。

三段式,分作:状态寄存器,次态组合逻辑,输出逻辑。

以下今天写完的程序。

 //state register
always@(posedge clk)
begin
if(!rst)begin
current <= IDLE;
end
else begin
current <= next;
end
end
//next state logic
always@(S_AXIS_tready or run or current)
begin
case(current)
IDLE:if(S_AXIS_tready)begin
if(run) next = WRIT;
else next = IDLE;
end
else begin
next = IDLE;
end
WRIT:if(S_AXIS_tready)begin
if(run) next = WRIT;
else next = IDLE;
end
else begin
if(run) next = WAIT;
else next = IDLE;
end
WAIT:if(S_AXIS_tready)begin
if(run) next = WRIT;
else next = IDLE;
end
else begin
if(run) next = WAIT;
else next = IDLE;
end
default:next = IDLE;
endcase
end
//output logic
always@(posedge clk)
begin
if(!rst)begin
S_AXIS_tvalid <= 'b0;
S_AXIS_tlast <= 'b0;
S_AXIS_tdata <= 'h00000000;
Gdata <= 'h00000000;
end
else begin
case(next)
IDLE:begin
S_AXIS_tlast <= 'b0;
S_AXIS_tvalid <= 'b0;
S_AXIS_tdata <= 'h00000000;
Gdata <= 'h00000000;
end
WRIT:begin
S_AXIS_tvalid <= 'b1;
if(S_AXIS_tdata <= 'h3ff)begin
Gdata <= Gdata + 'b1;
S_AXIS_tdata <= Gdata;
end
else begin
S_AXIS_tdata <= S_AXIS_tdata;//32'h00000000;
S_AXIS_tlast <= 'b1;
end
end
WAIT:begin
S_AXIS_tlast <= 'b0;
S_AXIS_tvalid <= 'b0;
S_AXIS_tdata <= S_AXIS_tdata;
end
default:begin
S_AXIS_tvalid <= 'bx;
S_AXIS_tlast <= 'bx;
S_AXIS_tdata <= 'hx;
end
endcase
end
end

下面是改成三段式前的代码

 always@(posedge clk) begin
if(!rst) begin
S_AXIS_tvalid <= 'b0;
S_AXIS_tlast <= 'b0;
S_AXIS_tdata <= 'd0;
state <= IDLE;
end
else begin
case(state) //状态机
IDLE: begin // idle
if(start_posedge && S_AXIS_tready) begin //启动信号到来且FIFO可写
S_AXIS_tvalid <= 'b1; //设置写FIFO有效
state <= WRIT;
end
else begin
S_AXIS_tvalid <= 'b0;
Gdata <= 'h0;
state <= IDLE;
end
end
WRIT:begin
if(S_AXIS_tready) begin //FIFO可写
Gdata <= Gdata + 'b1;
// S_AXIS_tdata <= Gdata;
S_AXIS_tdata <= S_AXIS_tdata;
if(S_AXIS_tdata == 'hfff) begin //判断是否结束
S_AXIS_tlast <= 'b1;//发送最后一个数据
state <= WAIT;
end
else begin//等待数据发完
S_AXIS_tlast <= 'b0;
state <= WRIT;
end
end
else begin//等待FIFO可写
S_AXIS_tdata <= S_AXIS_tdata;
state <= WRIT;
end
end
WAIT:begin
if(!S_AXIS_tready) begin //FIFO满则等待
S_AXIS_tvalid <= 'b1;
S_AXIS_tlast <= 'b1;
S_AXIS_tdata <= S_AXIS_tdata;
state <= WAIT;
end
else begin //写入结束
S_AXIS_tvalid <= 'b0;
S_AXIS_tlast <= 'b0;
S_AXIS_tdata <= 'd0;
state <= IDLE;
end
end
default: state <= IDLE;
endcase
end
end

参考

https://www.cnblogs.com/lifan3a/articles/4583577.html

https://blog.csdn.net/jason_child/article/details/60466050

Verilog笔记.三段式状态机的更多相关文章

  1. 10010序列检测器的三段式状态机实现(verilog)

    序列检测器是时序数字电路设计中经典的教学范例,夏宇闻的<verilog数字系统设计教程>一书中有这个例子,用verilog设计一个“10010”序列的检测器.看完后我觉得F和G两个状态多余 ...

  2. 简单三段式状态机实验2-LCD12864

    此实验是在“基于I2C EPPRPM(AT24C02B) + LCD12864实验”基础上,把LCD模块里的一段式状态机改成三段式,I2C EPPROM模块暂时未改出来,一步一步来吧,改完后代码下载到 ...

  3. 简单三段式状态机实验1-SOS

    一直想从一段式状态机切换到三段式状态机,从书上和网上不断搜寻三段式案例及方法,感觉很简单,就想拿之前做过的实验把一段式改成三段式,可是写起来并非那么简单,很棘手,改完后也没有成功,尤其状态机里面的计数 ...

  4. FPGA三段式状态机的思维陷阱

    用三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下三点: 1.将组合逻辑和时序逻辑分开,利于综合器分析优化和程序维护; 2.更符合设计的思维习惯; 3.代码少,比一段式状态机更简 ...

  5. 基于FPGA的三段式状态机

    状态机分类: 通常, 状态机的状态数量有限, 称为有限状态机(FSM) .由于状态机所有触发器的时钟由同一脉冲边沿触发, 故也称之为同步状态机. 根据状态机的输出信号是否与电路的输入有关分为 Meal ...

  6. (原创)Verilog三段式状态机

    下面以上图一个简单的FSM说明三段式Verilog状态机范式: `timescale 1ns / 1ps module FSM( clk,rst_n, in1,in2, out1,out2, CS,N ...

  7. Verilog三段式状态机描述

    时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息. 状态机采用VerilogHDL语言编码,建议分为三个always段完成. 三段式建模 ...

  8. verilog 三段式状态机的技巧

    三段式代码多,但是有时钟同步,延时少,组合逻辑跟时序逻辑分开并行出错少. (1)同步状态转移 (2)当前状态判断接下来的状态 (3)动作输出 如果程序复杂可以不止三个always   .always ...

  9. 三段式状态机 [CPLD/FPGA]

    状态机的组成其实比较简单,要素大致有三个:输入,输出,还有状态. 状态机描述时关键是要描述清楚前面提高的几个状态机的要素,即如何进行状态转移:每个状态的输出是什么:状态转移是否和输入条件相关等. 有人 ...

随机推荐

  1. PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)

    题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径.   对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的.   如果最短路程 ...

  2. C. Classy Numbers

    链接 [http://codeforces.com/contest/1036/problem/C] 题意 给你l,r,让你找在这个闭区间内位数不为0不超过3的个数,1<=l,r<=1e18 ...

  3. grunt入门讲解1:grunt的基本概念和使用

    Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.老版本的 Node. ...

  4. A+B Format 思路及解题过程结果

    A+B Format 思路及解题过程结果 github链接 题目 解题思路 这个题目的难点在于每三位用逗号隔开,以及带不带负号的问题.第一个问题,我的解决办法是先通过取整来取数,再通过取余来去数.第二 ...

  5. HTTP协议(1)

    HTTP 协议笔记 1. HTTP 传输机制 HTTP 是一个应用层协议,位于 TCP 的层次之上,并且是基于 TCP 协议进行通信的,也就是说 HTTP 在每一次通信之前都要先建立 TCP 连接来保 ...

  6. Codeforces 859D - Third Month Insanity

    题意 有 \(2^n\) 个人要进行比赛,每次 \(2i\) 与 \(2i+1\) 号人进行比赛(\(i\in [0,2^{n-1})\) ).这一轮中赢的人进入下一轮.下一轮比赛的时候把进入这一轮的 ...

  7. JSP 获取真实IP地址的代码

    [转载]JSP 获取真实IP地址的代码 JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.   ...

  8. oracle 获取当前用户下的所有表名与字段信息

     select *from user_col_commentswhere substr(table_name,1,3)<>'BIN' 

  9. Android应用如何跳转到应用市场详情页面

    Android应用开发过程中,可能会有需求,比如:推广时跳转到应用市场下载应用,跳转到应用市场给自己的应用打分,跳转到应用市场更新自己的应用.那如何跳转到应用市场呢?可能跳转的方法大家都是知道的,方法 ...

  10. 【贪心策略】USACO 越野跑

    问题 H: 越野跑[贪心策略] [题面] 为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练.贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:奶牛独自进山的时间不得超 ...