FPGA学习专题-NIOS ii中的数据与Verilog进行交互(一)

本文详细阐述了如何在Verilog硬件描述语言和NIOS II片上CPU间通过AVALON总线进行数据交换,包括从NIOS写入控制值控制LED闪烁,以及在Verilog中处理这些数据。涉及的关键模块如数据处理、地址映射和顶层设计都被详尽介绍。

在实际应用开发中,在verilog层面上开发完成简单的功能后,如果遇到比较复杂的逻辑,就会借助类似NIOS这样的片上CPU(其实本身就是一个IP核),在上面应用C语言进行编写操作。

那么问题就有了,在verilog中已经处理好的数据怎么传到NIOS中给C语言处理?或者从NIOS传到Verilog层面上去呢?

我将应用一个简单例子说明一下。两者在通信中借助AVALON总线,哪怕简单理解成一条线,把两者连接起来。如果NIOS想得到Verilog中的数据,就执行读总线(这个读过程是要带地址的),总线会根据给出的地址找到你想读的寄存器,并把值拿到NIOS中。相反,如果想把数据发送给Verilog,就执行写总线操作(写过程同样是要带地址的,就是目标地址),总线就会根据给出的地址把数据发送到给定的地址上,也就发到了对应的寄存器。

简单理解就是下图,两边的寄存器都挂在AVALON总线上,所有的地址都可以通过AVALON总线找到,这里的地址是由自己定的,后面告诉你怎么定。

在这里插入图片描述
本文实现现象:从NIOS II中发送变量值到Verilog中,控制灯的闪烁。
请注意:不是用的PIO!!!

1.首先在Verilog中建立闪灯的逻辑

module data_deal(

clk,
rst,
data_in,
data_out
);

input clk;
input rst;
input [7:0] data_in;//NIOS发送过来的控制值
output reg  data_out;//FPGA引脚输出,相当于是Verilog中的变量,这个值也可以被NIOS 读取

always@(posedge clk or negedge rst)
	if(!rst)
	data_out <= 1'b1;
	else if(data_in == 8'd5) //当NIOS中发送过来的值为5,就亮灯,否则,灭灯。
	data_out <= 1'b0;
	else 
	data_out <= 1'b1;

endmodule

注释写在代码中,就不分析了。重点说下实现avalon总线的内容。

/*******************说明**********************/
/*这个module就是实现的通过avalon总线进行数据交互的功能*/
/*整个的模块可以说是一个通用标准了,使用中只需要修改成自己的变量即可*/
/*这里的as_writedata 和as_readdata 这两个数据寄存器,理解成NIOS可以操作的寄存器*/
/*往as_writedata里写数据就是发送给Verilog,读as_readdata就是从Verilog取数据*/
module av_data(
	clk,
	rst,
	led_out,
	as_address,			//地址,这个地址就是用来给Verilog中的变量和NIOS中的变量确定地址的
	as_chipselect,		//设备选择
	as_write,			//写请求,NIOS向Verilog中写数据
	as_writedata,		//要写数据 
	as_read,			//读请求,NIOS从Verilog中读数据
	as_readdata			//读取的数据
	
	);
	
	input clk;
	input rst;
	output led_out;
	
	input [2:0] as_address;//地址位宽根据你需要操作多少个变量决定
	input as_chipselect;
	input as_write;
	input [15:0]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值