FPGA之道(67)代码中的约束信息(四)状态机的相关约束
文章目录
- 前言
- 状态机的相关约束
- fsm_extract
- fsm_style
- fsm_encoding
- enum_encoding
- safe_implementation
- safe_recovery_state
前言
这是这个话题的第四篇,最重要的前言是本文节选自:《FPGA之道》。
状态机的相关约束
通常来说,编译器默认的状态机相关约束已经足够满足我们的需求,但也有的时候我们需要对个别状态机做“特殊关照”。此时若通过修改编译选项实现,所带来的效应是全局的,不符合我们的初衷,因此掌握一些基本的状态机相关约束语法,就可以让我们更加灵活的对所描述的状态机进行实现控制。
fsm_extract
fsm_extract是关于状态机提取的综合约束,它决定编译器是否会从我们编写的HDL代码中推断出状态机的存在。它的语法如下:
-- VHDL syntax-- 第一步,先要声明fsm_extract约束;
attribute fsm_extract: string;
-- 第二步,为fsm_extract语法指定约束线网名称和属性取值;
attribute fsm_extract of <{entity_name|signal_name}> : {entity|signal} is "{yes|no}";
// Verilog syntax
(* fsm_extract = "{yes|no}" *)
// 上述约束会作用于紧随其后调用的实体、模块或信号
fsm_style
fsm_style这一综合约束决定了有限状态机的实现风格,即是基于LUT还是基于BRAM的。至于这两种实现风格到底有什么不同,大家可以回顾一下【本篇->编程思路->状态机,FPGA的灵魂->状态机的实现方式】章节。fsm_style约束的语法如下:
-- VHDL syntax
-- 第一步,先要声明fsm_style约束;
attribute fsm_style : string;
-- 第二步,为fsm_style语法指定约束线网名称和属性取值;
attribute fsm_style of <{entity_name|signal_name}> : {entity|signal} is "{lut|bram}";
// Verilog syntax
(* fsm_style = "{lut|bram}" *)
// 上述约束会作用于紧随其后调用的实体、模块或信号
fsm_encoding
fsm_encoding这一综合约束决定了状态机的状态编码方式,关于状态编码,大家可以回顾一下【本篇->编程思路->状态机,FPGA的灵魂->状态的编码方式】章节。fsm_encoding约束的语法如下:
-- VHDL syntax
-- 第一步,先要声明fsm_encoding约束;
attribute fsm_encoding : string;
-- 第二步,为fsm_encoding语法指定约束线网名称和属性取值;attribute fsm_encoding of <{entity_name|signal_name}> : {entity|signal} is"{auto|one-hot|compact|sequential|gray|johnson|speed1|user}";
// Verilog syntax
(* fsm_encoding = "{auto|one-hot|compact|sequential|gray|johnson|speed1|user}" *)
// 上述约束会作用于紧随其后调用的实体、模块或信号
enum_encoding
enum_encoding这一约束用来显式指定枚举类型中各个元素的实际数字编码表示,它主要用于人为指定VHDL语言所描述的状态机的状态编码形式,因为Verilog语言在声明状态机的状态时已经显式的为各个状态分配了数字编码。需要说明的是,enum_encoding这一约束要想生效,必须先要将fsm_encoding的属性值设置为user才行。关于enum_encoding约束的一个示例如下:
-- VHDL exampletype state_type is (s1, s2, s3, s4, s5);attribute enum_encoding of state_type : type is "001 011 010 100 111";
safe_implementation
safe_implementation这一约束是决定编译器是否采用安全模式来实现状态机。关于安全模式,大家可以回顾一下【本篇->编程思路->状态机,FPGA的灵魂->状态的编码方式->safe mode】小节。safe_implementation约束的语法如下:
-- VHDL syntax
-- 第一步,先要声明safe_implementation约束;
attribute safe_implementation : string;
-- 第二步,为safe_implementation语法指定约束线网名称和属性取值;attribute safe_implementation of {entity_name|component_name|signal_name} : {entity|component|signal} is "{yes|no}";
// Verilog syntax
(* safe_implementation = "{yes|no}" *)
// 上述约束会作用于紧随其后调用的实体、模块或信号
safe_recovery_state
如果使能了safe_implementation约束,那么编译器将会以安全模式来实现状态机,当出现非法状态时,编译器会采用其自身的规则选取状态机的某一个状态作为默认的恢复状态。不过“某一个”状态到底是状态机的哪一个状态呢?这个就不得而知了,有可能是状态机的初始化状态,也可能是上电后默认状态。当我们想显式的指定一个状态作为状态机的故障恢复状态时, safe_recovery_state约束就派上了用场,其约束语法如下:
-- VHDL syntax
-- 第一步,先要声明safe_recovery_state约束;
attribute safe_recovery_state : string;
-- 第二步,为safe_recovery_state语法指定约束线网名称和属性取值;attribute safe_recovery_state of {signal_name}:{signal} is "<value>";
// Verilog syntax
(* safe_recovery_state = "<value>" *)
// 上述约束会作用于紧随其后调用的信号
FPGA之道(67)代码中的约束信息(四)状态机的相关约束相关推荐
- FPGA之道(64)代码中的约束信息(一)保持约束
文章目录 前言 HDL中的常用约束示例 保持约束 keep keep_hierarchy 前言 这一节的内容很有意思也很有用,对于我们主动地操作我们的Verilog代码很有帮助.众所周知,通过设置工具 ...
- FPGA之道(80)静态时序分析(六)常用时序约束介绍(基于ISE的UCF文件语法)
文章目录 前言 常用时序约束介绍 时序环境约束 分组时序约束 TNM TNM_NET TIMEGRP 常用时序约束 周期约束 输入时钟周期约束 内部时钟周期约束 关联时钟周期约束 差分时钟周期约束 输 ...
- FPGA之道(78)静态时序分析(四)内部时钟相关时序分析
文章目录 前言 内部时钟相关时序分析 单时钟域时序分析 多时钟域时序分析 同源时钟的时序分析 PLL.DCM的时序分析 相关时钟的时序分析 数据用作时钟的时序分析 异步逻辑时序分析 多时钟驱动同一时钟 ...
- 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...
- java代码中获取配置文件信息数据
获取properties文件信息 -- 从properties文件中获取信息 1 创建文件对象 private static Properties config = new Properties(); ...
- FPGA之道(69)提高设计的综合性能(一)提高设计的鲁棒性
文章目录 前言 提高设计的鲁棒性 一些影响设计正常工作的原因 非法输入 环境干扰 应对方法之输入预处理 应对方法之RAM替换FIFO 应对方法之状态机超时跳转 应对方法之三模冗余 应对方法之全局复位 ...
- FPGA之道(50)复位的设计
文章目录 前言 复位的设计 为什么FPGA设计中要有复位 复位方式的分类 同步复位 异步复位 复位的设计方法 同步信号同步复位 同步信号异步复位 异步信号同步复位 异步信号异步复位 复位高扇出的解决方 ...
- FPGA之道(83)功能仿真之仿真语法(Graphic Waveform )
文章目录 前言 仿真语法 Graphic Waveform 数字波形简介 从实际到仿真 实际系统检测 软件仿真模拟 "Hello world"之Graphic Waveform 待 ...
- 在C#代码中应用Log4Net系列教程(附源代码)
Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4Net,真心不知道原来日志组件也可以做得这么灵活,当然这 ...
最新文章
- 语言编奇数和合偶数和_不同的语言怎样求解奇数和?
- mockito_使用Mockito模拟自动装配的字段
- 安装android studio出现choose an account with administrator
- linux 在文本模式下(命令模式)下,中文是乱码,如何解决?
- 笔记本移交_创建完美的设计移交
- python process 函数_Python Process创建进程的2种方法详解
- day02 pycharm 安装
- oracle 列 连续,sql 查寻某列连续的几个值是否相同
- CSS3知识点总结---transitionend
- 数学建模MATLAB之分析法(一)
- (一文读懂社交网络分析(附应用、前沿、学习资源)学习笔记)
- iOS APP安全杂谈
- mdui前端插件,有菜单对话框等
- 使用JMeter进行接口压力测试
- 跨平台数据库ODB实战3-Person类的存储、查询、更新和删除
- 【开源推荐】XMM Go语言环境中完全自主实现的第三方内存管理库
- 竣达技术UPS微信云监控基本方案
- AI智能电话机器人错误码大全解析
- JS 生成uuid(v4)
- 根号3加根号5加1用计算机怎么算,根号5等于多少怎么算
热门文章
- Spark出现java.lang.stackoverflowerror的解决方法
- 【笔记】C++ 简化位图图像操作
- matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题
- python制作ios游戏_python自动化生成IOS的图标
- 无盘服务器2个dhcp,无盘 dhcp 服务器配置
- java tm 安装在哪里,安装以及配置Java环境
- oracle10g資料庫調效,資料庫 | 簡睿隨筆 | 學習過程的紀錄與備忘
- UDP数据转发解决WiFi与有限以太网之间控制命令传递:RGBLink
- 一个“人工智能Python机器学习与深度学习”课程表
- 人工智能电磁车模如何入手?