HDLbits 记录_Q133 Fsm serialdp

本文介绍了一个带有奇偶校验功能的串行数据接收器的设计过程,包括状态机的构建与数据路径的实现。通过增加状态机状态和引入奇偶校验模块,实现了对8位数据的有效接收及校验。

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

本题相当于是在前两题的基础上进一步升级,见[HDLbits 记录_Q131 Serial receiver][HDLbits 记录_Q132 Fsm serialdata],加入了奇偶校验位,关于奇偶校验的知识这里就不详细补充了,简而言之奇校验就是数据区域的所有高电平的个数需要为奇数,偶校验就是数据区域的所有高电平的个数需要为偶数。

本题中正确接收一个8bit数据的流程为:

  • 判断起始位
  • 接收8bit数据
  • 接收校验位
  • 判断结束位

 其中done 信号的输出条件为正确走完上面的流程并且奇校验值为1;

图中给了几个例子 

并且文章还贴心的给我们写了一个判断奇偶校验的module,直接在咱们的模块中例化即可

module parity (
    input clk,
    input reset,
    input in,
    output reg odd);

    always @(posedge clk)
        if (reset) odd <= 0;
        else if (in) odd <= ~odd;

endmodule

本题的答案也是在前两题的基础上增加逻辑构成的

主要增加的逻辑为:

  1. 增加了一个ODD状态,用来接收校验位,此处增加一个状态而不是给DATA状态增加一个计数值的目的是让结构更加清晰,另外就是后面移位寄存器的移位也不会受影响(只在DATA状态移位);
  2. 增加了一个rst信号,用来重置奇校验模块,需要注意置位rst的时机,这里选择的是next_state == IDLE;(举一个我自己的一开始写的错误例子,如果复位条件变为(curr_state == IDLE)&&(next_state == DATA),那么rst会干扰到第一个bit的计算,即在接收第一个bit的时候将模块清零);
  3. 例化了一个parity模块

