1、这个题还是挺简单的,对状态机的状态更了解了 一点,其实是开始状态就那一瞬间,然后立马就到了数据1那里跟上一个题那个图一样。
完整代码如下:
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output [7:0] out_byte,
output done
); //
parameter START=0,B=1,C=2,D=3,E=4,F=5,G=6,H=7,I=8,stop=9,wate=10,dile=11;//十一种状态
reg[3:0]state,next_state;
always@(*)begin
case(state)
START:next_state=B;//开始位下一个就是数据1
B:next_state=C;//数据1->数据2
C:next_state=D;//数据2
D:next_state=E;//数据3
E:next_state=F;//数据4
F:next_state=G;//数据5
G:next_state=H;//数据6
H:next_state=I;//数据7
I:next_state=in?stop:wate;//数据8
stop:next_state=(in)?dile:START;//停止位1正常停止0就是不正常代表丢数据
wate:next_state=(in)?dile:wate;//如果被拉低就是进入了开始状态
dile:next_state=(in)?dile:START;
default next_state=wate;
endcase
end
always@(posedge clk)begin
if(reset)
state<=dile;
else begin
state<=next_state;
end
end
assign done=(state==stop);
always@(posedge clk)begin
if(state==START) //总是会延后一个状态,当前虽然是显示start其实已经发了数据1了。就像跑步时的起跑指令一样一喊开始立马就出去了
out_byte[0]=in;
else if(state==B)
out_byte[1]=in;
else if(state==C)
out_byte[2]=in;
else if(state==D)
out_byte[3]=in;
else if(state==E)
out_byte[4]=in;
else if(state==F)
out_byte[5]=in;
else if(state==G)
out_byte[6]=in;
else if(state==H)
out_byte[7]=in;
end
// New: Datapath to latch input bits.
endmodule