在实际应用开发中,在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]

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

被折叠的 条评论
为什么被折叠?