直接上代码

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output [7:0] out_byte,
    output done
); //

    // Modify FSM and datapath from Fsm_serialdata
	parameter 	IDLE 	= 	3'd0;
    parameter	ODD		=	3'd1;
    parameter	DATA	=	3'd2;
    parameter	STOP	=	3'd3;
    parameter	ERROR	=	3'd4;
    
    reg	[2:0]	curr_state;
    reg	[2:0]	next_state;
    reg	[2:0]	dat_cnt;
    reg			done_r1;
    reg			rst;
    
    wire		done_r;
    wire		odd;
    
    always @(posedge clk) begin
        if(reset==1'b1) begin
       		curr_state <= IDLE;
        end
        else begin
           	curr_state <= next_state; 
        end
    end
    
    always @(*) begin
        case(curr_state)
        IDLE:begin
            if(in == 1'b0) begin
            	next_state = DATA;    
            end
            else begin
                next_state = IDLE;
            end
        end
        DATA:begin
            if(dat_cnt == 3'd7) begin
            	next_state = ODD;    
            end
            else begin
                next_state = DATA;
            end
        end
        ODD: begin
            next_state = STOP;
        end
        STOP:begin
            if( in == 1'b1) begin
               next_state = IDLE;  
            end
            else begin
               next_state = ERROR;
            end
        end
        ERROR: begin
            if( in == 1'b1) begin
               next_state = IDLE;  
            end
            else begin
               next_state = ERROR;
            end
        end
        default: next_state= IDLE;
        endcase
    end
    
    always @(posedge clk) begin
        if(reset == 1'b1) begin
        	dat_cnt <= 3'd0;    
        end
        else if(curr_state == DATA) begin
        	dat_cnt <= dat_cnt + 1'b1;
        end
        else begin
        	dat_cnt <= 3'd0;    
        end
    end
    
    always @(posedge clk) begin
        if(reset == 1'b1) begin
           done_r <= 1'b0;
        end
        else begin
            done_r <= (curr_state == STOP) && (in == 1'b1) &&(odd == 1'b1);
        end
    end
    
    assign	done = done_r;
    // New: Datapath to latch input bits.
    reg	[7:0]	out_reg;
    always @(posedge clk) begin
        if(reset) begin
            out_reg <= 8'd0;
        end
        else begin
            if(curr_state == DATA) begin
            	out_reg <={in,out_reg[7:1]};//先送低位
            end
			else begin
                out_reg <= out_reg;
            end
        end
    end
    assign out_byte = out_reg;
    

    // New: Add parity checking.
    
    always @(posedge clk) begin
        if(reset) begin
           rst <= 1'b1; 
        end
        else begin
//            if((curr_state == IDLE)&&(next_state == DATA)) begin //此复位时机错误,rst会干扰到第一个bit的计算
            if(next_state == IDLE) begin
            	rst <= 1'b1;
            end
            else begin
               rst <=1'b0; 
            end
        end
    end
    
    parity inst_parity(
        .clk(clk),
        .reset(rst),
        .in(in),
        .odd(odd));

    
endmodule

### 回答1: ethercat injection_seq_rt和injection_seq_fsm是与车辆发动系统相关的两个技术术语。 EtherCAT(以太网控制自动化技术)是一种高性能实时以太网技术,用于工业自动化中的实时控制和数据交换。其中的injection_seq_rt是指以太网注入序列实时模块,通常用于汽车发动机控制系统中的稳态控制。 另一方面,汽车发动机控制需要的很多功能都需要状态机(FSM)来实现。FSM是一种数学模型,用于描述系统的状况和它们之间的转移。因此,injection_seq_fsm就是描述汽车发动机控制系统中燃油注入状态机的模块。 总的来说,ethercat injection_seq_rt和injection_seq_fsm是两个关键技术,在汽车发动机控制系统中有着重要的作用。它们能为整个系统的运行提供稳定性和高效性,使得汽车在行驶过程中更加安全和可靠。同时,它们的应用也能够缩短汽车开发周期和提高生产效率。 ### 回答2: ethercat injection_seq_rt injection_seq_fsm是指在以太网CAT网络中,实时传输控制器(RT)和状态机(FSM)使用注入序列(injection_seq)来确定数据的传输顺序。 以太网CAT网络是一种高性能、实时性强的工业以太网,广泛应用于现代工业自动化控制系统中。传输控制器(RT)是其中的重要组成部分,它负责控制数据的传输和处理。而状态机(FSM)则是用来管理和维护实时性。 在以太网CAT网络中,注入序列(injection_seq)是用来确定数据包的发送顺序的。通过注入序列的使用,可以使数据包按照正确的顺序进行传输,并确保实时性的同时保证数据的准确性,以满足现代工业自动化控制系统对数据传输要求的严格要求。 综上所述,ethercat injection_seq_rt injection_seq_fsm是以太网CAT网络中实时传输控制器(RT)和状态机(FSM)使用注入序列(injection_seq)来确定数据的传输顺序的技术术语。它确保了数据包的实时性、正确性和可靠性,并广泛应用于现代工业自动化控制系统之中。 ### 回答3: EtherCAT是一种高性能的实时以太网通信协议,在工业控制领域得到广泛应用。其中,injection_seq_rt和injection_seq_fsm是EtherCAT通信中的两个重要概念。 injection_seq_rt是EtherCAT通信协议中的实时数据传输机制,用于实现对实时数据的高效传输。它是通过将数据分割为若干个包进行传输,并在接收端进行实时重构来实现的。 而injection_seq_fsm则是EtherCAT通信协议中的有限状态机,用于控制数据包的发送和接收。它可以根据实时网络负载和数据缓存状态,动态调整数据发送和接收的速率,从而保证数据传输的稳定性和实时性。 总的来说,EtherCAT通信协议的实时性和高效性得益于injection_seq_rt和injection_seq_fsm这两个重要机制的支持,它们共同构成了EtherCAT的核心技术。在工业控制领域,EtherCAT通信协议已经成为了众多领域专业人士和企业所信赖的通信协议,正在为工业自动化领域的发展做出日益重要的贡献。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值