实习日记02 #coding style #状态机
状态机
昨天飞哥要求在画完电梯状态转移图之后,写一个.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。
信号命名规则(待阅读)
- 时钟信号命名规则
通用规则 clock + function + destionation
clock_gmac_rx0_gamc0
定义寄存器的输出
其他一些基本规则
tab = 3个空格
缩进采用3个空格
begin放在行尾,不用另起一行
敏感列表采用 always@(*)的形式
no latch, no casez or casex
不能存在不同always对同一个变量赋值
状态机拆解
昨天电梯的状态机,可以拆解为两个状态机,其中一个状态机输出一个值之后,对另一个状态机进行控制。可以分为楼层以及电梯
实习日记02 #coding style #状态机相关推荐
- Linux 内核Coding Style整理
总结linux内核开发的coding style, 便于以后写代码时参考. 下面只是罗列一些规则, 具体说明可以参考: 内核源码(Documentation/CodingStyle) 01 - 缩进 ...
- Verilog coding style
Coding Style 1. 文件书写规范 1.1 文件头格式 文件头包含三部分内容: 版权信息声明,该部分保持不变: 文件描述:包括文件名.版本信息.日期.作者,特别关注Description项, ...
- 谈谈Linux内核驱动的coding style
2019独角兽企业重金招聘Python工程师标准>>> 最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多 ...
- Linux Kernel Coding Style
2019独角兽企业重金招聘Python工程师标准>>> Linux kernel coding styleThis is a short document describing th ...
- python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准...
python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...
- [Coding Style] CSS coding style
CSS coding style Note 结合实际工作中的规范和推荐大家使用的CSS书写规范.顺序这篇文章整合而成 Navigation CSS 书写顺序 CSS 常用文件命名 CSS 常用命名规范 ...
- 谈谈linux内核原理,谈谈Linux内核驱动的coding style
最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多.当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代 ...
- css碎步测量,隧洞测量实习日记.doc
隧洞测量实习日记 隧洞测量实习日记 篇一:隧道施工测量实习日记1 今天是我来到中遂股份合福高铁闽赣段七工区的第一天,是把自己所学的理论知识用到实践中来的时候了,很开心!这一天单位上的所有人对我的到来表 ...
- 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 ...
最新文章
- linux expect 自动交互 执行命令 超时 不完整 中断 解决方法
- iOS 让视图UIView 单独显示某一侧的边框线
- 剑指offer之3-10题解
- 简单html5作品,最新HTML5简单入门系列精选
- 关于telnet: connect to address 190.168.6.6: No route to host 报错处理
- 响应式系统的基本原理
- 生产环境几个实用的命令整理(一)
- Zookeeper基础笔记
- 十大排序算法——堆排序(C语言)
- radius服务器认证系统,TekRadius(RADIUS服务器)
- 全自动电音基调查询助手软件下载完美支持32_64bit系统所有电音插件。
- 原生JavaScript + Canvas实现图片局部放大器
- ESX通过命令行重启虚拟机
- CSS实现最简洁的四角边框
- 计算机单招知识点重点,2018年度单招考试《数学》必背知识点(一).doc
- Excel如何将一个单元格数据拆分为多行单元格
- 使用python开发一个剪切视频、音频的小工具(完整案例)
- java机试题---2021(算法)
- 构建乘积数组 -- 牛客网(剑指offer)
- android debug set screen rotation