搜索
bottom↓
回复: 7

【点滴积累FPGA】C语言里的状态机和HDL语言里的状态机

[复制链接]

出0入0汤圆

发表于 2011-7-3 20:10:11 | 显示全部楼层 |阅读模式
要做一个程序,首先要有思路和步骤,然后再实现.而无论是采用c语言还是pascal以及其他都是这思路和步骤的描述.同样,做为已经数字电路系统的设计,采用verilog和vhdl进行描述也是等效的,就是把你的关于电路结构的描述告诉综合器.所以我在这里只讨论思路,而不去在乎具体是那种硬件描述语言的实现.

我们做的大多数的计算机的程序都是串性执行的,而硬件描述语言的最大不同是采用了并行执行的方法.而这里要说的有限状态机器则是在思路上将并行转为串性的有效方法.

看一下一个简单的c语言程序 :
#define STATE_IDLE 0X00
#define STATE_1   OX01
#define STATE_2  0X02
#define STATE_3  0X04
static u8_t state = STATE_IDLE;
state_machine()
{
while(1){
if (state==STATE_IDLE)
{
if (getchar()=='1')
state = STATE_0X01;
}
else if (state==STATE_1)
{
if (getchar() =='2')
{
//check some input
//and output something
}}}}
认真看看上面的程序代码就可以总结出下面的几点特性:
1,这是一个死循环
2,这个程序有多个状态,下一个状态总是有当前的状态以及当前的输入所确定的.
3,每一次循环最多有一个条件if成立,执行完了条件的执行体以后就开始了下一轮的循环.
4,状态标志state要有个最初的赋值.

这种程序状态机设计方法在c语言类串性编程语言中有一定的应用,但是更多的是在硬件编程序上得到了应用.这是由于上面分析的特性决定的.

同样我们再仿照上面的c语言代码写一个verilog实现状态机的代码.

#define STATE_IDLE 4'b0000
#define STATE_1   4'b0010
#define STATE_2  4'b0100
#define STATE_3  4'b1000

always @(posedge clk or posedge rst);
reg [3:0] state ;
begin
if (rst)begin
state = 0;
//and do some other initiations
end ;
else if (state==STATE_1)
begin
if (input ==1)//illustate some conditions
begin
state=STATE_2;
end
else if ()//some other conditions
begin
//state = STATE_3;
//and do some  other thing  ext.
end
end
end

分别对应上面分析c语言程序段落的四个特性,
1,这实际也是一个死循环,是在每一个时钟周期到来的时候执行一次.
2,也有多个状态,是有输入和当前状态决定的.
3,用判断语句分支下一个状态和输出
4,在rst的上升边缘对state变量进行了初始化.

硬件状态机和单指令流机器上运行的状态相比,处理速度快以外,还可以在一个硬件芯片里面配制多个状态机,之间的通过定义wire联系起来,对一个状态机来说,其它状态机的输出可以当作一个普通的输入,和管脚输入不加区别.


有了这些知道思想,在编程的时候可以可以分两部分来设计硬件状态机,

1,首先考虑对外的接口,这要有全局的思想,要求把一个工作分成几个部分来运行并且个部分之间要有序联系,相互制约.这有点类似于工业控制上多处理器系统的设计和构造.

2.内部逻辑的实现.首先要清楚的划分几个状态,再确定转化的条件.要是比较复杂的状态机可以做出状态图.如果能把状态土做的很细微,那么编程的过程也就是一个将图形描述的逻辑用硬件语言描述出来而已.

在数字电路设计中,无论三段还是两段,无论那种都可以用类似与串性语言的有限状态机描述出来,并能很好的工作.

另外还有如何分配工作粒度和提高状态机的工作频率以及如何静态验证状态机的正确性,都是很值得思考的.以后再讨论吧.

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-7-3 23:47:47 | 显示全部楼层
顶起来,【点滴积累FPGA】系列很不错,都是楼主原创,再接再砺!!

出0入0汤圆

发表于 2011-7-4 08:56:12 | 显示全部楼层
在 VerilogHDL/VHDL 的代码中,只有声明了时钟沿触发的,才会生成用触发器实现的时序电路。
如果没有声明时钟沿触发,则生成组合逻辑电路。

出0入0汤圆

发表于 2012-3-7 22:09:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-1-15 11:10:20 | 显示全部楼层
楼主写的很不错,学习了!

出0入0汤圆

发表于 2014-1-15 21:11:22 | 显示全部楼层
顶楼主,特意把楼主以前的帖子也搜出来看了一遍

出0入0汤圆

发表于 2014-1-16 18:50:14 | 显示全部楼层
细心探究

出0入0汤圆

发表于 2015-1-31 18:29:13 | 显示全部楼层
会算法思想的人是强大的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 15:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表