状态机

昨天飞哥要求在画完电梯状态转移图之后,写一个.v文件。奈何笔者知识浅薄,看过的状态机写法早已忘记,今天一大早带了本书,在工位上看。
首先状态机主要要处理的是,下一个状态以及输出信号,他们都是输入信号和当前状态的表达式。
状态机主要分为__Mealy__和__Moore__两种,区别在于,Mealy状态机的输出由输入以及当前状态决定,而Moore状态机的输出只由当前状态决定。
写状态机一本遵循的经典的三段式,就拿我今天写的为例:

module lift_status(input   clk,input   reset,input   emergency,input   up,input   down,input   open,input   close,input   arrive,output  elevator_up,output  elevator_down,output  elevator_stop,output  door_open,output  door_close,output  alarm);parameter [2:0]  POWEROFF  = 3'b000;STATIC    = 3'b001;UP        = 3'b010;DOWN      = 3'b011;ARRIVE    = 3'b100;OPEN      = 3'b101;CLOSE     = 3'b110;EMERGENCY = 3'b111;reg [2:0] curr_state;reg [2:0] next_state;// first segment: state transferalways@(posedge clk or negedge reset)beginif(!reset)curr_state <= POWEROFF;elsecurr_state <= next_state;end// second segment: transfer conditionalways @ (curr_state, emergency, on, open, up, down, arrive, close)beginif(emergency)beginnext_state = EMERGENCY;endelsebegincase(curr_state)POWEROFF: beginif(on)   next_state = STATIC;else              next_state = POWEROFF;endSTATIC:beginif(open)          next_state = OPEN;else if(up)       next_state = UP;else if(down)     next_state = DOWN;else              next_state = STATIC;endUP:beginif(arrive)        next_state = ARRIVE;else              next_state = UP;endDOWN:beginif(arrive)        next_state = ARRIVE;else              next_state = DOWN;endARRIVE:beginnext_state = OPEN;endOPEN:beginif(!open&&close)  next_state = CLOSE;else              next_state = OPEN;endCLOSE:beignif(open)          next_state = OPEN;else              next_state = STATIC;enddefault:                next_state = STATIC;endcaseendend// third segment: state outputassign elevator_up = (curr_state == UP) ? 1 : 0;assign elevator_down = (curr_state == DOWN) ? 1 : 0;assign elevator_stop = ((curr_state == EMERGENCY) || (curr_state == ARRIVE)) ? 1 : 0;assign door_open = (curr_state == OPEN) ? 1 : 0;assign door_close = (curr_state == CLOSE) ? 1 : 0;assign alarm = (curr_state == EMERGENCY) ? 1 : 0;endmodule

主要分为三段,第一段描述的是状态转移,第二段描述的是下一个状态的根据当前状态以及输入的变化,这个根据状态转移图可以十分轻松的写出,第三段描述的是各个状态的输出,可以用assign直接实现。

但是飞哥看完之后说我的命名不符合规范,让我去阅读一些命名规范QAQ。

Coding style

统一的代码风格可以使代码有更好的可读性,方便同事之前协调运作。
本风格基于verilog-2001标准。

file header包含以下的内容:

  • copyright
  • filename: 文件名
  • proj: 所属项目名
  • author: 初创作者
  • created on: 创建时间
  • last modified:
  • $ID$
  • abstract: 功能简介

PARAMETER & LOCALPARAM

  • parameter

      module XXX#(parameter DWIDTH = 32,parameter DDEPTH = 16)
    
  • localparam

      localparam IDLE = 2'b00,S0   = 2'b01;localparam适用于状态机,模块调用时不能修改localparam的值
    

端口声明

module xxx
#(parameter DWIDTH = 32,parameter DDEPTH = 16)
(input wire clock_core,input wire reset_coren,input wire con0,input wire con1,input wire con2,input wire con3,input wire  [IWIDTH-1:0]   din,output reg [OWIDTH-1:0]  dout,output reg                          test,output wire                         ttest
);

端口声明部分默认的数据类型wire不要省略。

状态机

localparam   IDLE = 2'b00,S0    = 2'b01,S1    = 2'b10,S2    = 2'b11;reg [1:0]    cur_state;
reg [1:0]   nxt_state;reg [OWIDTH-1:0]  dout_p;always @(posedge clock_core or negedge reset_coren) beginif(!reset_coren)   begincur_state <= IDLE;endelse  begincur_state <= nxt_state;end
endalways @(*) begin:  FSMnxt_state    = cur_state;case(cur_state)

fool-proof和default机制重复,建议保留fool-proof,省略default
好处:节省代码长度,同时对检查代码覆盖率有帮助

