//此代码的注意事项,首先这个代码不能仿真成功会出现一定的时间延迟,
//因为在做板级验证的时候把时间改成了100ms发送一次,要想仿真成功,把时间改成499999
//使用上一节课设计的发送模块,设计一个数据发送器,
//每10ms以115200的波特率发送一个数据,每次发送的
//数据比前一个数据大一(计数器)
//首先是发送八位数据的uart_byte_tx的更改的源代码 //1、这里我使用的是(uart_p==uart_byte_tx)
//这两个是底层模块 module uart_p(
clk,
reset_n,
send_go,
data,
baud_set,
uart_tx,
tx_done
);
input clk;
input reset_n;
input send_go;
input [7:0] data;
input [2:0]baud_set;
output reg uart_tx;
output reg tx_done;
//书写不同波特率对应的模式
reg [17:0] bps_DR;
always@(*)
case(baud_set)
0:bps_DR=50000000/9600;
1:bps_DR=50000000/19200;
2:bps_DR=50000000/38400;
3:bps_DR=50000000/57600;
4:bps_DR=50000000/115200;
default:bps_DR=50000000/9600;
endcase //被动式读取其他模块的数据
reg send_en;
always@(posedge clk or negedge reset_n)
if(!reset_n)
send_en<=0;
else if(send_go)
send_en<=1;
else if(tx_done)
send_en<=0; //书写关于data的寄存问题
reg [7:0] r_data;
always@(posedge clk)
if(send_go)
r_data<=data;
else
r_data<=r_data; //先写一个适合波特率的定时
reg [17:0] div_cnt;
always@(posedge clk or negedge reset_n)
if(!reset_n)
div_cnt<=0;
else if(send_en)begin
if(div_cnt==bps_DR-1)
div_cnt<=0;
else
div_cnt<=div_cnt+1'b1;
end
else
div_cnt<=0;
wire bps_clk;//为什么改了位置就不出现问题了呢??????
assign bps_clk=(div_cnt==1);//放在上面就不行,还跟位置有关系。
//将时间拼接为11个时间段
reg [3:0] bps_cnt;
always@(posedge clk or negedge reset_n)
if(!reset_n)
bps_cnt<=0;
else if(send_en)begin
if(bps_clk)begin
if(bps_cnt==11)
bps_cnt<=0;
else
bps_cnt<=bps_cnt+1'b1;
end
end
else
bps_cnt<=0;
//这里一定要注意不加else bps_cnt<=0;因为条件是div_cnt==bps_DR-1,如果else就会出现bps_cnt一直为0的怪情况。 always@(posedge clk or negedge reset_n)
if(!reset_n)
uart_tx<=1'b1;
else case(bps_cnt)
1:uart_tx<=0;
2:uart_tx<=r_data[0];
3:uart_tx<=r_data[1];
4:uart_tx<=r_data[2];
5:uart_tx<=r_data[3];
6:uart_tx<=r_data[4];
7:uart_tx<=r_data[5];
8:uart_tx<=r_data[6];
9:uart_tx<=r_data[7];
10:uart_tx<=1;
11:uart_tx<=1;
default:uart_tx<=1;
endcase always@(posedge clk or negedge reset_n)
if(!reset_n)
tx_done<=0;
else if((bps_clk==1)&&(bps_cnt==10))
tx_done<=1;
else
tx_done<=0;
endmodule //2、uart_byte_tx_tb仿真代码(这里我使用的是uart_p_tb==uart_byte_tx_tb) `timescale 1ns / 1ns
module uart_p_tb();
reg clk;
reg reset_n;
reg send_en;
reg [7:0] data;
reg [2:0]baud_set;
wire uart_tx;
wire tx_done;
uart_p uart_p_inst0(
.clk(clk),
.reset_n(reset_n),
.send_en(send_en),
.data(data),
.baud_set(baud_set),
.uart_tx(uart_tx),
.tx_done(tx_done)
);
initial clk=1;
always #10 clk=~clk; initial begin
reset_n=0;
send_en=0;
data=0;
baud_set=4;
#201;
reset_n=1;
#20; send_en=1;
data=8'h57; @(posedge tx_done)
send_en=0;
#2000;
send_en=1;
data=8'h75;
#20;
@(posedge tx_done)
send_en=0;
#200000;
$stop;
end
endmodule //3、uart_test仿真代码,这里面是顶层模块 module uart_test(
clk,
reset_n,
uart_tx
);
input clk;
input reset_n;
output uart_tx; reg [26:0] counter;
reg send_go;
reg [7:0]data;
//先进行底层模块的例化
//例化只用写对应的端口和连接
uart_p uart_p_inst0(
.clk(clk),
.reset_n(reset_n),
.send_go(send_go),
.baud_set(3'd4),
.data(data),
.uart_tx(uart_tx),
.tx_done(tx_done)
);
//先书写10ms的定时器 always@(posedge clk or negedge reset_n)
if(!reset_n)
counter<=0;
else if(counter==4999999)
counter<=0;
else
counter<=counter+1;
//开始书写发送信号send_en always@(posedge clk or negedge reset_n)
if(!reset_n)
send_go<=0;
else if(counter==1)
send_go<=1;
else
send_go<=0;
//为什么不管tx_done?????? //开始书写发送的数据,让其执行每次加一的操作。 always@(posedge clk or negedge reset_n)
if(!reset_n)
data<=0;
else if(tx_done)
data<=data+1'b1;
endmodule //4、uart_test_tb仿真代码,这里面是顶层模块 `timescale 1ns / 1ps
module uart_test_tb();
reg clk;
reg reset_n;
wire uart_tx;
uart_test uart_test_inst0(
.clk(clk),
.reset_n(reset_n),
.uart_tx(uart_tx)
);
initial clk=1;
always#10 clk=~clk; initial begin
reset_n=0;
#201;
reset_n=1; #50000000;
$stop;
end endmodule

小梅哥课程学习——串口发送应用之发送数据(适用于板级验证,时间间隔位100ms)的更多相关文章

  1. 【小梅哥SOPC学习笔记】SOPC开发常见问题及解决办法集锦

    SOPC开发常见问题及解决办法集锦 一.Symbol 'NULL' could not be resolved 近期在评估使用NIOS II处理器进行项目的开发,我使用的软件是Quartus II 1 ...

  2. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  3. 【小梅哥SOPC学习笔记】切换NIOS II CPU的主内存后软件中需要注意的几点设置

    切换NIOS II CPU的主内存后软件中需要注意的几点设置 有时候,我们可能面对这样一种情况: 1. 我们创建一个SOPC系统,并在QSYS中设置NIOS II的复位地址和异常地址都指向SRAM: ...

  4. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  5. 【小梅哥SOPC学习笔记】sof与NIOS II的elf固件合并jic得到文件

    sof与NIOS II的elf固件合并jic得到文件 注意,本方法已经有更加简便的方法,小梅哥提供相应的脚本文件,可以一键生成所需文件,脚本请前往芯航线FPGA技术支持群获取. 7.1 为什么需要将S ...

  6. 【小梅哥SOPC学习笔记】NIOS II工程目录改变时project无法编译问题

    解决NIOS II工程移动在磁盘上位置后project无法编译问题 说明:本文档于2017年3月4日由小梅哥更新部分内容,主要是增加了讲解以Quartus II13.0为代表的经典版本和以15.1为代 ...

  7. 【小梅哥SOPC学习笔记】设置Eclipse在编译(build)前自动保存源代码文件

    设置Eclipse在编译(build)前自动保存源代码文件 Eclipse 常用设置之让Eclipse在编译(build)前自动保存源代码文件 一.让Eclipse在编译(build)前自动保存源代码 ...

  8. 【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 1. 设置计时溢出时间为1秒 2. 计数器位宽为32位 3. 勾选No Start/Stop control bits 4. 勾选F ...

  9. 【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程

    Altera SOPC嵌入式系统设计教程 第1章 概述 SOPC(System On Programmable Chip,可编程的片上系统)是Altera公司提出来的一种灵活.高效的SOC解决方案.它 ...

  10. 以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

随机推荐

  1. QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection(QueryDet:用于加速高分辨率小目标检测的级联稀疏查询)

    QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection(QueryDet:用于加 ...

  2. python中items()和iteritems()的区别

    items()函数,将一个字典以dict_items的形式返回,因为字典是无序的,所以返回的列表也是无序的: 1 a ={'a':1,'b':2,'c':3,'d':4} 2 print(a.item ...

  3. Virtualbox EFI 写入startup.nsh

    安装好的Debian系统,重启后会因为找不到入口而无法启动.定位grubx64.efi文件,可用ls直接查找或一步一步查找ls fs0:\EFI\debian\grubx64.efi edit fs0 ...

  4. DOS批处理自动定期清除生成的备份文件

    此功能实现生产环境自动定期清除备份文件. @echo off rem 功能:只保留7天的备份,每天运行. rem 日期:2022.8.15 rem 制作人:zl rem 自动删除7天前的备份 rem ...

  5. Centos7 安装Seata,注册中心选择nocas

    前言 1.什么是分布式事务,分布式事务包含哪些角色 分布式事务主要包含,事务参与者,事务管理者,资源服务器三个角色.分布式事务是指着三个角色分别位于不同的分布式系统的不同节点之上.简单的说,就是一次大 ...

  6. uniapp 上传

    fileList1: [], // uviewui ui组件<u-upload uploadText="上传打款凭证" :fileList="fileList1&q ...

  7. 设置Redhat终端显示中文

    修改.bash_profile,增加: export LC_ALL= export LANG=C source .bash_profile

  8. 用深度学习模型Word2Vec探索《红楼梦》人物关系

    先来看一看结果,发现: 1.贾宝玉和袭人的关系最近. 2.薛宝钗和自己的妈妈关系最近. 3.贾宝玉和林黛玉逼格比较统一,薛宝钗属于独树一帜的逼格调性. 4.大观园中可以看到邢岫烟经常出没... 还有更 ...

  9. 新版 Mediasoup Windows 安装 编译

    https://vc.feiyefeihua.top/ ps:视频测试demo,服务器配置很低,加载有点慢:需要有音视频设备,不然会报错. 关于官网文档 官网文档地址 只测试了 Windows .讲的 ...

  10. 语言-页面-模板-thymeleaf

    一.语法 二.使用 Thymeleaf入门到吃灰 - 鞋破露脚尖儿 - 博客园 (cnblogs.com)