目录
第141题:Q5b:Serial two's complementer (Mealy FSM)
第145题:Q6b: FSM next-state logic
第146题:Q6c: FSM one-hot next state logic
第149题:Q2b: One-hot FSM equations
第141题:Q5b:Serial two's complementer (Mealy FSM)
module top_module
(
input clk ,
input areset ,
input x ,
output z
);
parameter A = 1'b0;
parameter B = 1'b1;
reg state;
always@(posedge clk or posedge areset)
if(areset)
state <= A;
else
case(state)
A : state <= x?B:A;
B : state <= B;
default: state <= A;
endcase
assign z = (state==A)&&(x==1) || (state==B)&&(x==0);
endmodule
第142题:Q3a:FSM
module top_module
(
input clk ,
input reset , // Synchronous reset
input s ,
input w ,
output z
);
parameter A = 1'b0;
parameter B = 1'b1;
reg state,next_state;
reg [2:0] w_shift;
reg [2:0] cnt;
always@(*)
case({state,s})
{A,1'b0} : next_state = A;
{A,1'b1} : next_state = B;
{B,1'b0} : next_state = B;
{B,1'b1} : next_state = B;
default: next_state = A;
endcase
always@(posedge clk)
if(reset)
state <= A;
else
state <= next_state;
always@(posedge clk)
if(reset)
w_shift <= 3'b0;
else if(state==B)
w_shift <= {w,w_shift[2:1]};
else
w_shift <= 3'b0;
always@(posedge clk)
if(reset)
cnt <= 3'd0;
else if(next_state == B)
if(cnt == 3'd3)
cnt <= 3'd1;
else
cnt <= cnt +1'b1;
else
cnt <= 3'd0;
assign z = (cnt==3'd1)&&((w_shift==3'b011)||(w_shift==3'b101)||(w_shift==3'b110));
endmodule
第143题:Q3b: FSM
module top_module
(
input clk ,
input reset , // Synchronous reset
input x ,
output z
);
parameter Y0 = 3'b000;
parameter Y1 = 3'b001;
parameter Y2 = 3'b010;
parameter Y3 = 3'b011;
parameter Y4 = 3'b100;
reg [2:0] state,next_state;
always@(*)
case(state)
Y0 : next_state = x?Y1:Y0;
Y1 : next_state = x?Y4:Y1;
Y2 : next_state = x?Y1:Y2;
Y3 : next_state = x?Y2:Y1;
Y4 : next_state = x?Y4:Y3;
default: next_state = Y0;
endcase
always@(posedge clk)
if(reset)
state <= Y0;
else
state <= next_state;
assign z = (state==Y3)||(state==Y4);
endmodule
第144题:Q3c: FSM logic
module top_module
(
input clk ,
input [2:0] y ,
input x ,
output Y0 ,
output z
);
reg [2:0] Y;
always@(*)
case({y,x})
4'b0000 : Y = 3'b000;
4'b0001 : Y = 3'b001;
4'b0010 : Y = 3'b001;
4'b0011 : Y = 3'b100;
4'b0100 : Y = 3'b010;
4'b0101 : Y = 3'b001;
4'b0110 : Y = 3'b001;
4'b0111 : Y = 3'b010;
4'b1000 : Y = 3'b011;
4'b1001 : Y = 3'b100;
default: Y = 3'b000;
endcase
assign z = (y==3'b011)||(y==3'b100);
assign Y0 = Y[0];
endmodule
第145题:Q6b: FSM next-state logic
module top_module
(
input [3:1] y ,
input w ,
output Y2
);
parameter A = 3'b000;
parameter B = 3'b001;
parameter C = 3'b010;
parameter D = 3'b011;
parameter E = 3'b100;
parameter F = 3'b101;
reg [3:1] Y;//next_state
always@(*)
case({y,w})
{A,1'b0} : Y = B;
{A,1'b1} : Y = A;
{B,1'b0} : Y = C;
{B,1'b1} : Y = D;
{C,1'b0} : Y = E;
{C,1'b1} : Y = D;
{D,1'b0} : Y = F;
{D,1'b1} : Y = A;
{E,1'b0} : Y = E;
{E,1'b1} : Y = D;
{F,1'b0} : Y = C;
{F,1'b1} : Y = D;
default: Y = A;
endcase
assign Y2 = Y[2];
endmodule
第146题:Q6c: FSM one-hot next state logic
module top_module
(
input [6:1] y ,
input w ,
output Y2 ,
output Y4
);
parameter A = 6'b000001;
parameter B = 6'b000010;
parameter C = 6'b000100;
parameter D = 6'b001000;
parameter E = 6'b010000;
parameter F = 6'b100000;
assign Y2 = y[1]&(~w);
assign Y4 = (y[2]&w) | (y[3]&w) | (y[5]&w) | (y[6]&w);
endmodule
第147题:Q6: FSM
module top_module
(
input clk ,
input reset , // synchronous reset
input w ,
output z
);
parameter A = 3'b000;
parameter B = 3'b001;
parameter C = 3'b010;
parameter D = 3'b011;
parameter E = 3'b100;
parameter F = 3'b101;
reg [2:0] state,next_state;
always@(*)
case({state,w})
{A,1'b0} : next_state = B;
{A,1'b1} : next_state = A;
{B,1'b0} : next_state = C;
{B,1'b1} : next_state = D;
{C,1'b0} : next_state = E;
{C,1'b1} : next_state = D;
{D,1'b0} : next_state = F;
{D,1'b1} : next_state = A;
{E,1'b0} : next_state = E;
{E,1'b1} : next_state = D;
{F,1'b0} : next_state = C;
{F,1'b1} : next_state = D;
default: next_state = A;
endcase
always@(posedge clk)
if(reset)
state <= A;
else
state <= next_state;
assign z = state==E || state==F;
endmodule
第148题:Q2a:FSM
module top_module
(
input clk ,
input reset , // Synchronous active-high reset
input w ,
output z
);
parameter A = 3'b000;
parameter B = 3'b001;
parameter C = 3'b010;
parameter D = 3'b011;
parameter E = 3'b100;
parameter F = 3'b101;
reg [2:0] state,next_state;
always@(*)
case({state,w})
{A,1'b0} : next_state = A;
{A,1'b1} : next_state = B;
{B,1'b0} : next_state = D;
{B,1'b1} : next_state = C;
{C,1'b0} : next_state = D;
{C,1'b1} : next_state = E;
{D,1'b0} : next_state = A;
{D,1'b1} : next_state = F;
{E,1'b0} : next_state = D;
{E,1'b1} : next_state = E;
{F,1'b0} : next_state = D;
{F,1'b1} : next_state = C;
default: next_state = A;
endcase
always@(posedge clk)
if(reset)
state <= A;
else
state <= next_state;
assign z = state==E || state==F;
endmodule
第149题:Q2b: One-hot FSM equations
module top_module
(
input [5:0] y ,
input w ,
output Y1 ,
output Y3
);
parameter A = 6'b000001;
parameter B = 6'b000010;
parameter C = 6'b000100;
parameter D = 6'b001000;
parameter E = 6'b010000;
parameter F = 6'b100000;
assign Y1 = y[0]&w;
assign Y3 = (y[1]&(~w)) | (y[2]&(~w)) | (y[4]&(~w)) | (y[5]&(~w));
endmodule
第150题:Q2a: FSM
module top_module
(
input clk ,
input resetn , // active-low synchronous reset
input [3:1] r , // request
output [3:1] g // grant
);
parameter A = 2'd0;
parameter B = 2'd1;
parameter C = 2'd2;
parameter D = 2'd3;
reg [1:0] state,next_state;
always@(*)
case(state)
A : if(r[1]==1'b1) next_state = B;
else if(r[2]==1'b1) next_state = C;
else if(r[3]==1'b1) next_state = D;
else next_state = A;
B : if(r[1]==1'b1) next_state = B;
else next_state = A;
C : if(r[2]==1'b1) next_state = C;
else next_state = A;
D : if(r[3]==1'b1) next_state = D;
else next_state = A;
default: next_state = A;
endcase
always@(posedge clk)
if(resetn==1'b0)
state <= A;
else
state <= next_state;
assign g = {state==D,state==C,state==B};
endmodule