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 格式…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...