资源描述:
《利用状态机的状态机实现层次结构化设计.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、利用状态机的状态机实现层次结构化设计 练习九.利用状态机的嵌套实现层次结构化设计目的:1.运用主状态机与子状态机产生层次化的逻辑设计; 2.在结构化设计中灵活使用任务(task)结构。在上一节,我们学习了如何使用状态机的实例。实际上,单个有限状态机控制整个逻辑电路的运转在实际设计中是不多见,往往是状态机套用状态机,从而形成树状的控制核心。这一点也与我们提倡的层次化、结构化的自顶而下的设计方法相符,下面我们就将提供一个这样的示例以供大家学习。该例是一个简化的EPROM的串行写入器。事实上,它是一
2、个EPROM读写器设计中实现写功能的部分经删节得到的,去除了EPROM的启动、结束和EPROM控制字的写入等功能,只具备这样一个雏形。工作的步骤是:1.地址的串行写入;2.数据的串行写入;3.给信号源应答,信号源给出下一个操作对象;4.结束写操作。通过移位令并行数据得以一位一位输出。模块源代码:modulewriTIng(reset,clk,address,data,sda,ack);inputreset,clk;input[7:0]data,address;outputsda,ack; //s
3、da负责串行数据输出; //ack是一个对象操作完毕后,模块给出的应答信号。reglink_write; //link_write决定何时输出。reg[3:0]state; //主状态机的状态字。reg[4:0]sh8out_state; //从状态机的状态字。reg[7:0]sh8out_buf;//输入数据缓冲。regfinish_F;//用以判断是否处理完一个操作对象。regack;parameteridle=0,addr_write=1,data_write=2,stop_ack=3;
4、parameterbit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8;assignsda=link_write?sh8out_buf[7]:1’bz;always@(posedgeclk)beginif(!reset)//复位。beginlink_write<=0;state<=idle;finish_F<=0;sh8out_state<=idle;ack<=0;sh8out_buf<=0;endelsecase(state)idle:
5、beginlink_write<=0;state<=idle;finish_F<=0;sh8out_state<=idle;ack<=0;sh8out_buf<=address;state<=addr_write;endaddr_write://地址的输入。beginif(finish_F==0)beginshift8_out;endelsebeginsh8out_state<=idle;sh8out_buf<=data;state<=data_write;finish_F<=0;endendd
6、ata_write://数据的写入。beginif(finish_F==0)beginshift8_out;endelsebeginlink_write<=0;state<=stop_ack;finish_F<=0;ack<=1;endendstop_ack://完成应答。beginack<=0;state<=idle;end endcaseendtaskshift8_out;//串行写入。begincase(sh8out_state)idle:beginlink_write<=1;sh8ou
7、t_state<=bit0;endbit0:beginlink_write<=1;sh8out_state<=bit1;sh8out_buf<=sh8out_buf<<1;endbit1:beginsh8out_state<=bit2;sh8out_buf<=sh8out_buf<<1;endbit2:beginsh8out_state<=bit3;sh8out_buf<=sh8out_buf<<1;endbit3:beginsh8out_state<=bit4;sh8out_buf<=sh8o
8、ut_buf<<1;endbit4:beginsh8out_state<=bit5;sh8out_buf<=sh8out_buf<<1;end bit5:beginsh8out_state<=bit6;sh8out_buf<=sh8out_buf<<1;endbit6:beginsh8out_state<=bit7;sh8out_buf<=sh8out_buf<<1;endbit7:beginlink_write<=0;finish_F<=finish_F+1;end endcaseende