@HDLBITS刷题答案
Circuits
3.2.5 Finite State Machines
3.2.5.20 Sequence recognition(Fsm hdlc)
1.问题:
创建一个有限状态机来识别这三个序列:
输入in为0111110:其中’1‘的个数为5的时候,disc=1;
输入in为’01111110’:其中’1‘的个数为6的时候,flag=1;
输入in为’01111111……‘;其中’1‘的个数多余6的时候,err=1;
2.答案如下
module top_module(
input clk,
input reset, // Synchronous reset
input in,
output disc,
output flag,
output err);
/*******1.输入、输出、状态量、中间变量定义***********/
parameter BEGIN=3'D0, DATA=3'D1, DISC=3'D2, FLAG=3'D3, ERR=3'D4;
reg[2:0] state,next_state;
integer i;
/*******2.时序逻辑,根据下一逻辑或者复位信号来得到当前逻辑***********/
always@(posedge clk)begin
if(reset)
state<=BEGIN;
else
state<=next_state;
end
/*******3.执行状态DATA计数,根据时序图中’1‘的数量不超过6***********/
always@(posedge clk)begin
if(reset)
i<=0;
else if(next_state==DATA)
i++;
else
i<=0;
end
/*******4.组合逻辑,根据当前状态和输入in情况判断下一状态***********/
always@(state,in)begin
case(state)
BEGIN:
next_state= in ? DATA:BEGIN;
DATA :
if(in && i<6) //in=011111
next_state=DATA;
else if(in) //i=0111111...
next_state=ERR;
else if(i==6)//in=01111110
next_state=FLAG;
else if(i==5) //in=0111110
next_state=DISC;
else //in=其他,比如010...
next_state=BEGIN;
DISC: //代表in=0111110
next_state= in ? DATA:BEGIN;
FLAG: //代表in=01111110
next_state= in ? DATA:BEGIN;
ERR: //代表in=01111111
next_state= in ? ERR:BEGIN;
default:next_state=BEGIN;
endcase
end
/*******5.根据状态得出输出***********/
/* assign disc = (state == DISC);
assign err = (state == ERR);
assign flag = (state == FLAG);*/
always@(*)begin
case(state)
DISC:
begin disc=1;end
FLAG:
begin flag=1; end
ERR:
begin err=1;end
default:
begin disc=0;flag=0; err=0;end
endcase
end
endmodule
3 .后语
注释都在代码中,希望和大家共同进步,来日方长,后会有期,觉得有用的朋友们点个赞支持一下,欢迎补充!!!
3.2.5.21 Q8.Design a mealy FSM(Exams/ece241 2013 q8)
1.问题:
仅用三个状态,实现系列’101‘重叠检测
2.答案
module top_module (
input clk,
input aresetn, // Asynchronous active-low reset
input x,
output z );
//题目要求用三个状态
/*******1.输入、输出、状态量、中间变量定义***********/
parameter BEGIN=2'D0,A_STA=2'D1,B_STA=2'd2;
reg[1:0] state,next_state;
/*******2.时序逻辑,根据下一逻辑或者复位信号来得到当前逻辑***********/
always@(posedge clk ,negedge aresetn)begin
if(!aresetn)
state<=BEGIN;
else
state<=next_state;
end
/*******3.组合逻辑,根据当前状态和输入x情况判断下一状态***********/
always@(*)begin
case(state)
BEGIN: //状态x0
next_state= (x)? A_STA:BEGIN;
A_STA: //状态x1
next_state= (x)? A_STA:B_STA;
B_STA: //状态x10
next_state= (x)? A_STA:BEGIN;
default: next_state=BEGIN;
endcase
end
/*******4.根据状态得出输出***********/
//assign z=(state==B_STA) && (x==1);
always@(posedge clk ,negedge aresetn)begin
case(state)
B_STA : z=x;
default: z=0;
endcase
end
endmodule
3 .后语
注释都在代码中,希望和大家共同进步,来日方长,后会有期,觉得有用的朋友们点个赞支持一下,欢迎补充!!!