您的位置 首页 测评

使用状态机的状态机完成层次结构化规划

利用状态机的状态机实现层次结构化设计-练习九.利用状态机的嵌套实现层次结构化设计目的:1.运用主状态机与子状态机产生层次化的逻辑设计;

操练九.运用状态机的嵌套完结层次结构化规划意图:1.运用主状态机与子状态机发生层次化的逻辑规划;
 2.在结构化规划中灵敏运用使命(task)结构。
在上一节,咱们学习了怎么运用状态机的实例。实践上,单个有限状态机操控整个逻辑电路的运转在实践规划中是不多见,往往是状态机套用状态机,然后构成树状的操控中心。这一点也与咱们发起的层次化、结构化的自顶而下的规划办法相符,下面咱们就将供给一个这样的示例以供我们学习。
该例是一个简化的EPROM的串行写入器。事实上,它是一个EPROM读写器规划中完结写功用的部分经删省得到的,去除了EPROM的发动、结束和EPROM操控字的写入等功用,只具有这样一个雏形。作业的过程是:1.地址的串行写入;2.数据的串行写入;3.给信号源应对,信号源给出下一个操作目标;4.结束写操作。经过移位令并行数据得以一位一位输出。
模块源代码:
module wriTIng(reset,clk,address,data,sda,ack);
input reset,clk;
input[7:0] data,address;
output sda,ack; //sda担任串行数据输出;
         //ack是一个目标操作结束后,模块给出的应对信号。
reg link_write; //link_write 决议何时输出。
reg[3:0] state; //主状态机的状态字。
reg[4:0] sh8out_state; //从状态机的状态字。
reg[7:0] sh8out_buf; //输入数据缓冲。
reg finish_F; //用以判别是否处理完一个操作目标。
reg ack;
parameter
idle=0,addr_write=1,data_write=2,stop_ack=3;
parameter
bit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8;
assign sda = link_write? sh8out_buf[7] : 1bz;
always @(posedge clk)
begin
if(!reset) //复位。
begin
link_write= 0;
state = idle;
finish_F = 0;
sh8out_state=idle;
ack= 0;
sh8out_buf=0;
end
else
case(state)
idle:
begin
link_write = 0;
state = idle;
finish_F = 0;
sh8out_state=idle;
ack= 0;
sh8out_buf=address;
state = addr_write;
end
addr_write: //地址的输入。
begin
if(finish_F==0)
begin shift8_out; end
else
begin
sh8out_state = idle;
sh8out_buf = data;
state = data_write;
finish_F = 0;
end
end
data_write: //数据的写入。
begin
if(finish_F==0)
begin shift8_out; end
else
begin
link_write = 0;
state = stop_ack;
finish_F = 0;
ack = 1;
end
end
stop_ack: //完结应对。
begin
ack = 0;
state = idle;
end

endcase
end
task shift8_out; //串行写入。
begin
case(sh8out_state)
idle:
begin
link_write = 1;
sh8out_state = bit0;
end
bit0:
begin
link_write = 1;
sh8out_state = bit1;
sh8out_buf = sh8out_buf1;
end
bit1:
begin
sh8out_state=bit2;
sh8out_buf=sh8out_buf1;
end
bit2:
begin
sh8out_state=bit3;
sh8out_buf=sh8out_buf1;
end
bit3:
begin
sh8out_state=bit4;
sh8out_buf=sh8out_buf1;
end
bit4:
begin
sh8out_state=bit5;
sh8out_buf=sh8out_buf1;
end

bit5:
begin
sh8out_state=bit6;
sh8out_buf=sh8out_buf1;
end
bit6:
begin
sh8out_state=bit7;
sh8out_buf=sh8out_buf1;
end
bit7:
begin
link_write= 0;
finish_F=finish_F+1;
end

endcase
end
endtask
endmodule
测验模块源代码:
`TImescale 1ns/100ps
`define clk_cycle 50
module wriTIngTop;
reg reset,clk;
reg[7:0] data,address;
wire ack,sda;
always #`clk_cycle clk = ~clk;
iniTIal
begin
clk=0;
reset=1;
data=0;
address=0;
#(2*`clk_cycle) reset=0;
#(2*`clk_cycle) reset=1;
#(100*`clk_cycle) $stop;
end
always @(posedge ack) //接收到应对信号后,给出下一个处理目标。
begin
data=data+1;
address=address+1;
end
writing writing(.reset(reset),.clk(clk),.data(data),
.address(address),.ack(ack),.sda(sda));
endmodule
仿真波形:[[wysiwyg_imageupload:252:height=174,width=496]]
操练:模仿上例,编写一个完结EPROM内数据串行读取的模块。编写测验模块,给出仿真波形。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/179602.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部