//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. [Oracle19C ASM管理] ASM的网络服务

    启用了ASM集群以后,网络管理放给了grid用户.grid用户的$ORACLE_HOME/network/admin有网络配置文件,而oracle用户下的网络配置文件则不存在了. [grid@cent ...

  2. java 基本知识点

    多线程 加载器 数据结构 内存模型 gc算法

  3. PaddlePaddleOCR安装教程

    1.首先下载并安装python3.7.8 链接地址: 注:安装时Add path勾选 2.进入命令提示符界面 3.升级pip版本 python -m pip install --upgrade pip ...

  4. 在datagridview中首列添加复选框

    //为dgv增加复选框列 DataGridViewCheckBoxColumn checkbox = new DataGridViewCheckBoxColumn(); //列显示名称 checkbo ...

  5. STM32-USART打印字符、字符串函数自己犯的错误反思

    void UART_Send_Byte(USART_TypeDef *USARTx, uint8_t cha) { USART_SendData(USARTx, cha); while(USART_G ...

  6. java 动手动脑 方法重载

    如下代码://MethodOverload.java //Using overloaded methods package HJssss; public class zhuce { public st ...

  7. Mysql数据库基础第二章:(十)联合查询

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...

  8. 【剑指Offer】【链表】链表中环的入口结点

    题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. A:创建两个指针,一个pFast一个pSlow指向链头,pFast一次走2步,pSlow一次走1步,如果两个指针必相遇 ...

  9. 光纤加速计算 383-高速信号处理板 XCKU060的双路QSFP+光纤PCIe 卡 XCKU060板卡

    基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡 一.板卡概述 本板卡系北京太速科技自主研发,基于Xilinx UltraScale Kintex系列FPGA   ...

  10. idea集成maven插件 使用骨架创建maven的java工具 不使用骨架创建maven的java工程

    idea集成maven插件   使用骨架创建maven的java工具  new-->FIle-->Model 选择Maven对勾选上要不不能使用骨架 找到这个,选上下一步 Finish即可 ...