注:该实例基于master分支,是master分支的补充,在pynq开发板上实现,使用其他开发板需要额外修改xdc文件
修改文件$REPO/common/src/main/scala/Top.scala
。修改后的文件为Top.scala,修改过的地方均有modified标识。
修改文件$REPO/common/rocketchip_wrapper.v
。修改后的文件为rocketchip_wrapper.v,修改过的地方均有modified标识。
修改文件$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
参考master分支的README.md,生成并打开vivado工程。
1)打开vivado工程后,在Sourses面板点击rocketchip_wrapper左边的加号,然后再双击system_i打开block design面板。在最左边找到S_AXI端口,点击选中,然后再按ctrl+c、ctrl+v,这样就复制出一个同样的端口S_AXI1,点击选中这个S_AXI1,找到左边External Interface Properties面板,把Name改为MMIO_S_AXI,Clock 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!
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型