面试题记录1

题目:

给定一个输入序列01101001101101101找出序列为1101并统计其个数。请用有限状态机(FSM)实现。

解题:

代码:

bash 复制代码
module sequence_detector(
    input wire clk,    // 时钟信号
    input wire reset,  // 复位信号
    input wire seq_in, // 输入序列
    output reg [3:0] count // 计数器
);

    // 状态编码
    parameter S0 = 4'b0000, // 初始状态
              S1 = 4'b0001, // 检测到 '1'
              S11 = 4'b0011, // 检测到 '11'
              S110 = 4'b0110, // 检测到 '110'
              S1101 = 4'b1101; // 检测到 '1101'

    reg [3:0] current_state, next_state;

    // 状态转移:根据时钟上升沿或复位信号进行状态转移
    always @(posedge clk or posedge reset) begin
        if (reset) begin
            current_state <= S0;
            count <= 0;
        end else begin
            current_state <= next_state;
        end
    end

    // 下一个状态逻辑:根据当前状态和输入序列计算下一个状态
    always @(*) begin
        case (current_state)
            S0: begin
                if (seq_in == 1)
                    next_state = S1;
                else
                    next_state = S0;
            end
            S1: begin
                if (seq_in == 1)
                    next_state = S11;
                else
                    next_state = S0;
            end
            S11: begin
                if (seq_in == 0)
                    next_state = S110;
                else
                    next_state = S11;
            end
            S110: begin
                if (seq_in == 1)
                    next_state = S1101;
                else
                    next_state = S0;
            end
            S1101: begin
                if (seq_in == 1)
                    next_state = S11;
                else
                    next_state = S0;
            end
            default: next_state = S0;
        endcase
    end

    // 输出逻辑:当达到状态S1101时增加计数器
    always @(posedge clk or posedge reset) begin
        if (reset) begin
            count <= 0;
        end else if (current_state == S1101) begin
            count <= count + 1;
        end
    end

endmodule

仿真模块:

bash 复制代码
// 测试模块
module tb_sequence_detector;
    // 测试信号
    reg clk;
    reg reset;
    reg seq_in;
    wire [3:0] count;

    // 实例化序列检测器
    sequence_detector uut (
        .clk(clk),
        .reset(reset),
        .seq_in(seq_in),
        .count(count)
    );

    // 时钟信号生成
    always #5 clk = ~clk;

    initial begin
        // 初始化信号
        clk = 0;
        reset = 0;
        seq_in = 0;

        // 复位
        reset = 1;
        #10;
        reset = 0;

        // 提供输入序列 01101001101101101
        seq_in = 0; #10;
        seq_in = 1; #10;
        seq_in = 1; #10;
        seq_in = 0; #10;
        seq_in = 1; #10;
        seq_in = 0; #10;
        seq_in = 0; #10;
        seq_in = 1; #10;
        seq_in = 1; #10;
        seq_in = 0; #10;
        seq_in = 1; #10;
        seq_in = 1; #10;
        seq_in = 1; #10;
        seq_in = 0; #10;
        seq_in = 1; #10;
        seq_in = 1; #10;
        seq_in = 0; #10;
        seq_in = 1; #10;

        // 结束仿真
        #50;
        $finish;
    end
endmodule

结果正确:

解析:

1、状态定义:

定义FSM的不同状态来表示已经检测到的序列部分。

S0:初始状态

S1:检测到一个1

S11:检测到11

S110:检测到110

S1101:检测到1101(目标序列)

2、状态转移:根据输入位和当前状态确定下一个状态。

3、计数逻辑:每当FSM到达目标状态S1101时,增加计数器。

相关推荐
千寻xun6 小时前
三、实战篇-NVME SSD控制之FPGA实现(一)
fpga开发·nvme ssd·nvme协议
XMAIPC_Robot9 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
upper202010 小时前
从零开始设计riscv cpu记录之七
fpga开发·riscv·riscv设计·btb·分支预测
ARM|X86+FPGA工业主板厂家14 小时前
AI视觉跟随运动控制实战|RK3588 NPU检测+FPGA EtherCAT多轴联动精准跟随方案,适用于半导体视觉对位等
人工智能·fpga开发·硬件工程·ethercat·实时系统
XMAIPC_Robot18 小时前
RK3588+FPGA半导体设备量产踩坑大全|发热、时序漂移、推理抖动、成像干扰、EMC干扰方案
人工智能·嵌入式硬件·fpga开发·arm+fpga
凡亿卓达方案设计1 天前
FPGA硬件开发怎么选靠谱方案商?
fpga开发
Eloudy2 天前
QSFP28、RoCEv2、RFSoC-4x2 数据传输与器件链路
网络·fpga开发·rocev2
Echo_cy_2 天前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
現実君2 天前
关于MCU下位替换FPGA的经验与方案
单片机·嵌入式硬件·fpga开发
Terasic友晶科技2 天前
【教程】Agilex 5 SoC 的两种启动模式的开发演示(一)(FPGA Configuration First)
fpga开发·agilex 5 soc