当前位置: 首页 > news >正文

DE2-115串口通信

目录

  • 一、 内容概要
  • 二、 Hello Nios-II
    • 2.1 Nios-II编程
      • 2.1.1 硬件
        • Ⅰ 搭建环境
        • Ⅱ 编写代码
      • 2.1.2 软件
      • 2.1.3 烧录
        • Ⅰ硬件
        • Ⅱ 软件
    • 2.2 verilog编程
  • 三、 心得体会

一、 内容概要

  1. 分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出“Hello Nios-II”字符到笔记本电脑串口助手。

二、 Hello Nios-II

2.1 Nios-II编程

2.1.1 硬件

Ⅰ 搭建环境

新建工程,选择开发板在这里插入图片描述
在这里插入图片描述
进行模块添加和连接
在这里插入图片描述

分配地址
在这里插入图片描述
Generate

在这里插入图片描述

Ⅱ 编写代码

新建Verilog文件

module uart(input clk,input reset_n,//uart的接收和发送端input rxd,//接收output txd//发送
);
endmodule

配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进入qip文件的第一个verilog文件
在这里插入图片描述
根据模块信息,在顶层文件里增加:

hello_nioII u0 (.clk_clk       (clk),       //   clk.clk.reset_reset_n (reset_n), // reset.reset_n.uart_rxd      (rxd),      //  uart.rxd.uart_txd      (txd)       //      .txd);

完整代码为:

module uart(input clk,input reset_n,//uart的接收和发送端input rxd,//接收output txd//发送
);hello_nioII u0 (.clk_clk       (clk),       //   clk.clk.reset_reset_n (reset_n), // reset.reset_n.uart_rxd      (rxd),      //  uart.rxd.uart_txd      (txd)       //      .txd);endmodule

编译
配置管脚
在这里插入图片描述

2.1.2 软件

在这里插入图片描述
在这里插入图片描述
修改hello_world.c

#include <stdio.h>
#include "unistd.h"
#include "system.h"
#include "alt_types.h"
#include "altera_avalon_uart_regs.h"
#include "sys\alt_irq.h"alt_u8 txdata=0;
alt_u8 rxdata=0;//UART中断服务函数
void IRQ_UART_Interrupts(){rxdata = IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);//将rxdata寄存器中存储的值读入变量rxdata中txdata = rxdata;//串口自收发,将变量rxdata的值赋给txdatawhile(!(IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)& ALTERA_AVALON_UART_STATUS_TRDY_MSK));//查询发送准备接收信号,如果没有准备好,则等待IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,txdata);//发送准备好,发送txdata
}//中断初始化函数
void IRQ_init()
{//清除状态寄存器IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0);//使能接收准备中断,给控制寄存器相应位写1IORD_ALTERA_AVALON_UART_CONTROL(UART_BASE);alt_ic_isr_register(UART_IRQ_INTERRUPT_CONTROLLER_ID,//注册ISRUART_IRQ,//中断控制器标号,从system.h复制IRQ_UART_Interrupts,//UART中断服务函数0x0,//指向与设备驱动实例相关的数据结构体0x0);//flags,保留未用
}int main()
{/*while(1){IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE, "hello world!\n");int i=0;while(i<5000){i++;}}*/IRQ_init();while(1);return 0;
}

配置

在这里插入图片描述
在这里插入图片描述
报错:
在这里插入图片描述
若遇到类似情况,请按住ctrl然后左键单击#include 里面的system.h,找到UART部分
在这里插入图片描述
发现是URAT_0_BASE,把helloworld.c里面的UART_BASE修改为URAT_0_BASE就行

2.1.3 烧录

Ⅰ硬件

在这里插入图片描述在这里插入图片描述

Ⅱ 软件

在这里插入图片描述

2.2 verilog编程

编译烧录以下代码就行

`timescale  1ns/1nsmodule  rs232
(input   wire    sys_clk     ,    //系统时钟50MHzinput   wire    sys_rst_n   ,   //全局复位input   wire    rx          ,   //串口接收数据output  wire    tx              //串口发送数据
);//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//parameter define
parameter   UART_BPS    =   20'd9600        ,   //比特率CLK_FREQ    =   26'd50_000_000  ;   //时钟频率localparam  BAUD_CNT_MAX    =   CLK_FREQ/UART_BPS   ;
//wire  define
wire            en_h_flag;
wire    [7:0]   po_data;    //接收的数据
wire            po_flag;    //接收完1字节数据标志位,高电平有效
wire            flag;       //识别到接收数据与密码对应标志位
wire            tx_flag;    //发送完1字节数据标志位,高电平有效
reg     [39:0]  datain_reg; //存储接收的数据,5字节
reg     [47:0]  dataout_reg;//存储的要发送的数据,6字节
reg     [1:0]   state;      //状态位
reg     [7:0]   data_tx;    //发送的1字节数据
reg             en_tx;      //发送允许标志位
reg     [2:0]   tx_cnt;     //发送字节计数器,发送6个后置0
reg             en;         //发送控制开关
reg     [12:0]  baud_cnt;   //收到发送成功的tx_flag后延迟1个波特
reg             bit_flag;   //计满1baud有效
reg             work;       //波特计数器baud_cnt有效
//********************************************************************//
//*************************** Instantiation **************************//
//********************************************************************//
//------------------------ uart_rx_inst ------------------------
uart_rx
#(.UART_BPS    (UART_BPS  ),  //串口波特率.CLK_FREQ    (CLK_FREQ  )   //时钟频率
)
uart_rx_inst
(.sys_clk    (sys_clk    ),  //input             sys_clk.sys_rst_n  (sys_rst_n  ),  //input             sys_rst_n.rx         (rx         ),  //input             rx.po_data    (po_data    ),  //output    [7:0]   po_data.po_flag    (po_flag    )   //output            po_flag
);
always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)en <= 1'b1;else if(en_h_flag)en <= 1'b1;else if(tx_cnt>=3'd5)en <= 1'b0;   
//接收数据寄存
always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)datain_reg <= 40'd0;else if(po_flag)datain_reg <= {datain_reg[31:0],po_data[7:0]};//接收到tx_flag后,延迟一个baud时间再发送下一个
always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)work <= 1'b0;else if(tx_flag)work <= 1'b1;else if(state != 2'd2)work <= 1'b0;always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)baud_cnt <= 13'd0;else if((baud_cnt == BAUD_CNT_MAX - 1) || en_tx)baud_cnt <= 13'b0;else if(work)baud_cnt <= baud_cnt + 1'd1;always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)bit_flag <= 1'b0;else if(baud_cnt == BAUD_CNT_MAX - 1)bit_flag <= 1'b1;else if(state != 2'd2) bit_flag <= 1'b0;//hello的ASCII码
assign flag = (datain_reg == 40'h68656c6c6f)? 1'b1:1'b0;always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)beginstate <= 2'd0;dataout_reg <= 48'h6e692c68616f;//ni,hao的ASCII码data_tx <= 8'd0;en_tx <= 1'b0;tx_cnt <= 3'd0;endelsecase(state)2'd0:beginif(flag && en)state <= 2'd1;elsestate <= 2'd0;end2'd1://发送数据beginstate <= 2'd2;data_tx <= dataout_reg[47:40];en_tx <= 1'b1;dataout_reg <= dataout_reg << 8;end            2'd2://等待数据发送完成,并计数+1beginif(bit_flag)beginif(tx_cnt>=3'd5)beginstate <= 2'd0;tx_cnt <= 3'd0;                         endelse beginstate <= 2'd1;tx_cnt <= tx_cnt + 1'd1;                            end endelsebeginen_tx <= 1'b0;state <= 2'd2;endend default : state <= 2'd0;endcase            
//------------------------ uart_tx_inst ------------------------
uart_tx
#(.UART_BPS    (UART_BPS  ),  //串口波特率.CLK_FREQ    (CLK_FREQ  )   //时钟频率
)
uart_tx_inst
(.sys_clk    (sys_clk    ),  .sys_rst_n  (sys_rst_n  ),  .pi_data    (data_tx    ),  .pi_flag    (en_tx      ),     .tx         (tx         ),   .tx_flag    (tx_flag    )
);endmodule

三、 心得体会

通过本次实验,我更深刻地理解了Nios II软件编程和Verilog硬件编程在FPGA设计中的应用和区别。Nios II软核提供了一个通用的处理器环境,可以使用高级语言如C/C++进行编程,易于理解且开发效率较高。而Verilog则是一种硬件描述语言,它允许我直接控制硬件行为,更适合于对性能要求较高的应用。

硬件环境的搭建与配置
在Nios II编程部分,我学会了如何使用Quartus软件和Platform Designer(或Qsys)来搭建硬件环境,包括选择适当的开发板、添加必要的硬件模块(如Nios II处理器、存储器、UART等),并进行模块间的连接和参数配置。这个过程对理解整个系统的硬件架构非常有帮助。

软件编程与硬件的交互
在软件编程部分,我学习了如何在Nios II软核上编写C语言程序,并通过HAL库函数来控制硬件设备,如UART进行串口通信。同时,我也意识到了软件编程中对硬件地址和中断控制器标识符的正确引用的重要性。

遇到的问题及解决
在实验过程中,我遇到了几个问题,包括硬件地址未定义、中断控制器标识符未声明等。通过查阅文档、检查硬件设置和代码,我学会了如何定位并解决这些问题。这些经验对于我未来解决类似的问题非常宝贵。

Verilog编程实践
在Verilog编程部分,我编写了一个简单的UART收发模块,并实现了基本的串口通信功能。这个过程加深了我对UART工作原理和Verilog语言的理解。

总体来说,这次实验不仅增强了我的动手实践能力,也加深了我对FPGA设计、Nios II软核开发以及跨平台串口通信等知识的理解。通过解决实际遇到的问题,我获得了宝贵的学习和成长经验。未来,我希望能将这些知识和技能应用到更复杂的项目中,以进一步提升我的专业技能。

相关文章:

DE2-115串口通信

目录 一、 内容概要二、 Hello Nios-II2.1 Nios-II编程2.1.1 硬件Ⅰ 搭建环境Ⅱ 编写代码 2.1.2 软件2.1.3 烧录Ⅰ硬件Ⅱ 软件 2.2 verilog编程 三、 心得体会 一、 内容概要 分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出“Hello Nios-II”字符到笔记本电脑串口助…...

Danfoss丹佛斯S90泵比例放大器

S90R042、S90R055、S90R075、S90R100、S90R130、S90R180、S90R250电气排量控制变量泵比例阀放大器&#xff0c;电气排量控制为高增益控制方式&#xff1a;通过微小变化的输入电流控制信号即可推动伺服阀主阀芯至全开口位置&#xff0c;进而将最大流量的控制油引入到伺服油缸。伺…...

对话YashanDB CTO陈志标:如何推动国产数据库长远发展

深圳计算科学研究院&#xff08;以下简称“深算院”&#xff09;是深圳市人民政府2018年11月批准建设的“十大基础研究机构”之一&#xff0c;由深圳市科技创新委员会主管、深圳大学举办、深圳市龙华区人民政府共建的二类事业法人单位。 崖山数据库系统YashanDB是深算院完全自主…...

ip显示地址和实际地址不一样:原因解析与应对策略

在数字化时代&#xff0c;IP地址作为我们在互联网上的身份标识&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们会遇到ip显示地址和实际地址不一样的情况&#xff0c;这不仅可能影响到我们的网络体验&#xff0c;还可能引发一系列安全和隐私问题。那么&#xff0c;造成…...

visual studio snippet常用注释片段

Visual Studio 2022 添加自定义代码片段_vs2022 代码片段-CSDN博客 dclass.snippet: <?xml version"1.0" encoding"utf-8"?> <CodeSnippets xmlns"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> …...

ubuntu下不生成core dumped

1、先用ulimit -c&#xff0c;如果看到0&#xff0c;说明没有开core dump。 所以我们输入ulimit -c unlimited&#xff0c;打开core dump。 再次用ulimit -c&#xff0c;看到unlimited了&#xff0c;说明core dump打开了。 注意这句ulimit -c unlimited只对当前会话有效。要永…...

python开发的学习路线

I. 基础知识学习 A. Python基础语法 变量和数据类型 学习如何定义变量&#xff0c;理解并使用不同的数据类型&#xff08;整数、浮点数、字符串、布尔值等&#xff09;。 掌握数字类型的转换和操作。 熟悉字符串的基本操作&#xff0c;如拼接、切片、替换和查找。 …...

vite+vue3 部署后,总是需要清除缓存的问题

1.每次部署后&#xff0c;需要清除缓存&#xff0c;才能看到最新代码&#xff0c;给打包文件加上hash就可以解决此问题。 vite.config.ts文件中加以下代码 build: {rollupOptions: {output: {entryFileNames: assets/[name].[hash].js,chunkFileNames: assets/[name].[hash].j…...

多态:解锁面向对象编程的无限可能

1. 概述 多态&#xff08;Polymorphism&#xff09;是面向对象编程的三大核心特性之一&#xff08;另两个是封装和继承&#xff09;。多态意味着不同的对象对同一消息做出不同的响应。简单来说&#xff0c;多态允许你使用父类引用指向子类对象&#xff0c;并且当调用方法时&am…...

学习MySQL(四):记录的增删改查

记录的增、删、改 增 -- 插入一条数据 INSERT INTO 表名&#xff08;字段 1&#xff0c;字段2&#xff0c;字段3&#xff09; VALUES&#xff08;值 1&#xff0c;值2&#xff0c;值3&#xff09; INSERT INTO 表名 VALUES&#xff08;值 1&#xff0c;值2&#xff0c;值3&am…...

如何使用Python进行网页爬取

Python爬虫案例可以有很多种&#xff0c;但我会为你提供一个简单的案例&#xff0c;该案例使用Python的requests库来爬取一个网页的内容&#xff0c;并使用BeautifulSoup库来解析HTML并提取特定的信息。 假设我们要从某个新闻网站&#xff08;例如&#xff1a;示例网站&#x…...

Spring的IOC(Inversion of Control)设计模式

Spring的IOC&#xff08;Inversion of Control&#xff09;是一种设计模式&#xff0c;它通过控制反转的思想来降低组件之间的耦合度。在Spring框架中&#xff0c;IOC容器负责管理应用程序中的对象&#xff0c;使得对象之间的依赖关系由容器来维护和注入。 以下是Spring IOC的…...

深度学习知识点总结

深度学习是机器学习领域中的一个重要研究方向&#xff0c;它致力于模拟人脑的学习过程&#xff0c;使机器能够像人一样具有分析学习能力&#xff0c;识别文字、图像和声音等数据。以下是深度学习的一些关键知识点总结&#xff1a; 定义与目标&#xff1a; 深度学习是学习样本数…...

以色列人Andi Gutmans开发的php zend

虽然目前php语言不行了【相关的文章前几年已经有人发过】&#xff0c;但这不是重点&#xff0c;重点是zend引擎的东西具有极大的技术价值&#xff0c;负责zend引擎实现的大佬都现在差不多都是40&#xff0c;50岁左右了&#xff0c;从1997&#xff0c;1998&#xff0c;2000到202…...

Python筑基之旅-溯源及发展

目录 一、Python的起源 二、Python的版本更替及变化 三、Python的优缺点 四、Python的发展方向 五、Python之禅 六、推荐专栏/主页&#xff1a; 1、Python函数之旅&#xff1a;Functions 2、Python算法之旅&#xff1a;Algorithms 3、个人主页&#xff1a;https://mye…...

网页打开:为什么国内用新标签页,国外用当前页?

想写这个话题很久了&#xff0c;因为用百度和Google搜索时&#xff0c;打开搜索结果链接时的交互差异&#xff0c;几乎每天都要提醍我一下。 网页打开——这个交互&#xff0c;在设计里&#xff0c;算是极微小&#xff0c;但影响极广泛的操作设计。甚至&#xff0c;因此形成了…...

用户运营4大核心(C端版)

1、用户运营是什么 产品好比歌手&#xff0c;运营好比经纪公司&#xff0c;运营就是让一个有潜质的产品&#xff0c;从“草根”发展成“明星”&#xff01;C端用户的产品忠诚度不高&#xff0c;用户运营更要维护好“粉丝”关系&#xff0c;从“单向的吸引”发展成“双向的进步…...

SBM模型、超效率SBM模型代码及案例数据(补充操作视频)

01、数据简介 SBM&#xff08;Slack-Based Measure&#xff09;模型是一种数据包络分析&#xff08;Data Envelopment Analysis, DEA&#xff09;的方法&#xff0c;用于评估决策单元&#xff08;Decision Making Units, DMUs&#xff09;的效率。而超效率SBM模型是对SBM模型的…...

C#知识|上位机子窗体嵌入主窗体方法(实例)

哈喽,你好啊,我是雷工! 上位机开发中,经常会需要将子窗体嵌入到主窗体, 本节练习C#中在主窗体的某个容器中打开子窗体的方法。 01 需求说明 本节练习将【账号管理】子窗体在主窗体的panelMain容器中打开。 账号管理子窗体如下: 主窗体的panelMain容器位置如图: 02 实现…...

【汇编】算术指令

一、加法指令 &#xff08;一&#xff09;各加法指令的格式及操作 加法指令可做字或字节运算 &#xff08;1&#xff09;加法指令 ADD 格式&#xff1a;ADD DST,SRC执行的操作&#xff1a;(DST) ← (SRC)(DST) &#xff08;2&#xff09;带进位加法指令 ADC 格式&#xf…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...