//此代码的注意事项,首先这个代码不能仿真成功会出现一定的时间延迟,
//因为在做板级验证的时候把时间改成了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. VMWARE 虚拟机配置优化

    如果硬件性能不足,可做如下优化. 1.禁用 VMWARE  虚拟内存功能. 编辑->首选项-> 内存  , 设置如下,禁用内存交换. 2. 如果虚拟机装在机械盘,而电脑有固太硬盘,可通过 ...

  2. Freertos stack-overflow 检测

    (出现的地址信息没有特定意义,仅供参考) vApplicationStackOverflowHook() at rtos.c:371 0x55aa vTaskSwitchContext() at ta ...

  3. python读取文本中的字典

    首先得明确文本的每行是存的json或者用python的write(str(一个字典))写入的,那么不用借助json模块就能读取为字典,使用eval函数就行,json只能处理带双引号的字符串,但很多时候 ...

  4. jmeter取样器之KafkaProducerSampler(往kafka插入数据)

    项目背景 性能测试场景中有一个业务场景的数据抽取策略是直接使用kafka队列,该场景需要准备的测试数据是kafka队列里的数据,故需要实现插入数据到kafka队列,且需要实现控制每分钟插入多少条数据. ...

  5. vue element 可编辑表格行内验证

    <template> <div class="page-layout rataMdel"> <el-button type="primary ...

  6. spring mvc基本介绍

    1 MVC 盖帘: MVC 是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计编写 Web 应用程序表现层的模式. MVC 设计模式的三大角色: Model ...

  7. vivado2018.2封装普通IP模块

    将代码打包为一个IP模块 以FIFO代码为例:https://www.cnblogs.com/waqdgstd/p/15267726.html 1.打开向导 2.源文件和外围接口选择,这里不选AXI4 ...

  8. java第五周学习情况

    这个星期主要是在读<大道至简>这本书,话说这本书确实还行啊.看完之后懂得了很多东西,前天写了一篇读后感,把自己的感想记了下来,以后有机会可以再看一遍.然后就是一些Java的相关知识了.也没 ...

  9. vue 鼠标拖拽

    <template> <div class="home"> <div id="box" v-drag></div> ...

  10. PaddleOCR(PaddleHub Serving)离线部署包制作

    PaddleOCR(PaddleHub Serving)离线部署包制作 环境与版本: 系统 CPU架构 Anaconda3 PaddlePaddle PaccleOCR 银河麒麟Server V10 ...