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软核开发以及跨平台串口通信等知识的理解。通过解决实际遇到的问题,我获得了宝贵的学习和成长经验。未来,我希望能将这些知识和技能应用到更复杂的项目中,以进一步提升我的专业技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/10773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ list介绍(迭代器失效)

一、常用接口 reverse逆置 sort排序&#xff08;默认升序&#xff09; 仿函数greater<int> merge合并&#xff0c;可以全部合并&#xff0c;也可以一部分合并 unique&#xff1a;去重&#xff08;先排序&#xff0c;再去重&#xff09; remove&#xff1a;删除e值&#…

超详细的胎教级Stable Diffusion使用教程(五)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

Linux中每当执行‘mount’命令(或其他命令)时,自动激活执行脚本:输入密码,才可以执行mount

要实现这个功能&#xff0c;可以通过创建一个自定义的mount命令的包装器&#xff08;wrapper&#xff09;来完成。这个包装器脚本会首先提示用户输入密码&#xff0c;如果密码正确&#xff0c;则执行实际的mount命令。以下是创建这样一个包装器的步骤&#xff1a; 创建一个名为…

Elasticsearch入门基础和集群部署

Elasticsearch入门基础和集群部署 简介基础概念索引&#xff08;Index&#xff09;类型&#xff08;Type&#xff09;&#xff08;逐步弃用&#xff09;文档&#xff08;Document&#xff09;字段&#xff08;Field&#xff09;映射&#xff08;Mapping&#xff09;分片&#x…

第十二届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 相乘试题 B: 直线试题 C : \mathrm{C}: C: 货物摆放试题 D: 路径试题 E: 回路计数试题 F : \mathrm{F}: F: 最少砝码试题 G: 左孩子右兄弟试题 H : \mathrm{H}: H: 异或数列试题 I \mathbf{I} I 双向排序试题 J : \mathrm{J}: J: 分…

Promise.all和 race

Promise.all() all方法可以完成并行任务&#xff0c; 它接收一个数组&#xff0c;数组的每一项都是一个promise对象。返回值&#xff1a; 成功时&#xff1a;当数组中所有的promise的状态都达到resolved的时候&#xff0c;就返回包含所有 Promise 结果的数组&#xff0c;并且…

Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV

OpenCV是大型的Third party 计算机视觉库&#xff0c;在开发中会经常用到&#xff0c;本篇记录一下 在Ubuntu系统上安装和配置OpenCV&#xff0c;并使用C/C调用OpenCV 关于VS Code配置C/C开发环境的部分&#xff0c;见之前的博文 Linux/Ubuntu系统下使用VS Code配置C/C开发环境…

shell进阶之计算编译前后时间(十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

代码+视频,R言语处理数据中的缺失值

在SCI论文中&#xff0c;我们不可避免和缺失数据打交道&#xff0c;特别是在回顾性研究&#xff0c;对于缺失的协变量&#xff08;就是混杂因素&#xff09;&#xff0c;我们可以使用插补补齐数据&#xff0c;但是对于结局变量和原因变量的缺失&#xff0c;我们不能这么做。部分…

mysql设置远程访问权限,允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

数据分析思维——数据埋点笔记,以电商为例

数据埋点 数据分析前提是有数据&#xff0c;数据从哪里来&#xff0c;要选择采集哪些数据都需要考虑。如某些app上的商品推荐&#xff0c;是基于哪些信息来预判的呢&#xff1f;因此作为数据分析师有必要系统的了解用户行为到用户数据的整个过程 何为数据埋点 每当用户在客户端…

【GlobalMapper精品教程】079:投影坐标系转地理坐标系(UTM转WGS1984/2000)

文章目录 一、矢量UTM转WGS1984/20001. UTM转WGS19842. UTM转CGCS2000二、栅格UTM转WGS1984/2000一、矢量UTM转WGS1984/2000 加载配套实验数据(data079.rar)中的矢量数据,如下所示: 查看源坐标系:双击图层的,图层投影选项卡,为UTM投影,Zone48N。 设置系统坐标系:点击…

C#【进阶】泛型

1、泛型 文章目录 1、泛型1、泛型是什么2、泛型分类3、泛型类和接口4、泛型方法5、泛型的作用思考 泛型方法判断类型 2、泛型约束1、什么是泛型2、各泛型约束3、约束的组合使用4、多个泛型有约束思考1 泛型实现单例模式思考2 ArrayList泛型实现增删查改 1、泛型是什么 泛型实现…

nowcoder——回文结构

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 我们来分析该题&#xff1a;我们首先要清楚什么是回文结构&#xff1f;其实就是对称结构。如果一个链表呈对称结构就说明该链表具有回文结构。 下面给上一些例子&#xff1a; 那我们怎么判断该链表是否属于回文结构呢&#xf…

Python彻底解决TypeError的问题

今天看到一个问题&#xff1a; TypeError: int() argument must be a string, a bytes-like object or a number, not list 代码是这样的&#xff1a; id int(os.path.split(imagePath)[1].split(.)[0]) 其实这个提示已经非常明显了&#xff0c;百度翻译过来就是&#xff1a…

[BJDCTF2020]ZJCTF,不过如此 1

涉及&#xff1a;php的伪协议、preg_replace函数的漏洞和正则表达式的运用。 解题步骤 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream"))…

zookeeper安装集群模式

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 ZooKeeper是一个分…

梦幻西游全新变现,蓝海热门玩法,小白一部手机可操作,日入2000+

亲爱的朋友们&#xff0c;你们好&#xff01;今天我要给大家分享一个热门、可行的网络赚钱项目——梦幻西游全新变现&#xff0c;蓝海热门玩法&#xff0c;小白一部手机可操作&#xff0c;日入2000。 这个项目不需要花冤枉钱&#xff0c;也是我自己实操过的&#xff0c;非常可…

法语语式与时态总结,柯桥零基础学法语

常用语式 法语中的常用语式分为&#xff1a;直陈式、条件式、虚拟式、命令式、不定式与分词式。 直陈式&#xff08;lindicatif&#xff09;初学法语时首先就要学直陈式&#xff0c;也是最常用的语式&#xff0c;表示确实发生的动作。 条件式&#xff08;le conditionnel&am…

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…