一、模块是什么?
在数字系统设计中,我们经常遇到这样的场景:数据以单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 并保持内部状态,工程鲁棒性良好。
二、典型应用场景
这类串并转换模块无处不在:
单线通信协议解码:如DHT11、DS18B20等传感器的单总线时序,逐bit采样后重组为字节;
ADC/DAC接口适配:某些低速串行ADC按bit输出转换结果,需要重组供DSP处理;
状态信号汇聚:多路慢速开关量经一根线回传时的收集端。
三、结合仿真验证看设计正确性
配套的 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
174