//1、底层代码源代码发送10位数据
module uart_pr(
clk,
reset_n,
send_go,
data,
baud_set,
tx_done,
uart_tx
);
input clk;
input reset_n;
input send_go;
input [7:0]data;
input [2:0]baud_set;
output reg tx_done;
output reg uart_tx; //再书写关于bps_DR的选择计算
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)//记住这边只能用顶层的计数counter,不能用底层的div_cnt以及bps_cnt;
send_en<=1;
else if(tx_done)
send_en<=0; //存储数据
reg [7:0]r_data;
always@(posedge clk or negedge reset_n)//这里为什么不需要复位的下降沿
if(!reset_n)
r_data<=0;
else if(send_go)
r_data<=data;
else
r_data<=r_data;
//首先书写对应波特率的计数,分频div_cnt
//根据最低的波特率来确定div_cnt的宽度
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);
//开始书写下一个计数bps_cnt,来实现10为数据的发送
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;
//开始书写发送10位的数据
always@(posedge clk or negedge reset_n)
if(!reset_n)
uart_tx<=1;
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_cnt==10)&&(bps_clk==1))
tx_done<=1;
else
tx_done<=0;
endmodule
//2、底层代码仿真文件
`timescale 1ns / 1ps
module uart_pr_tb();
reg clk;
reg reset_n;
reg send_en;
reg [7:0]data;
reg [2:0]baud_set;
wire tx_done;
wire uart_tx;
uart_pr uart_pr_tb(
.clk(clk),
.reset_n(reset_n),
.send_en(send_en),
.data(data),
.baud_set(baud_set),
.tx_done(tx_done),
.uart_tx(uart_tx)
);
initial clk=1;
always#10 clk=!clk; initial begin
reset_n=0;
data=0;
send_en=0;
baud_set=4;
#201;
reset_n=1;
#20;
data=8'h57;
send_en=1;
@(posedge tx_done)
send_en=0;
#2000;
data=8'h75;
send_en=1;
@(posedge tx_done)
send_en=0;
#20000;
$stop;
end endmodule
3、顶层代码源文件
//每10ms以115200的波特率发送一个数据,每次发送的
//数据比前一个数据大一(计数器)
//顶层设计模块
module uart_test1(
clk,
reset_n,
uart_tx
);
input clk;
input reset_n;
output uart_tx; reg send_go;//这是顶层的send_en放在下面会出错
reg [7:0] data;
//先将发送10位数据的uart进行例化
uart_pr uart_pr_inst0(
.clk(clk),
.reset_n(reset_n),
.send_go(send_go),
.data(data),
.baud_set(3'd4),
.tx_done(tx_done),
.uart_tx(uart_tx)
);
//先写出一个10ms的计数器
reg [18:0]counter;
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter<=0;
else if(counter==499999)
counter<=0;
else
counter<=counter+1'b1;
//书写发送信号send_en
//底层不是控制过send_en了吗??怎么这里还写控制send_en
//因为底层控制send_en在testbench中控制的,最后不会在板级验证的时候起作用
//那只在testbench中也就是仿真波形中会出现。
always@(posedge clk or negedge reset_n)
if(!reset_n)
send_go<=0;
else if(counter==1)//记住这边只能用顶层的计数counter,不能用底层的div_cnt以及bps_cnt;
send_go<=1;
else //设置send_go的时候一定要注意,什么时候开始,什么时候结束要形成闭环。
send_go<=0;//else还是要加,只不过不用带tx_done因为tx_done已经在顶层模块说明过了
//书写data的每次加1;
always@(posedge clk or negedge reset_n)
if(!reset_n)
data<=0;
else if(tx_done)
data<=data+1'b1;
endmodule
4、顶层代码仿真文件
`timescale 1ns / 1ps
module uart_test1_tb();
reg clk;
reg reset_n;
wire uart_tx;
uart_test1 uart_test1_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

小梅哥课程学习——串口发送应用之发送数据(可在vivado中仿真出现正确波形)的更多相关文章

  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. Python学习笔记_从CSV读取数据写入Excel文件中

    本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...

随机推荐

  1. Windows Codename"Longhorn" Build 4074体验

    Windows Codename"Longhorn" Build 4074体验 Wimndows Coodename "Longhorn"就是WindowsVi ...

  2. kali WiFi相关研究(学习中...)

    基础环境准备: 笔记本一台E470c(内置网卡 Qualcomm Atheros QCA9377 802.11ac) # 经过测试创建虚拟AP不成功 外置网卡一个:UGREEN 绿联AC1300M,芯 ...

  3. Windows Defender 实时防护打不开,你的IT管理员已经限制对此应用一些区域的访问

    最近在使用电脑的时候,Windows Defender实时防护不能使用,一打开就自动关闭,并且显示 该页面不可用 你的IT管理员已经限制对此应用一些区域的访问,实时防护页面显示 正在使用其他防护软件. ...

  4. 对LVDS的浅显理解

    文章参考百度文库:LVDS标准及介绍 LVDS与VB1的对比:LVDS与VB1详细介绍 1.LVDS简介 LVDS( Low Voltage Differential Signaling)是一种低摆幅 ...

  5. Hyperledger fabric 2.2.0 环境搭建

    基础环境搭建 ### docker 安装 如果服务器上有旧版的docker,需要先执行卸载操作. $ sudo yum remove docker \ docker-common \ docker-s ...

  6. 转载安卓或苹果手机获取URL scheme方法

    首先,打开支付宝,来到需要抓取的小程序页面.此处以上海的随申码为例演示,打开随申办小程序,点击顶部的「随申码」按钮进入页面. 可以看出这个一个二级页面,如果想要使用 URL Scheme 一键访问,同 ...

  7. CGAL求最小外包矩形

    有两种所谓的最小外包矩形,第一种通过求所有节点的最小与最大xy来求的,这种叫与坐标轴平行的最小外包矩形:另外一种则是本文说的这种,与范围的形状与走势有关的,叫非坐标轴平行的最小外包矩形,效果如下图所示 ...

  8. google filament pbr

    https://google.github.io/filament/Filament.md.html

  9. CF446D 题解

    题意 传送门 给定一张 \(n\) 个点 \(m\) 条边的无向图,每个节点有权值 \(v_i=\) \(0/1\).角色从节点 \(1\) 开始随机游走,走到 \(n\) 停止.求其经过路径上权值和 ...

  10. pandas学习记要

    本文翻译自文章: Pandas Cheat Sheet - Python for Data Science,同时添加了部分注解. 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非常 ...