文章目录
- 一 树莓派使用教程
- 二 树莓派串口代码
- 三 Verilog代码
- 四 quartus引脚绑定
- 五 运行效果
- 总结
分别在DE2-115开发板和树莓派上编写串口通信程序, 实现树莓派串口指令对FPGA板子上的流水灯程序的控制,控制方式自定。
一 树莓派使用教程
参考:b站树莓派教程
需要注意的几点:
1、如果遇到ping不通的情况,不要着急,把共享网络关掉,树莓派关机,再重开以及共享网络就可能会ping通,我就是在碰到这的时候没有重开,选择重新安装了几次系统都不行。最后关掉共享网络再重开就又可以了。
2、这个视频教程中,烧系统到SD卡时没有选择用户配置在过去是有默认用户名和密码。但现在已经没有了,需要在烧系统时自己设置好密码和用户,并且要开启ssh,然后后续登录使用你设定的用户和密码。
3、一般进去了会要下东西,因为官方的软件源是比较慢的,肯定需要采用换源策略,修改了文件后,一定要重启重启重启(重启一次就行),我也在这踩了几次坑!!!
4、如果需要使用gpio口,会要你下载wiringPi。可以去github上下载最新的wiringPi的zip包然后移动到vnc里去build。这样会快很多。传送门
以上便是我初步使用树莓派的血的教训。
二 树莓派串口代码
fpgaUart.c
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>int main()
{int fd =serialOpen("/dev/ttyAMA0",115200); //打开串口if(fd == -1){ //如果打开串口失败则退出程序printf("serialOpen failed!\n");return 0;}printf("serialOpen success!\n");while(1){serialPrintf(fd,"A");delay(2000);serialPrintf(fd,"B");delay(2000);}return 0;
}
编译命令
gcc -o fpgaUart fpgaUart.c -lwiringPi
三 Verilog代码
串口接收模块:uart_rx.v
module uart_rx (input clk ,input rst_n ,input din , //pc端发送给FPGA的数据output reg [7:0] dout , //发送给tx 让他串行的传出去output reg dout_vld //当这一次8bit接收完成 再传给tx
);parameter BAUD = 434 ; //使用波特率115200 发送1bit所需要的时钟周期reg [8:0] cnt_bsp ;wire add_cnt_bsp ;wire end_cnt_bsp ;reg [3:0] cnt_bit ; //计数当前到了哪一bit了 计数9bit 起始位加上数据wire add_cnt_bit ;wire end_cnt_bit ;reg din_r0 ; //同步到时钟上升沿reg din_r1 ; //打拍 延时一个时钟周期wire nedge ; //下降沿reg flag ; //计数器计数的标志 下降沿到来之后开始计数 传输数据完成了就停止计数reg [8:0] data ; //寄存数据always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_bsp <= 9'b0;endelse if(add_cnt_bsp)beginif(end_cnt_bsp)begincnt_bsp <= 9'b0;endelse begincnt_bsp <= cnt_bsp + 1'b1;endendelse begincnt_bsp <= cnt_bsp;endendassign add_cnt_bsp = flag;assign end_cnt_bsp = add_cnt_bsp && cnt_bsp == BAUD - 1;always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_bit <= 4'b0;endelse if(add_cnt_bit)beginif(end_cnt_bit)begincnt_bit <= 4'b0;endelse begincnt_bit <= cnt_bit + 1'b1;endendelse begincnt_bit <= cnt_bit;endendassign add_cnt_bit = end_cnt_bsp;assign end_cnt_bit = add_cnt_bit && cnt_bit == 8; //起始位加上8bit数据位always @(posedge clk or negedge rst_n)beginif(!rst_n)begindin_r0 <= 1'b1;din_r1 <= 1'b1;endelse begindin_r0 <= din;din_r1 <= din_r0;endendassign nedge = ~din_r0 & din_r1; always @(posedge clk or negedge rst_n)beginif(!rst_n)beginflag <= 1'b0;endelse if(nedge)beginflag <= 1'b1;endelse if(end_cnt_bit)beginflag <= 1'b0;endelse beginflag <= flag;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begindata <= 9'b0;endelse if(cnt_bsp == (BAUD >> 1) && flag)begindata[cnt_bit] <= din; //串并转换 LSBendelse begindata <= data;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begindout <= 8'b0;dout_vld <= 1'b0;endelse if(end_cnt_bit)begindout <= data[8:1]; //第0位是起始位 舍弃掉dout_vld <= 1'b1;endelse begindout <= dout;dout_vld <= 1'b0;endendendmodule
流水灯模块:led.v
module led (input clk,input rst_n,input tx,output reg[7:0] led
);wire [7:0] dout;wire dout_vld;uart_rx uart_rx_inst (.clk (clk),.rst_n (rst_n),.din (tx),.dout(dout),.dout_vld (dout_vld));always @(posedge clk or negedge rst_n) beginif(!rst_n) beginled <= 8'b0;endelse begincase (dout)8'h41 : led <= 8'b0000_0001;8'h42 : led <= 8'b0000_0010;default: led <= led;endcaseendend
endmodule
四 quartus引脚绑定
可以选择其它灯,看数据手册
五 运行效果
总结
这次实验初步使用了树莓派,了解了其创始人,是一个很伟大的人…本次串口的实验,效果不是特别好,代码多点几个灯是下载进去了,但是流水灯的效果不明显,感觉是时序上出现了一些问题。那个灯到处乱跳。但是收获挺大的,树莓派确实是个好东西。