打工人日报#20251124

打工人日报#20251124

状态机

1. 状态机原理

状态机是一种根据当前状态和输入信号决定下一个状态以及输出的逻辑电路。它包含以下几个关键要素:

  • 状态(States):表示系统在某一时刻的状况。例如,在一个简单的交通灯控制状态机中,状态可以是红灯、绿灯、黄灯。
  • 输入(Inputs):影响状态机状态转移的外部信号。例如,在交通灯状态机中,可能有一个定时信号作为输入,定时结束后触发状态转移。
  • 输出(Outputs):根据当前状态产生的输出信号。例如,交通灯状态机根据当前状态输出控制信号灯亮灭的信号。
  • 状态转移(Transitions):定义从一个状态到另一个状态的条件和过程。例如,当绿灯亮且定时结束时,状态从绿灯转移到黄灯。

2. 状态机设计方法

  • 确定状态:分析系统需求,确定所有可能的状态。状态数量应既能完整描述系统行为,又不过于冗余。
  • 定义输入和输出:明确影响状态转移的输入信号,以及基于当前状态产生的输出信号。
  • 制定状态转移规则:确定在不同输入条件下,状态如何转移。这通常通过状态转移表或状态转移图来描述。
  • 选择编码方式:常用的编码方式有二进制编码、格雷码、独热码等。独热码使用一位表示一个状态,虽占用更多资源,但状态译码简单,可提高设计的可靠性和速度。
  • 实现状态机:使用硬件描述语言(如 Verilog 或 VHDL)实现状态机逻辑。

3. Verilog 状态机示例 - 序列检测器假设设计一个序列检测器,检测输入信号

input_signal 中是否出现 "1101" 序列。

bash 复制代码
module sequence_detector (
    input wire clk,      // 时钟信号
    input wire rst,      // 复位信号,高电平有效
    input wire input_signal, // 输入信号
    output reg detected  // 检测到序列输出信号,高电平有效
);

// 定义状态
typedef enum reg [2:0] {
    S0 = 3'b000,
    S1 = 3'b001,
    S2 = 3'b010,
    S3 = 3'b011,
    S4 = 3'b100
} state_t;

state_t current_state, next_state;

// 状态转移逻辑
always @(posedge clk or posedge rst) begin
    if (rst)
        current_state <= S0;
    else
        current_state <= next_state;
end

// 下一状态和输出逻辑
always @(*) begin
    next_state = current_state;
    detected = 1'b0;

    case (current_state)
        S0: begin
            if (input_signal)
                next_state = S1;
        end
        S1: begin
            if (input_signal)
                next_state = S2;
            else
                next_state = S0;
        end
        S2: begin
            if (!input_signal)
                next_state = S3;
            else
                next_state = S2;
        end
        S3: begin
            if (input_signal) begin
                next_state = S4;
                detected = 1'b1;
            end else begin
                next_state = S0;
            end
        end
        S4: begin
            if (!input_signal)
                next_state = S0;
            else
                next_state = S1;
        end
        default: begin
            next_state = S0;
        end
    endcase
end

endmodule
  • 状态定义:使用 typedef enum 定义了 5 个状态 S0 到 S4。
  • 状态转移逻辑:在第一个 always 块中,根据时钟上升沿和复位信号更新当前状态。
  • 下一状态和输出逻辑:在第二个 always 块中,根据当前状态和输入信号决定下一状态,并判断是否检测到目标序列。如果检测到 "1101" 序列,detected 信号置高。

阅读

《晚熟的人》

火把与口哨

相关推荐
1560820721910 小时前
JFMRFVU3P5G的bit正常,但烧录mcs程序后加载异常
fpga开发
狂奔蜗牛(bradley)10 小时前
把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑
arm开发·人工智能·fpga开发·架构
女神下凡1 天前
芯参谋(37):EEPROM_电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
szxinmai主板定制专家2 天前
工业视觉新思路:FPGA图像预处理+RK NPU推理,实现高速缺陷检测
人工智能·嵌入式硬件·fpga开发·rk3576+codesys
FPGA小徐3 天前
【硬件实战】立创 EDA 绘制 TF/SD 卡模块电路|SPI 模式原理图 + 阻抗匹配 + PCB 布局布线全教程
单片机·嵌入式硬件·fpga开发
狂奔蜗牛(bradley)3 天前
EtherCAT DC 分布式时钟同步的 ModelSim 仿真:从帧模板到从站行为建模
人工智能·嵌入式硬件·fpga开发·架构
ALINX技术博客3 天前
8 通道同步采样 ADC!AN706 波形显示实验 【FPGA黑金云课堂】
fpga开发
szxinmai主板定制专家4 天前
RK3568+FPGA+CODESYS异构控制方案:赋能半导体设备与工业自动化升级
人工智能·fpga开发·自动化·rk3576·半导体设备
辰丁电子4 天前
allegro入门教程-菜单栏Logic
fpga开发·pcb设计·pcb工艺·layout·pcb layout
FPGA小徐4 天前
数字IC/FPGA设计基础_ILA原理与使用
fpga开发