• 正文
  • 相关推荐
申请入驻 产业图谱

【FPGA实战】一个比特转换字节模块的设计与实战

09/04 08:16
174
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、模块是什么?

在数字系统设计中,我们经常遇到这样的场景:数据以单bit串行方式到达,而后续处理模块却需要8-bit并行字节。本文分享的这个 user_bit2byte 模块,就是一个典型的串转并(Serial-to-Parallel)转换器FPGA设计中的基础组件。

核心功能

i_bit (1bit串行) ──► [ 8位移位寄存器 ] ──► o_byte (8bit并行)
     i_bit_valid ──►                         o_byte_valid (脉冲指示)

LSB-FIRST接收顺序:第1个到达的bit最终成为字节的bit0;

自动组包:每收满8个有效bit,输出一个完整字节;

握手清晰:输入用 i_bit_valid 打拍,输出用 o_byte_valid 单周期高电平脉冲通知下游。

设计要点

模块内部仅用了两个寄存器:8位移位寄存器 shift_reg 和 3位计数器 bit_cnt,逻辑非常精炼:

shift_reg <= {i_bit, shift_reg[7:1]};   // 右移,新bit进MSB

由于采用右移结构,第一个输入的bit经过7次移位后恰好落在 o_byte[0],天然实现了LSB-FIRST协议。当 bit_cnt == 7 时判定第8个bit到来,直接将 {i_bit, shift_reg[7:1]} 打入输出寄存器——一拍完成组包,零延迟切换到下一个字节,支持背靠背连续传输

此外,模块还带有 i_enable 全局使能和 i_rst 同步复位,空闲周期自动拉低 o_byte_valid 并保持内部状态,工程鲁棒性良好。

二、典型应用场景

这类串并转换模块无处不在:

单线通信协议解码:如DHT11DS18B20等传感器的单总线时序,逐bit采样后重组为字节;

ADC/DAC接口适配:某些低速串行ADC按bit输出转换结果,需要重组供DSP处理;

UART/SPI前端处理:自定义位宽串行链路的接收端;

状态信号汇聚:多路慢速开关量经一根线回传时的收集端。

三、结合仿真验证看设计正确性

配套的 testbench 覆盖了三类关键测试点:

① 复位测试:释放复位后检查 o_byte == 0 且 o_byte_valid == 0,确保初始状态干净。

② 正常传输测试:依次发送 0xA5、0xC3、0xF0、0x0F 四个测试字节,覆盖了01交替、全0/全1组合等边界pattern。发送时按LSB优先拆分:

i_bit = test_data[i][j];   // j从0开始,先发bit0

③ 抗间隔能力测试:每个bit之后随机插入0~2个空闲周期($urandom_range(0,2)),模拟真实的非连续数据流。由于设计只有在 i_bit_valid 有效时才采样和计数,空闲周期的存在完全不影响结果。

always @(posedge i_clk) begin
    if (o_byte_valid) begin
        if (o_byte === expected_byte) ... // PASS
        else error_cnt++;                 // FAIL
    end
end

监测逻辑与DUT在同一时钟域比对,收到4次 o_byte_valid 就应对应4条 [PASS] 打印,任何失配都会被 error_cnt 记录并在仿真结束时汇报,无需人工盯波形。

四、如何获取?

关注公众号:我是小灰灰的FPGA,关注我,带你从入门到精通数字逻辑设计。

后台回复(建议复制粘贴):user_bit2byte

相关推荐