状态机

状态机的基本概念

  硬件设计很讲究并行设计思想,虽然用Verilog描述的电路大都是并行实现的,但是对于实际的工程应用,往往需要让硬件来实现一些具有一定顺序的工作,这就要用到状态机的思想。

状态机就是通过不同的状态迁移来完成一些特定的顺序逻辑,硬件的并行性决定了用Verilog描述的硬件实现都是并行执行的,那么如果希望分多个时间完成一个任务,怎么办?或许可以用多个使能信号来衔接各个不同的模块,但是多少有些繁琐,状态机的提出就大大简化了这一工作。

  构成状态机的基本要素是状态机的输入、输出和状态。输入就是一些引发状态变化的条件;输出就是状态变化后引起的变化,如控制总线、地址总线和数据总线的输出值就是状态变化决定的;状态就是空闲、读、写等,他们一般是由一些逻辑值来表示。

  状态机根据其状态变化是否与输入条件相关分为两类,即Moore型状态机和Mealy型状态机。Moore型状态机的状态变化仅与当前状态有关,而与输入条件无关,Mealy型状态机的状态变化不仅与当前状态有关还取决于当前的输入条件。

  三种不同状态机写法

状态机一般有三种不同的写法,即一段式、两段式和三段式的状态机写法,他们在速度、面积、代码可维护性等各个方面互有优劣

1、好的状态机标准 状态机要安全,不会进入死循环,特别是不会进入非预期的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来,这里面有两层含义,其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM都要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态;好的状态机的设计要满足设计的面积和速度的要求,状态机的设计要清晰易懂 易维护 。

2、状态机的描述方法

状态机描述时关键是要描述清楚几个状态机的要素:如何进行状态转移;每个状态的输出是什么;状态转移的条件等。

一段式:整个状态机写到一个always模块里面,在该模块中即描述状态转移又描述状态的输入和输出;

二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移,另一个模块采用组合逻辑判断状态转移的条件,描述状态转移规律及输出。

三段式:在两个always模块描述方法基础上,使用第三个always模块。一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移的条件,描述状态转移规律,另一个always模块描述状态输出,可以用组合电路输出,也可以用时序电路输出。

复位设计

  异步复位always(@posedge clk or negedge rst)

  同步复位always(@posedge clk ) begin if(!rst)...end;与异步复位相比,同步复位没有用到存储器的CLR端口,综合出来的实际电路知识把复位信号作为输入逻辑的使能信号,那么这样的同步复位势必会额外增加FPGA内部的资源消耗。

  同步复位在时钟信号clk的上升沿触发时进行系统是否复位的判断,这降低了亚稳态出现的概率,虽然缺点在于需要消耗更多的器件资源,无法充分利用专用的复位端口CLR

FPGA重要设计思想及工程应用

  1、速度和面积互换原则

  2、乒乓操作及串并转换设计

  3、流水线设计

  4、逻辑复制与模块复用

  5、模块化设计

一般整个设计的顶层只做例化,不做逻辑,然后顶层下面会有模块ABC等,下面又可以分多个子模块。如此一来,就可以将大规模复杂系统按照一定规则划分为若干模块,然后对每个模块进行设计 输入与综合,并将实现结果约束在预先设置好的区域内,最后将所有模块的实现结果有机的组织起来,就能完成整个系统的设计。

对于顶层模块的设计,主管设计师需要完成顶层模块的设计输入与综合,这也是进行模块化设计实现阶段的第一步即初始预算。

 6、时钟设计技巧

基于FPGA的跨时钟域信号处理

简单的TestBench设计

  所谓TestBench,即测试平台,详细的说就是给待验证的设计添加激励,同时观察他的输出响应是否符合设计要求。就是要模拟一个和待验证涉及接口的各种外围设备。

  仿真测试是FPGA设计流程中必不可少的步骤,对于测试结果的判断不仅可以通过观察对比波形得到,而且可以灵活的使用脚本命令将有用的输出信息打印到终端或者产生文本进行观察,也可以写一段代码让它自动比较输出结果,总之,TestBench的设计时多种多样的,是基于行为级的语法。

简单的TestBench的搭建

  ①对被测试设计的顶层接口进行例化

  ②给被测试设计的输入接口添加激励

  ③判断被测试设计的输出响应是否满足设计要求

input转化为reg,output转换为wire

inout端口,例化时也为wire

对于激励信号的产生,只提最基本的时钟信号和复位信号的产生,时钟信号产生方式有很多,使用initial和always语句都是可以的

TestBench书写技巧

  1、封装有用的子程序

    使用task进行代码的封装,它能够和C语言的子函数一样被灵活的调用

  2、关于变量的定义

    EX1C

    EX2C

  3、HDL的并行性

    

  4、结构化TestBench

  5、读写紊乱状态

  6、防止同时调用task

时序分析基础

  1、静态时序分析基础

    静态时序分析的前提就是设计者先提出要求,然后时序分析工具才会根据特定的时序模型进行分析,即有约束才会有分析,若设计者不添加时序约束,那么时序分析就无从谈起

  2、时钟相关概念

  建立时间,是指在时钟上升沿到来之前数据必须保持稳定的时间,

  保持时间,是指时钟上升沿到来以后数据必须保持稳定的时间。

一个数据需要在时钟的上升沿被锁存,那么这个数据就必须在这个时钟上升沿的建立时间和保持时间内保持稳定。

  3、数据传输路径分析

  

基于ISE的时序约束

  

  

  

原文地址:https://www.cnblogs.com/mains-mandala/p/10573090.html