说明
经常使用FPGA调试模块,需要和上位机实现通信,或者使用串口在板上验证自己的模块是否能正常工作,因为硬件上的时钟存在差异,因此好几次重新修改了串口模块去适应。为了解决这个问题,我自己写了一个模块,可以只修改两个参数就能实现适应不同FPGA硬件。
特点
- 配置简单
- 适应大部分时钟
- 自定义了一个PC-->FPGA的指令格式,且模块可以实现解码,方便PC向FPGA发指令
部分实现示例
`timescale 1ns / 1ps
// ********************************************************************
// FileName : Debug_core.v
// Author :hpy
// Email :yuan_hp@qq.com
// Date :2020年12月20日
// Description :串口调试的顶层文件,根据时钟频率和需要的串口波特率,参数
// 可自动完成配置,当解析得到 cmd和cmd_data时,valid_o输出一个clk的高电平,
// 这时读取数据是比较靠谱的。
// 串口其他参数:
// 数据位:8
// 起始位:0
// 停止位:1
// 无奇偶校验位
// --------------------------------------------------------------------
/*--------------- 例化模板 ------------------
Debug_core #(
.CLK_FREQ (12000000), //输入时钟频率
.BSP( 115200) // 波特率
) Debug_uut(
.clk(),
.rst_n(),
.wr_busy(), //写数据忙 忙==> 1
.wr(), //写使能 ,一个clk的高电平时间
.wr_data(), //写的数据,[31:0]
.valid_o(), //得到解码有效的数据,产生一个clk的高电平
.cmd(), //解析得到的指令编号
.cmd_data(), //解析得到的之灵数据
.rx_valid(), //串口接收到一个数据,产生一个clk的高点平
.rx_data(), //串口读取到的数据
.rx(),
.tx()
);
-------------------------------------------*/
完整实现:FPGA串口调试模块
上述的sv文件全右verilog语法实现,因此可将后缀直接更改为.v。
PC->FPGA指令格式
/************************************ 解码格式 *************************************** | 指令头[一个字节] | 指令编号[一个字节] | 指令数据段[4个字节] | 指令尾[一个字节] | | :--------------: | :----------------: | :-----------------: | :--------------: | | 0xAA | 0-255 | -- | 0x55 | **************************************************************************************/
仿真结果