njithjw的个人空间 https://blog.eetop.cn/505866 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

两段式状态机与三段式状态机

已有 687 次阅读| 2016-11-7 00:09 |个人分类:FPGA_Verilog|系统分类:芯片设计

module fsm_2
    (
    input           clk,
    input           rst_n,
    input           enable,
    input   [2:0]   data_in,

    output  reg     data_out,
    output  reg     state0,
    output  reg     state1,
    output  reg     state2

    );

parameter DEFLT = 4'b0001;
parameter IDLE  = 4'b0010;
parameter READ  = 4'b0100;
parameter WRITE = 4'b1000;

reg     [3:0]   cur_state;
reg     [3:0]   next_state;

always @(posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        cur_state <= IDLE;
    else
        cur_state <= next_state;
end

always @(*)
begin
    case (cur_state)
        IDLE :
        begin

            state1 = 1'b0;
            state2 = 1'b0;

            if (enable)
                next_state = READ;
            else
                next_state = IDLE;

            if (enable == 1'b1)
            begin
                state0 = 1'b1;
                data_out = data_in[0];
            end
            else
            begin
                state0 = 1'b0;
                data_out = 1'b0;
            end

        end

        READ :
        begin
            state0 = 1'b0;
            state2 = 1'b0;

            if (enable)
                next_state = WRITE;
            else
                next_state = READ;

            if (enable == 1'b1)
            begin
                state1 = 1'b1;
                data_out = data_in[1];
            end
            else
            begin
                state1 = 1'b0;
                data_out = 1'b0;
            end
        end

        WRITE :
        begin
            state0 = 1'b0;
            state1 = 1'b0;

            if (enable == 1'b1)
                next_state = IDLE;
            else
                next_state = WRITE;

            if (enable == 1'b1)
            begin
                state2 = 1'b1;
                data_out = data_in[2];
            end
            else
            begin
                state2 = 1'b0;
                data_out = 1'b0;
            end
        end

        default :
        begin
            next_state = DEFLT;
            state0 = 1'b0;
            state1 = 1'b0;
            state2 = 1'b0;
            data_out = 1'b0;
        end
    endcase
end

endmodule
//--------------------------------------------------------------------------------------------
module fsm_3
    (
    input           clk,
    input           rst_n,
    input           enable,
    input   [2:0]   data_in,

    output  reg     data_out,
    output  reg     state0,
    output  reg     state1,
    output  reg     state2

    );

parameter DEFLT = 4'b0001;
parameter IDLE  = 4'b0010;
parameter READ  = 4'b0100;
parameter WRITE = 4'b1000;

reg     [3:0]   cur_state;
reg     [3:0]   next_state;

always @(posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        cur_state <= IDLE;
    else
        cur_state <= next_state;
end

always @(*)
begin
    case (cur_state)
        IDLE:
        begin
            if (enable)
                next_state <= READ;
            else
                next_state <= IDLE;
        end

        READ:
        begin
            if (enable)
                next_state <= WRITE;
            else
                next_state <= READ;
        end

        WRITE:
        begin
            if (enable == 1'b1)
                next_state <= IDLE;
            else
                next_state <= WRITE;
        end

        default: next_state <= DEFLT;
    endcase
end

always @ (posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        state0 <= 1'b0;
    else if ( (cur_state == IDLE) && (enable == 1'b1) )
        state0 <= 1'b1;
    else
        state0 <= 1'b0;
end

always @ (posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        state1 <= 1'b0;
    else if ( (cur_state == READ) && (enable == 1'b1) )
        state1 <= 1'b1;
    else
        state1 <= 1'b0;
end

always @ (posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        state2 <= 1'b0;
    else if ( (cur_state == WRITE) && (enable == 1'b1) )
        state2 <= 1'b1;
    else
        state2 <= 1'b0;
end

always @ (posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        data_out <= 1'b0;
    else if (enable == 1'b1)
    begin
        case(cur_state)
            IDLE:       data_out <= data_in[0];
            READ:       data_out <= data_in[1];
            WRITE:      data_out <= data_in[2];
            default:    data_out <= 1'b0;
        endcase
    end
    else
        data_out <= 1'b0;
end

endmodule

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 17

    评论
  • 3512

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 22:15 , Processed in 0.027602 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部