Fsm serialdata

该文章详细描述了一个使用有限状态机(FSM)处理串行数据输入的模块,包括状态转换逻辑、计数器和数据存储。模块在接收到STOP信号后完成数据传输并设置output_done标志。
摘要由CSDN通过智能技术生成

题目: https://hdlbits.01xz.net/wiki/Fsm_serialdata
在这里插入图片描述
代码:
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output [7:0] out_byte,
output done
); //

// Use FSM from Fsm_serial
parameter IDLE = 0, START = 1, DATA_T = 2, STOP = 3, WRONG = 4;
reg [2:0] state, next_state;

always @(posedge clk) begin
    if(reset)
        state <= IDLE;
    else
        state <= next_state;        
end

always @(*) begin
    case(state)
        IDLE   : next_state = !in ? START : IDLE;
        START  : next_state = DATA_T;
        DATA_T : next_state = (cnt < 7) ? DATA_T : (in ? STOP : WRONG);
        STOP   : next_state = in ? IDLE : START;
        WRONG  : next_state = in ? IDLE : WRONG;
        default : next_state = IDLE;
    endcase
end

reg [3:0] cnt;
always @(posedge clk) begin
    if(reset) 
        cnt <= 4'd0;
    else begin
        if(state == START)
            cnt <= 4'd0;
        else
            cnt <= cnt + 1;
    end          
end

//output
assign done = state == STOP;

reg [7:0] data_r;
// New: Datapath to latch input bits.
always @(posedge clk) begin
    if(reset)
        data_r <= 8'd0;
    else begin
        data_r <= (next_state == DATA_T) ? {in, data_r[7:1]} : data_r;       
    end
 end

always @(*) begin
    if(done)
        out_byte <= data_r;
    else
        out_byte <= out_byte;
end

endmodule

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值