Verilog实现一个适用于不同时钟的串口模块

说明

经常使用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        |
**************************************************************************************/

仿真结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值