原创 fpga学习日记20,状态机 任务和并行设计思想

2013-9-2 16:08 2427 18 18 分类: FPGA/CPLD 文集: 数电,FPGA学习

状态机 任务和并行思想

本文主要写了自己对 状态机 任务 并行思想和流水线设计的一些认识

 

为什么把这几个放在一块写呢

先看一个IICEEPROM的代码大致框架吧 通信线为 SDA SCL

 

Module  eeprom_w

//输入输出定义

//变量定义

//参数定义

 

Assign SDA=(out_***==1)? Sda_buf[7]  :1’bz;        //控制IIC数据线接收发送

 

Initial

Begin

    //参数初始化

End

 

Always @(negedge sys_clk) //iic产生时钟

If(复位)

    Scl<=0;

Else

    Scl=~scl;

 

Always @scl下降沿)

     如果复位 初始化某些参数

否则begin

    Casex(main_state)  //状态机

      状态1      空闲 准备跳入下一个状态

      状态2      发开始信号  (调用任务)  准备跳入下一个状态 

      状态3     发设备地址(调用任务)   准备跳入下一个状态

      状态4     发数据地址(调用任务)   准备跳入下一个状态

      状态5    发数据(调用任务)       准备跳入下一个状态

      状态6     发停止信号  (调用任务)  准备跳入下一个状态

      状态7     ACK应答信号(调用任务)准备跳入下一个状态

Default

Endcase

End

 

 

   任务1 发送IIC起始信号(代码实现)

   任务2 8位数据发到IIC总线(代码实现)

   任务3 IIC总线上读取8位数据 (代码实现)

   任务4 发送IIC结束信号(代码实现)

   任务5 发送IIC ack应答信号(代码实现)

 

Endmodule

 

20130902115222771001.jpg

 

因为通过阅读代码发现无论是UART收发器,LCD1206驱动程序还是IIC收发器的实现

1,最清晰明白的实现方法就是使用状态机(看来大部分程序都离不开它)

,2,有状态机的地方就可以通过调用任务 使程序看起来更有调理

,3,而收发器的工作运行都是并行的   我把并行称为随时准备执行 只要收到使能命令立刻执行 比如立即发送FIFO中的数据到uart  这就是fpga的优势之一吧

 

 

状态机:它不是一种电路,而是一种设计思想。我的感觉就是实现任务执行流程的控制 往往用always配合case语句实现。

Moore有限状态机:输出与输入无关,仅依赖于内部状态。

Mealy有限状态机:输出不仅决定于内部状态还跟外部输入有关。

其中要注意状态码的实现,状态码的设计会直接影响使用的逻辑资源数并影响执行速度。

常见的有二进制码00 01 10 11位值变化跨度大,枚举型1 2 3,格雷码0010 0110 0111每次变化一位但是难以理解记忆,独热码00 01 10 010 100每次1向左移动便于观察和理解。

描述方式

状态机描述方法 

状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式: 

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

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

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

一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。

 

关于描述方法看参考(一段式,两段式等)

http://keendawn.blog.163.com/blog/static/888807432011824113626238/

http://wenku.baidu.com/view/ffb87c679b6648d7c1c7466e.html

http://wenku.baidu.com/view/30f2f2dca58da0116c1749e6.html

 

 

任务:任务比函数更灵活所以在设计中得到了广泛的使用。

设计时要注意控制任务的执行顺序 执行结束时返回一个信号或修改一个变量

 否则执行顺序容易出错.

任务就是一段封装在“task-endtask”之间的程序。任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的。调用某个任务时可能需要它处理某些数据并返回操作结果,所以任务应当有接收数据的输入端和返回数据的输出端。另外,任务可以彼此调用,而且任务内还可以调用函数。

任务定义语法:                                                               

task <任务名>;

    <端口及数据类型声明语句>

    <语句1>......

endtask

注意:1)若任务中含有时延或时间控制的语句,则任务是不可综合的。 2)其他情况下的函数和任务是可以综合的。

 

 

并行与流水线:

这就和C语言的函数调用不一样

C编程中在需要的地方调用一下函数(比如uart发送) 是一步一步顺序执行的

说明: http://www.eeworld.com.cn/uploadfile/gykz/uploadfile/200803/20080328060506124.GIF

Fpga中任务借助时钟激励随时准备执行 一旦发现使能信号立即执行(比如uart发送使能)

还可以把庞大的任务分解成多个任务 小任务之间添加寄存器 

使复杂的逻辑分步完成 减少了每一步的延时

从而使系统的运行频率提高

缺点是耗费了寄存器资源

说明: http://www.eeworld.com.cn/uploadfile/gykz/uploadfile/200803/20080328060507320.GIF

 

 

   流水线设计的概念:  

  所谓流水线设计实际上就是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组暂存中间数据。K级的流水线就是从组合逻辑的输入到输出恰好有K个寄存器组(分为K级,每一级都有一个寄存器组)上一级的输出是下一级的输入而又无反馈的电路。 

20130902115245602004.jpg

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
18
关闭 站长推荐上一条 /3 下一条