3 Star 31 Fork 3

华中科技大学操作系统团队/fpga-pynq

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

在Rocket Chip上添加对外设的支持(以uart、蓝牙为例)

注:该实例基于master分支,是master分支的补充,在pynq开发板上实现,使用其他开发板需要额外修改xdc文件

一、给Rocket Chip添加uart外设

1、修改Rocket Chip,以增加其对MMIO(Memory-mapped I/O)的支持

修改文件$REPO/common/src/main/scala/Top.scala。修改后的文件为Top.scala,修改过的地方均有modified标识。

2、修改工程顶层verilog文件,增加MMIO接口和uart接口的连接

修改文件$REPO/common/rocketchip_wrapper.v。修改后的文件为rocketchip_wrapper.v,修改过的地方均有modified标识。

3、修改xdc约束文件

修改文件$REPO/pynq-z2/src/constrs/base.xdc。在末尾加入如下两行代码映射uart接口即可。

set_property -dict { PACKAGE_PIN Y16   IOSTANDARD LVCMOS33 } [get_ports { uart_out }]; #IO_L7P_T1_34 Sch=ja_p[2]
set_property -dict { PACKAGE_PIN Y17   IOSTANDARD LVCMOS33 } [get_ports { uart_in }]; #IO_L7N_T1_34 Sch=ja_n[2]

修改后的文件为base.xdc

4、生成vivado工程

参考master分支的README.md,生成并打开vivado工程。

5、修改block design

1)打开vivado工程后,在Sourses面板点击rocketchip_wrapper左边的加号,然后再双击system_i打开block design面板。在最左边找到S_AXI端口,点击选中,然后再按ctrl+cctrl+v,这样就复制出一个同样的端口S_AXI1,点击选中这个S_AXI1,找到左边External Interface Properties面板,把Name改为MMIO_S_AXIClock Port选择ext_clk_in;选中最左侧的ext_clk_in端口,找到左边External Port Properties面板,将Frequency(Mhz)修改为50

2)在右侧电路图面板空白处点击右键,再点击Add IP...,然后输入axi interconnect,然后双击出现的搜索结果把axi interconnect放入电路图中,然后双击新出现的axi_interconnect_2,将Number of Master Interface改为1,然后点击OK

3)在右侧电路图面板空白处点击右键,再点击Add IP...,然后输入axi uartlite,然后双击出现的搜索结果把axi uartlite放入电路图中,然后双击新出现的axi_uartlite_0,将Baud Rate改为115200,然后点击OK

4)在右侧电路图面板空白处点击右键,再点击Create Port...Port name为uart_in,Direction为Input,Type为Other,点击OK。

5)在右侧电路图面板空白处点击右键,再点击Create Port...Port name为uart_out,Direction为Output,Type为Other,点击OK。

6)按照如图方式接好电路图(注意:uart_lite_0右侧的UART端口右边有个加号,需要点一下加号展开再进行连线)。

7)点击上面的Address Editor,按照如图配置地址。

8)最后,点击左下角的Generate Bitstream生成比特流文件。

之后的步骤请参考master分支的README.md,生成好boot.bin就可以了。

二、使用蓝牙模块实现与主机的通信

1)蓝牙模块配置及测试过程请参考:HC-05蓝牙模块初始化及测试

2)pynq-z2与蓝牙模块的连接,直接插到板子右侧中间相应位置即可(如图所示):

pynq-z2的接口 hc-05蓝牙模块接口
VCC VCC
GND GND
JA4 RXD
JA3 TXD

3)获取riscv-pk源码,linux系统下执行:

$ git clone https://github.com/riscv/riscv-pk.git

4)修改riscv-pk与uart相关的代码:

riscv-pk/machine/uart.c中的uart_putchar函数替换为如下函数:

void uart_putchar(uint8_t ch)
{
    volatile uint32_t *status = (void*)(uintptr_t)0x60000008;
    volatile uint32_t *tx = (void*)(uintptr_t)0x60000004;
    while (*status & 0x00000008); 
    *tx = ch;
}

riscv-pk/machine/uart.c中的uart_getchar函数替换为如下函数:

int uart_getchar()
{
  volatile uint32_t *rx = (void*)(uintptr_t)0x60000000;
  volatile uint32_t *status = (void*)(uintptr_t)0x60000008;
  while (!(*status & 0x00000001)); 
  int32_t ch = *rx;
  return ch;
}

riscv-pk/machine/minit.c的197和198行之间加入如下代码:

  uart_putchar('h');
  uart_putchar('e');
  uart_putchar('l');
  uart_putchar('l');
  uart_putchar('o');
  uart_putchar('!');

然后按照riscv-pk的方法编译riscv-pk即可(最后的make install命令不需要执行),编译好的elf文件位于riscv-pk/build/pk。然后我们将它重命名为pk-uart,将它放到uramdisk.image.gz(arm linux的文件系统,具体方法详见README末尾)里面的/home/root/目录下,然后将uramdisk.image.gz放到sd卡中替换掉原文件即可。

注:如果riscv-pk编译遇到错误,请安装最新版本的riscv工具链,并修改相应环境变量,方法详见riscv-gnu-toolchain

5)所有准备工作已经完成,此时只需要把SD卡插入pynq-z2开发板,用网线连接开发板和电脑,打开开发板电源,用手机连接上蓝牙模块,手机打开蓝牙串口助手app,连接HC-05,启动:

$ ssh root@192.168.1.5
root@zynq:~# ./fesvr-zynq pk-uart hello
hello!

此时手机上的蓝牙串口助手app也会收到hello!

空文件

简介

在pynq-z1上实现RISC-V处理器Rocket-Chip,并在其上添加各种外设。 展开 收起
Tcl 等 6 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/hustos/fpga-pynq.git
git@gitee.com:hustos/fpga-pynq.git
hustos
fpga-pynq
fpga-pynq
uart-pynq

搜索帮助

371d5123 14472233 46e8bd33 14472233