状态机比较复杂的情况下,在不影响功能的情况下,可以适当省略

给nxtState的begin end加上名称,比如FSM,方便verdi查看代码时候找到状态机部分

缩写列表

RTL代码信号太长的时候,比如gmac_write_data_valid,可以考虑在不引起歧义,将其进行缩写gmac_wr_data_vld。

信号命名规则(待阅读)

  1. 时钟信号命名规则
    通用规则 clock + function + destionation
    clock_gmac_rx0_gamc0

定义寄存器的输出

其他一些基本规则

tab = 3个空格
缩进采用3个空格
begin放在行尾,不用另起一行
敏感列表采用 always@(*)的形式
no latch, no casez or casex
不能存在不同always对同一个变量赋值

状态机拆解

昨天电梯的状态机,可以拆解为两个状态机,其中一个状态机输出一个值之后,对另一个状态机进行控制。可以分为楼层以及电梯

实习日记02 #coding style #状态机相关推荐

  1. Linux 内核Coding Style整理

    总结linux内核开发的coding style, 便于以后写代码时参考. 下面只是罗列一些规则, 具体说明可以参考: 内核源码(Documentation/CodingStyle) 01 - 缩进 ...

  2. Verilog coding style

    Coding Style 1. 文件书写规范 1.1 文件头格式 文件头包含三部分内容: 版权信息声明,该部分保持不变: 文件描述:包括文件名.版本信息.日期.作者,特别关注Description项, ...

  3. 谈谈Linux内核驱动的coding style

    2019独角兽企业重金招聘Python工程师标准>>> 最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多 ...

  4. Linux Kernel Coding Style

    2019独角兽企业重金招聘Python工程师标准>>> Linux kernel coding styleThis is a short document describing th ...

  5. python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准...

    python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...

  6. [Coding Style] CSS coding style

    CSS coding style Note 结合实际工作中的规范和推荐大家使用的CSS书写规范.顺序这篇文章整合而成 Navigation CSS 书写顺序 CSS 常用文件命名 CSS 常用命名规范 ...

  7. 谈谈linux内核原理,谈谈Linux内核驱动的coding style

    最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多.当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代 ...

  8. css碎步测量,隧洞测量实习日记.doc

    隧洞测量实习日记 隧洞测量实习日记 篇一:隧道施工测量实习日记1 今天是我来到中遂股份合福高铁闽赣段七工区的第一天,是把自己所学的理论知识用到实践中来的时候了,很开心!这一天单位上的所有人对我的到来表 ...

  9. Pycharm中PEP 8 coding style violation和PEP 8 naming convetion

    Pycharm中的PEP 8 coding styleviolation和PEP 8 naming convetion violation的忽略规则(ignore code) PEP 8 coding ...

最新文章

  1. linux expect 自动交互 执行命令 超时 不完整 中断 解决方法
  2. iOS 让视图UIView 单独显示某一侧的边框线
  3. 剑指offer之3-10题解
  4. 简单html5作品,最新HTML5简单入门系列精选
  5. 关于telnet: connect to address 190.168.6.6: No route to host 报错处理
  6. 响应式系统的基本原理
  7. 生产环境几个实用的命令整理(一)
  8. Zookeeper基础笔记
  9. 十大排序算法——堆排序(C语言)
  10. radius服务器认证系统,TekRadius(RADIUS服务器)
  11. 全自动电音基调查询助手软件下载完美支持32_64bit系统所有电音插件。
  12. 原生JavaScript + Canvas实现图片局部放大器
  13. ESX通过命令行重启虚拟机
  14. CSS实现最简洁的四角边框
  15. 计算机单招知识点重点,2018年度单招考试《数学》必背知识点(一).doc
  16. Excel如何将一个单元格数据拆分为多行单元格
  17. 使用python开发一个剪切视频、音频的小工具(完整案例)
  18. java机试题---2021(算法)
  19. 构建乘积数组 -- 牛客网(剑指offer)
  20. android debug set screen rotation

热门文章

  1. Linux根据关键字或日期查找日志
  2. 什么是灰度发布,灰度测试。
  3. Error !!ftp服务在禁锢本地用户在家目录后,提示远程主机关闭连接
  4. fastreport 合计函数_fastreport常用函数
  5. 个人知识管理工具试用感想
  6. Ansible自动化运维_超详细
  7. 数据库实验--数据库安全性的管理
  8. Oracle 高水位(HWM: High Water Mark) 说明
  9. 浅谈coverage
  10. 在服务器上用sendmail代发邮件