HDLBits从零开始——第141题到150题答案

一系列关于有限状态机(FSM)的设计题目,包括Mealy型FSM的串行两位补码器实现,FSM的下一个状态逻辑,以及一种使用一位补码表示的FSM。这些题目涉及了状态转换逻辑、同步重置、输出逻辑等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

第141题:Q5b:Serial two's complementer (Mealy FSM)

第142题:Q3a:FSM

第143题:Q3b: FSM

第144题:Q3c: FSM logic

第145题:Q6b: FSM next-state logic

第146题:Q6c: FSM one-hot next state logic

第147题:Q6: FSM

第148题:Q2a:FSM

第149题:Q2b: One-hot FSM equations

第150题:Q2a: FSM


第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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值