//此代码的注意事项,首先这个代码不能仿真成功会出现一定的时间延迟,
//因为在做板级验证的时候把时间改成了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. python读取xml格式数据

    读取节点文本值和,属性值 # -*- coding: UTF-8 -*- from xml.dom import minidom dom=minidom.parse('F:\\python_proje ...

  2. RSS经典教程

    RSS经典教程 作者:OLD HELPSoldhelps@126.com RSS 指 Really Simple Syndication(真正简易联合) RSS 使您有能力聚合(syndicate)网 ...

  3. oss上传,阿里云上传oss,带缩略图

    https://mp.weixin.qq.com/s/obL9JmzDYdkREEJIj_hVIQ 借用工具类 <dependency> <groupId>cn.xuyanwu ...

  4. ES相关问题

    取消写入保护 参考:https://blog.csdn.net/xudailong_blog/article/details/80850159

  5. 统计 nginx access.log

    awk '{print $1}' access22.log | sort | uniq -c | sort -nr -k1

  6. Linux内核启动-从入口到start_kernel

    目录 1. 内核启动要求 2. 内核启动入口 3. 概览:从入口到start_kernel 4. MMU开启之前:primary_entry 4.1. preserve_boot_args 4.2. ...

  7. vim中的命令行 %! 是啥意思?

    :%! command pipes the current file's contents to command's stdin, and replaces the file's contents w ...

  8. 牛客 二叉树中和为某一值的路径 【时间19ms】【内存9560k】

    https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca 构造函数:new ArrayList(al)把al的所有值复制到 ...

  9. Web Uploader上传文件

    Web Uploader是百度提供的. 1:下载:http://fex.baidu.com/webuploader/(官方下载/示例) 2:使用Web Uploader文件上传需要引入三种资源:JS, ...

  10. MacOS如何使用emoji表情?

    Emoji作为一种表情符号,被现代计算机系统都支持的Unicode编码所采纳,普遍应用于各种社交网络中.而苹果作为第一个引用该这种表情符号的公司,其这种表情符号无疑是同类中最佳的.因为是被Unicod ...