极术小能手 · 2022年03月13日

【课程实验 LAB2】实现你的首个SoC:硬件部分说明

实验前请点击获取配套资料

关于LAB2

  • 在本实验中, 你将动手实现一个基于 CortexM0 的 SoC 基础软硬件系统, 然后通过 Modelsim 对系统功能进行仿真, 仿真通过后, 使用 Vivado 搭建系统并将其下载配置到 FPGA 板卡中, 然后使用 Keil 进行实际上板调试.
  • 本实验旨在加深大家对基于 CortexM0 的 SoC 的理解, 熟悉各个软件的基本使用方法, 所以本实验的软件部分和硬件部分都非常简单.
  • 在进行本实验之前, 你应该已经理解了硬件设计的涵义, 掌握了四种 verilog 关键字语法: always, assign, if, case, 而且掌握了模块例化的基本方式. 另外, 你还应当对 AHB 总线协议有一定的了解.
硬件部分说明

image.png
本实验中实现的硬件结构
BRAM ?
本实验中搭建的 BRAM 用于存放程序代码, 根据 Cortex-M0 体系推荐, 其地址范围设为 0x00000000-0x0000ffff.

我需要做什么 ?
在小节中, 我们已经为你准备好了大部分的硬件设计代码, 你只需要做一些修改完善:

  • 修改总线扩展模块 "/Task2/rtl/AHBlite_Decoder.v" 中的译码模块代码, 根据 BRAM 地址范围 0x00000000-0x0000ffff 完善对应的译码逻辑.
  • 修改顶层文件 "/Task2/rtl/CortexM0_SoC.v" 代码, 连接 BRAM 接口 (AHBlite_Block_RAM) 与总线互连模块 (AHBlite_Interconnect).

如果你没有思路, 不要慌, 可以看看接下来的讲解:
image.png
cortexm0ds_logic
由 ARM 官方提供的评估版 Cortex-M0, 反向结果, 不要尝试去读懂它.

Block_RAM

  • 单端口 RAM, 输入输出数据位宽固定为 32, 存储深度可调节.
  • 使用 Vivado 提供的 IP 也可以实现 RAM, 但是不方便跨平台仿真, 考虑到本实验中需要的 RAM 功能非常简单, 适合直接通过 RTL 实现.

AHBlite_Interconnect

  • 设有 1 个主设备接口和 3 个从设备接口, 主设备接口用于连接 Cortex-M0, 从设备接口 Port0 用于连接 BRAM, Port1 和 Port2 在本实验中没有被使用到.
  • 所有设备接口均采用 AHB 协议标准.

AHBlite_Block_RAM

  • 由于总线互连接口都采用 AHB 协议标准, 不能直接与 Block_RAM 连接, 因此需要本模块作为 RAM 接口, 起到桥接的作用.

AHBlite_Decoder

  • 地址译码是总线互连模块实现从设备选择的关键, 总线根据为每个从设备划分的地址区域, 以及当前接收到的来自于 CM0 的地址 (HADDR), 使能对应的从设备. 其本质是对 HADDR 高位的译码.
  • 敲黑板: 本实验中的地址译码模块应当采用组合逻辑实现, 在编写设备使能有关的代码时, 应当注意使用 Port0_en 至 Port1_en 这几个 parameter, 以保证参数化设计, 这就要求应当根据从设备接口的使用情况合理地为 Port0_en 至 Port1_en 赋值.

AHBlite_SlaveMUX

  • 三个从设备返回的信号 (例如 HRDATA, HREADYOUT, HRESP) 进行多路选择后返回至 CM0.
  • 在本实验中已经编写完善, 可以不用管.

CortexM0_SoC

  • 顶层文件. 用于每个系统模块的互连.
  • 敲黑板: 在对 AHBlite_Block_RAM 和 AHBlite_Interconnect 的 AHB 协议接口进行连接时, 只需将同名信号连接, 并注意信号的来源和方向.

为了不影响后面的实验, 请参考标准答案:

代码修改方式

将 "/Task2/rtl/AHBlite_Decoder.v" 中的:

/*RAMCode enable parameter*/
parameter Port0_en = 0,
/************************/

改为:

/*RAMCode enable parameter*/
parameter Port0_en = 1,
/************************/

然后将:

//0x00000000-0x0000ffff
/*Insert RAMCODE decoder code there*/
assign P0_HSEL = 1'b0;
/***********************************/

改为:

//0x00000000-0x0000ffff
/*Insert RAMCODE decoder code there*/
assign P0_HSEL = (HADDR[31:16] == 16'h0000) ? Port0_en : 1'b0; 
/***********************************/

将 "/Task2/rtl/CortexM0_SoC.v" 中的:

/* Connect to Interconnect Port 0 */
.HCLK              (clk),
.HRESETn           (cpuresetn),
.HSEL              (/*Port 0*/),
.HADDR             (/*Port 0*/),
.HPROT             (/*Port 0*/),
.HSIZE             (/*Port 0*/),
.HTRANS            (/*Port 0*/),
.HWDATA            (/*Port 0*/),
.HWRITE            (/*Port 0*/),
.HRDATA            (/*Port 0*/),
.HREADY            (/*Port 0*/),
.HREADYOUT         (/*Port 0*/),
.HRESP             (/*Port 0*/),
.BRAM_WRADDR       (RAMCODE_WADDR),
.BRAM_RDADDR       (RAMCODE_RADDR),
.BRAM_RDATA        (RAMCODE_RDATA),
.BRAM_WDATA        (RAMCODE_WDATA),
.BRAM_WRITE        (RAMCODE_WRITE)
/**********************************/

改为:

/* Connect to Interconnect Port 0 */
.HCLK              (clk),
.HRESETn           (cpuresetn),
.HSEL              (HSEL_P0),
.HADDR             (HADDR_P0),
.HPROT             (HPROT_P0),
.HSIZE             (HSIZE_P0),
.HTRANS            (HTRANS_P0),
.HWDATA            (HWDATA_P0),
.HWRITE            (HWRITE_P0),
.HRDATA            (HRDATA_P0),
.HREADY            (HREADY_P0),
.HREADYOUT         (HREADYOUT_P0),
.HRESP             (HRESP_P0),
.BRAM_WRADDR       (RAMCODE_WADDR),
.BRAM_RDADDR       (RAMCODE_RADDR),
.BRAM_RDATA        (RAMCODE_RDATA),
.BRAM_WDATA        (RAMCODE_WDATA),
.BRAM_WRITE        (RAMCODE_WRITE)
/**********************************/

END

文章来源:

推荐内容

更多内容请关注微处理器系统结构与嵌入式系统设计专栏
推荐阅读
关注数
113
内容数
20
电子科技大学示范性微电子学院开设的「微处理器系统结构与嵌入式系统设计」课程配套实验,原链接:[链接]
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息