DE2-115串口通信
目录
- 一、 内容概要
- 二、 Hello Nios-II
- 2.1 Nios-II编程
- 2.1.1 硬件
- Ⅰ 搭建环境
- Ⅱ 编写代码
- 2.1.2 软件
- 2.1.3 烧录
- Ⅰ硬件
- Ⅱ 软件
- 2.2 verilog编程
- 三、 心得体会
一、 内容概要
- 分别用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电气排量控制变量泵比例阀放大器,电气排量控制为高增益控制方式:通过微小变化的输入电流控制信号即可推动伺服阀主阀芯至全开口位置,进而将最大流量的控制油引入到伺服油缸。伺…...
对话YashanDB CTO陈志标:如何推动国产数据库长远发展
深圳计算科学研究院(以下简称“深算院”)是深圳市人民政府2018年11月批准建设的“十大基础研究机构”之一,由深圳市科技创新委员会主管、深圳大学举办、深圳市龙华区人民政府共建的二类事业法人单位。 崖山数据库系统YashanDB是深算院完全自主…...
ip显示地址和实际地址不一样:原因解析与应对策略
在数字化时代,IP地址作为我们在互联网上的身份标识,其重要性不言而喻。然而,有时我们会遇到ip显示地址和实际地址不一样的情况,这不仅可能影响到我们的网络体验,还可能引发一系列安全和隐私问题。那么,造成…...
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,如果看到0,说明没有开core dump。 所以我们输入ulimit -c unlimited,打开core dump。 再次用ulimit -c,看到unlimited了,说明core dump打开了。 注意这句ulimit -c unlimited只对当前会话有效。要永…...
python开发的学习路线
I. 基础知识学习 A. Python基础语法 变量和数据类型 学习如何定义变量,理解并使用不同的数据类型(整数、浮点数、字符串、布尔值等)。 掌握数字类型的转换和操作。 熟悉字符串的基本操作,如拼接、切片、替换和查找。 …...
vite+vue3 部署后,总是需要清除缓存的问题
1.每次部署后,需要清除缓存,才能看到最新代码,给打包文件加上hash就可以解决此问题。 vite.config.ts文件中加以下代码 build: {rollupOptions: {output: {entryFileNames: assets/[name].[hash].js,chunkFileNames: assets/[name].[hash].j…...
多态:解锁面向对象编程的无限可能
1. 概述 多态(Polymorphism)是面向对象编程的三大核心特性之一(另两个是封装和继承)。多态意味着不同的对象对同一消息做出不同的响应。简单来说,多态允许你使用父类引用指向子类对象,并且当调用方法时&am…...
学习MySQL(四):记录的增删改查
记录的增、删、改 增 -- 插入一条数据 INSERT INTO 表名(字段 1,字段2,字段3) VALUES(值 1,值2,值3) INSERT INTO 表名 VALUES(值 1,值2,值3&am…...
如何使用Python进行网页爬取
Python爬虫案例可以有很多种,但我会为你提供一个简单的案例,该案例使用Python的requests库来爬取一个网页的内容,并使用BeautifulSoup库来解析HTML并提取特定的信息。 假设我们要从某个新闻网站(例如:示例网站&#x…...
Spring的IOC(Inversion of Control)设计模式
Spring的IOC(Inversion of Control)是一种设计模式,它通过控制反转的思想来降低组件之间的耦合度。在Spring框架中,IOC容器负责管理应用程序中的对象,使得对象之间的依赖关系由容器来维护和注入。 以下是Spring IOC的…...
深度学习知识点总结
深度学习是机器学习领域中的一个重要研究方向,它致力于模拟人脑的学习过程,使机器能够像人一样具有分析学习能力,识别文字、图像和声音等数据。以下是深度学习的一些关键知识点总结: 定义与目标: 深度学习是学习样本数…...
以色列人Andi Gutmans开发的php zend
虽然目前php语言不行了【相关的文章前几年已经有人发过】,但这不是重点,重点是zend引擎的东西具有极大的技术价值,负责zend引擎实现的大佬都现在差不多都是40,50岁左右了,从1997,1998,2000到202…...
Python筑基之旅-溯源及发展
目录 一、Python的起源 二、Python的版本更替及变化 三、Python的优缺点 四、Python的发展方向 五、Python之禅 六、推荐专栏/主页: 1、Python函数之旅:Functions 2、Python算法之旅:Algorithms 3、个人主页:https://mye…...
网页打开:为什么国内用新标签页,国外用当前页?
想写这个话题很久了,因为用百度和Google搜索时,打开搜索结果链接时的交互差异,几乎每天都要提醍我一下。 网页打开——这个交互,在设计里,算是极微小,但影响极广泛的操作设计。甚至,因此形成了…...
用户运营4大核心(C端版)
1、用户运营是什么 产品好比歌手,运营好比经纪公司,运营就是让一个有潜质的产品,从“草根”发展成“明星”!C端用户的产品忠诚度不高,用户运营更要维护好“粉丝”关系,从“单向的吸引”发展成“双向的进步…...
SBM模型、超效率SBM模型代码及案例数据(补充操作视频)
01、数据简介 SBM(Slack-Based Measure)模型是一种数据包络分析(Data Envelopment Analysis, DEA)的方法,用于评估决策单元(Decision Making Units, DMUs)的效率。而超效率SBM模型是对SBM模型的…...
C#知识|上位机子窗体嵌入主窗体方法(实例)
哈喽,你好啊,我是雷工! 上位机开发中,经常会需要将子窗体嵌入到主窗体, 本节练习C#中在主窗体的某个容器中打开子窗体的方法。 01 需求说明 本节练习将【账号管理】子窗体在主窗体的panelMain容器中打开。 账号管理子窗体如下: 主窗体的panelMain容器位置如图: 02 实现…...
【汇编】算术指令
一、加法指令 (一)各加法指令的格式及操作 加法指令可做字或字节运算 (1)加法指令 ADD 格式:ADD DST,SRC执行的操作:(DST) ← (SRC)(DST) (2)带进位加法指令 ADC 格式…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
