一段式状态机

源码:module status(
input clk,
input rst_n,
input [9:0] sort,
input in,

output [12:0] number_i
);
reg[1:0] st;
reg [12:0] number;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
st <= 2’b00;
number<=3;
end
else
begin
case(st)
2’b00: if(in0)
st<=2’b00;
else
st<=2’b01;
2’b01: if(in
0)
begin
st<=2’b10;
number<=number+1’b1;
end
else
st=2’b01;
2’b10: if(in==0)
st<=2’b00;
else
st<=2’b01;

default:st=2'b00;
endcase	

end
end

assign number_i=number;
endmodule
激励:
`timescale 1ns/1ns
module status_tb();
reg clk;
reg rst_n;
reg [9:0] sort;
wire in;
assign in=sort[9];
initial
begin
rst_n=0;
#100 rst_n=1;
#10000 $stop;
end

initial
begin
clk=0;
end

always #10 clk<=~clk;

initial
begin
sort=10’b1011_0100_01;
end

always@(posedge clk)
begin
sort<={sort[8:0],sort[9]};
end

status status_out(
.clk(clk),
.rst_n(rst_n),
.sort(sort),
.in(in),
.number_i()

);

endmodule

检测出现10的次数,用到的是一段式状态机和一个计数器。
思想:我们将10的检测分为三个状态。
空状态:复位时进入到空状态,如果满足条件,则进入到下个状态,如果不满足,则还在空状态。
S0状态:如果满足S0状态,则进入到最后一个状态,并且计数加一。否则,还在本状态。
最后一个状态:判断下一个数为几,如果为1,则进入到S0,否则,进入到空状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值