Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BNN FPGA Accelerator

环境要求

  • Windows PowerShell
  • Python 3.8及以上版本
  • PyTorch、torchvision、NumPy(见 software/requirements.txt)
  • Icarus Verilog(提供 iverilog 和 vvp)
  • Vivado 2018.1或兼容版本

所有命令默认从仓库根目录执行。

目录

bnn_accelerator/
├── README.md
├── LICENSE
├── .gitignore
├── docs/
│   └── BNN_FPGA_ACCELERATOR.md       # 项目介绍文章
├── params/
│   ├── w1.mem / w2.mem / w3.mem     # 三层二值权重
│   ├── th1.mem / th2.mem             # BN折叠阈值
│   ├── test_images.mem               # 1,000张RTL测试图像
│   ├── test_labels.mem               # 1,000个标签
│   └── golden_preds.mem              # Golden Reference预测
├── rtl_v2_ppa/                       # PE复用源RTL
├── rtlv2_ppa_syth/                   # 固定权重的可综合PE RTL
├── sim2/
│   ├── bnn_tb_reuse.v
│   └── run_sim.ps1                   # 一键Icarus仿真
├── software/
│   ├── train_bnn.py
│   ├── export_params.py
│   ├── golden_reference.py
│   ├── gen_v2_ppa_synth_rtl.py
│   ├── bnn_model.pth
│   └── requirements.txt
└── vivado/
    └── run_ooc.tcl                   # 一键综合、布局和路由

1. 直接运行RTL仿真

仓库已经包含模型参数和1,000张测试数据,不需要重新训练即可验证RTL。

确认Icarus Verilog可用:

iverilog -V
vvp -V

从仓库根目录运行:

powershell -ExecutionPolicy Bypass -File .\sim2\run_sim.ps1 -Images 1000

短测试可以改为:

powershell -ExecutionPolicy Bypass -File .\sim2\run_sim.ps1 -Images 10

完整回归应看到:

Accuracy        : 947 / 1000 = 94.70%
Golden agreement: 1000 / 1000
PASS: RTL matches the Phase 1 golden reference on every image.

仿真会在 sim2/ 下生成 bnn_pe_sim.vvp 和 bnn_tb_reuse.vcd,它们已加入 .gitignore。

2. 从头训练并导出权重

2.1 安装Python依赖

cd software
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

如果PowerShell禁止激活虚拟环境,可先执行:

Set-ExecutionPolicy -Scope Process Bypass

2.2 训练

python train_bnn.py `
  --epochs 50 `
  --batch-size 128 `
  --lr 3e-3 `
  --lr-schedule cosine `
  --data-dir ./data `
  --out bnn_model.pth

脚本会自动下载MNIST,并把测试准确率最高的一轮保存为 software/bnn_model.pth。

2.3 导出二值权重、BN阈值和测试数据

仍在 software/ 目录中执行:

python export_params.py `
  --model bnn_model.pth `
  --data-dir ./data `
  --out-dir ../params `
  --num-images 1000

成功标志:

All .mem files written and verified.

该步骤会覆盖 params/ 中的权重、阈值、测试图像和标签。

2.4 生成Golden Reference

python golden_reference.py `
  --model bnn_model.pth `
  --data-dir ./data `
  --params-dir ../params `
  --dump-preds ../params/golden_preds.mem

必须确认完整测试集逐张一致:

per-image agreement float vs integer: 10000/10000

2.5 生成固定权重的可综合RTL

python gen_v2_ppa_synth_rtl.py
cd ..

生成文件位于 rtlv2_ppa_syth/。每次重新训练和导出参数后,都必须重新运行该脚本,否则Vivado综合的仍是旧权重。

2.6 重新验证RTL

powershell -ExecutionPolicy Bypass -File .\sim2\run_sim.ps1 -Images 1000

重新训练后,Accuracy 可能变化,但 Golden agreement 必须为 1000 / 1000。

3. Vivado综合与实现

3.1 推荐:批处理运行

确保当前终端能够执行 vivado,然后从仓库根目录运行:

vivado -mode batch -source .\vivado\run_ooc.tcl

如果普通PowerShell找不到 vivado,请打开安装目录中的 Vivado 2018.1 Tcl Shell/Command Prompt,切换到仓库根目录后执行同一命令。

脚本会自动完成:

读取最终PE RTL和XDC
→ OOC综合
→ 逻辑优化
→ 布局
→ 物理优化
→ 路由
→ 生成DCP和报告

输出位于:

build/vivado/post_synth.dcp
build/vivado/post_route.dcp
build/vivado/utilization_post_route.rpt
build/vivado/timing_summary_post_route.rpt
build/vivado/route_status.rpt
build/vivado/drc_post_route.rpt

完成后重点检查:

  • route_status.rpt 中 nets with routing errors 是否为0;
  • timing_summary_post_route.rpt 中WNS是否大于等于0;
  • utilization_post_route.rpt 中LUT、FF、BRAM和DSP使用量。

当前设计可以完成路由,但100 MHz约束下WNS仍为负值,因此“脚本运行完成”不代表时序已经通过。

3.2 手动建立Vivado工程

如果不使用Tcl脚本,按下面配置新建RTL Project:

Part                   : xc7a200tfbv484-2
Design Top             : bnn_top_v2_synth
Constraint             : rtl_v2_ppa/bnn_top.xdc
Synthesis More Options : -mode out_of_context

只添加以下Design Sources:

rtl_v2_ppa/xnor_popcount.v
rtl_v2_ppa/threshold_compare.v
rtl_v2_ppa/argmax.v
rtlv2_ppa_syth/bnn_layer1_v2_synth.v
rtlv2_ppa_syth/bnn_layer2_v2_synth.v
rtlv2_ppa_syth/bnn_output_v2_synth.v
rtlv2_ppa_syth/bnn_top_v2_synth.v

随后添加 rtl_v2_ppa/bnn_top.xdc,依次运行 Run Synthesis 和 Run Implementation。

当前顶层直接暴露784-bit图像端口,因此只适合OOC核心PPA分析。若需要生成bitstream并上板,必须先改为串行、AXI Stream或存储器接口,并补充真实时钟和引脚约束。

4. 完整验收顺序

训练完成并生成 bnn_model.pth
→ export_params.py 回读验证通过
→ Golden Reference达到10000/10000
→ gen_v2_ppa_synth_rtl.py重新生成硬编码RTL
→ RTL仿真达到1000/1000 Golden agreement
→ Vivado综合、布局和路由完成
→ 检查资源报告、路由状态和WNS

About

一个简单的BNN硬件加速项目,主要练习PE复用

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages