# aes_coprocessor **Repository Path**: DG_TG/aes_coprocessor ## Basic Information - **Project Name**: aes_coprocessor - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-16 - **Last Updated**: 2026-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AES AXI4-Lite Coprocessor 基于 Verilog 的 AES 协处理器,支持 AES-128/192/256、ECB/CBC/CTR,以及加密、解密和独立密钥扩展。外部控制接口已改为 32 位 AXI4-Lite,可在 Vivado Block Design 中直接连接 JTAG to AXI Master。 > 本设计用于教学、竞赛和体系结构实验,未加入侧信道防护、密钥安全擦除或密码模块认证,不建议直接用于生产环境中的敏感数据保护。 ## 接口约定 - 地址宽度和数据宽度均为 32 位。 - 只允许一个未完成的读事务和一个未完成的写事务。 - 写地址与写数据通道独立握手,`AWVALID` 和 `WVALID` 不要求同拍。 - `WSTRB[3:0]` 保留在 AXI 接口上,但寄存器逻辑忽略它;每次写都覆盖完整 32 位。JTAG AXI32 应使用 `WSTRB=4'b1111`。 - 合法访问返回 `OKAY`,非法地址、写只读寄存器返回 `SLVERR`。 - 复位 `S_AXI_ARESETN` 低有效,与 AXI 时钟 `S_AXI_ACLK` 同步使用。 ## 关键文件 | 用途 | 文件 | |---|---| | AXI 集成顶层 | `aes_coprocesser_0716.srcs/sources_1/imports/new/top/aes2_verification.v` | | AXI4-Lite 从机和 AES 核封装 | `.../top/under_aes2_verification/aes_axi_lite_slave.v` | | 寄存器与模式控制 | `.../under_aes_apb_slave/aes_controller.v` | | AES 算法核 | `.../under_aes_apb_slave/AESDemo4.v` | | AXI/AES 仿真 | `aes_coprocesser_0716.srcs/sim_1/imports/new/tb_axi_lite_aes_slave.v` | | 创建 JTAG AXI Block Design | `aes_coprocesser_0716.srcs/scripts/create_jtag_axi_bd.tcl` | | Hardware Manager 访问示例 | `aes_coprocesser_0716.srcs/scripts/jtag_aes128_ecb.tcl` | 目录名 `under_aes_apb_slave` 是原工程遗留路径,只承载 AES 算法核和寄存器控制器,不再包含 APB 接口。 ## 寄存器映射 128 位数据按“低地址对应高位字”排列,例如 `INPUT[0] = data[127:96]`。 | 地址 | 名称 | 访问 | 说明 | |---:|---|:---:|---| | `0x00` | `IV[0]` | R/W | IV/计数器 `[127:96]` | | `0x04` | `IV[1]` | R/W | IV/计数器 `[95:64]` | | `0x08` | `IV[2]` | R/W | IV/计数器 `[63:32]` | | `0x0C` | `IV[3]` | R/W | IV/计数器 `[31:0]` | | `0x10` | `INPUT[0]` | R/W | 输入块 `[127:96]` | | `0x14` | `INPUT[1]` | R/W | 输入块 `[95:64]` | | `0x18` | `INPUT[2]` | R/W | 输入块 `[63:32]` | | `0x1C` | `INPUT[3]` | R/W | 输入块 `[31:0]` | | `0x20` | `OUTPUT[0]` | R | 输出块 `[127:96]` | | `0x24` | `OUTPUT[1]` | R | 输出块 `[95:64]` | | `0x28` | `OUTPUT[2]` | R | 输出块 `[63:32]` | | `0x2C` | `OUTPUT[3]` | R | 输出块 `[31:0]` | | `0x30` | `CONTROL` | R/W | 密钥长度、模式、操作码 | | `0x34` | `STATUS/START` | R/W | 启动和状态 | | `0x40`-`0x5C` | `KEY[0:7]` | R/W | 256 位密钥,高位字在低地址 | 短密钥在 256 位寄存器中高位对齐:AES-128 使用 `0x40`-`0x4C`,AES-192 使用 `0x40`-`0x54`,AES-256 使用全部八个字。 ### CONTROL (`0x30`) | 位 | 字段 | 编码 | |---|---|---| | `[0]` | 保留 | 写 0 | | `[2:1]` | `op` | `01` 密钥扩展;`10` 加密;`11` 解密 | | `[4:3]` | `mode` | `00` ECB;`01` CBC;`10` CTR | | `[6:5]` | `key_length` | `00` 128 位;`01` 192 位;`10` 256 位 | ```text CONTROL = (key_length << 5) | (mode << 3) | (op << 1) ``` ### STATUS/START (`0x34`) | 位 | 含义 | |---|---| | `[0]` | 写 1 启动;算核进入 busy 后由硬件清零 | | `[1]` | `done`;完成后保持为 1,再次写 `0x34` 时清零 | | `[2]` | `busy` | 软件应轮询 bit 1,不能用固定延时判断完成。 ## Vivado 与 JTAG AXI32 1. 在 Vivado 中创建或打开 RTL Project,将 `aes_coprocesser_0716.srcs/sources_1/imports/new/` 下全部 `.v` 加入 Design Sources。 2. 在 Tcl Console 执行: ```tcl source aes_coprocesser_0716.srcs/scripts/create_jtag_axi_bd.tcl ``` 脚本会创建 `aes_jtag_axi` Block Design,实例化 32 位 AXI4-Lite 模式的 `JTAG to AXI Master`,连接 `aes_axi_lite_slave`,分配基地址 `0x00000000`、范围 64 KiB,并生成 `aes_jtag_axi_wrapper` 顶层。 3. 加入 `aes_coprocesser_0716.srcs/constrs_1/imports/new/aes2_verification_1012.xdc`,确认 `sys_clk` 和 `sys_rst_n` 管脚适合目标板。脚本默认 AXI 时钟为 50 MHz。 4. 生成 bitstream,打开 Hardware Manager,连接并烧录 FPGA。 5. 在 Hardware Manager 的 Tcl Console 执行: ```tcl source aes_coprocesser_0716.srcs/scripts/jtag_aes128_ecb.tcl ``` 该脚本会写入 AES-128 密钥和明文,完成密钥扩展与 ECB 加密,最后读取 `0x20`-`0x2C`。期望输出为: ```text 3321DF31C431FF1E2826AA75BCCAB3F1 ``` ## 操作顺序 配置新密钥后必须先执行一次密钥扩展: 1. 写 `KEY[0:7]`,AES-128/192 密钥高位对齐。 2. 写 `CONTROL`,选择密钥长度与 `op = KEY_EXPAND`。 3. 向 `STATUS/START` 写 `1`,轮询 `done == 1`。 4. CBC/CTR 模式下写 IV 或初始计数器。 5. 写四个 `INPUT` 寄存器。 6. 写 `CONTROL`,选择密钥长度、模式与加/解密操作。 7. 向 `STATUS/START` 写 `1`,轮询 `done == 1`。 8. 读取四个 `OUTPUT` 寄存器。 CBC/CTR 连续处理时,控制器会自动更新 IV 或计数器。CTR 当前只递增低 32 位。 ## 仿真 将 `tb_axi_lite_aes_slave.v` 加入 Simulation Sources,并将 Simulation Top 设置为 `tb_axi_lite_aes_slave`。测试覆盖: - 写地址先到和写数据先到; - 寄存器整字读写; - 非法读写的 `SLVERR`; - AES-128 ECB 已知向量。 ## 当前限制 - 一次处理一个 128 位块,不包含 padding、DMA、流接口或中断。 - 单轮迭代复用,不支持每拍接收一个新块。 - `WSTRB` 不提供字节写使能,只支持 32 位整字写。 - CTR 只更新计数器低 32 位。 - 无侧信道防护、密钥零化和访问权限控制。