[FPGA] 【工程源码】 NIOS II 自定义IP核编写基本框架

[复制链接]
 楼主| zgmxs 发表于 2020-2-25 18:48 | 显示全部楼层 |阅读模式
本文和设计代码由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者。


  1. 关于自定义IP
  2. 1、接口
  3.     a、全局信号 时钟(Clk),复位(reset_n)
  4.    
  5.     b、avalon mm slave  
  6.         地址(as_address)
  7.         片选(as_chipselect /as_chipselect_n)
  8.         写请求(as_write / as_write_n)
  9.         写数据(as_writedata(按照字节对齐,8/16/32位位宽)
  10.         读请求(as_read / as_read_n)
  11.         读数据(as_readdata)(按照字节对齐,8/16/32位位宽)
  12.         
  13.         等待信号(as_waitrequest / as_waitrequest_n)
  14.         读数据有效信号(as_data_valid)
  15.    
  16.         中断请求(irq / irq_n)
  17.    
  18.     c、导出信号,导出到NIOS 系统顶层,分配到IO,或者连接到Qsys系统以外的逻辑

  19. 2、内部寄存器和线网的定义
  20.     数据寄存器(读/写)
  21.     状态寄存器(IP运行状态、数据状态……)
  22.     控制寄存器
  23.     中断屏蔽寄存器
  24.     用户自定义寄存器

  25. 3、Avalon总线对寄存器的读写

  26.     //写入数据
  27.     always@(posedge clk or negedge reset_n)
  28.     if(!reset_n)
  29.         channel <= 3'd0;
  30.     else if(as_chipselect && as_write && (as_address == 1))
  31.         channel <= as_writedata[2:0];

  32.     //写指定地址实现相应功能,不考虑写入值
  33.     always@(posedge clk or negedge reset_n)
  34.     if(!reset_n)
  35.         control <= 1'd0;
  36.     else if(as_chipselect && as_write && (as_address == 3))
  37.         control <= 1'd1;
  38.     else
  39.         control <= 1'd0;
  40.         
  41.     //读寄存器逻辑        
  42.     always@(posedge clk or negedge reset_n)
  43.     if(!reset_n)
  44.         as_readdata <= 16'd0;
  45.     else if(as_chipselect && as_read)begin
  46.         case(as_address)
  47.             0:as_readdata <= {4'd0, data};
  48.             1:as_readdata <= {13'd0, channel};
  49.             2:as_readdata <= {8'd0, freq_sclk};
  50.             4:as_readdata <= {15'd0, irqmask};
  51.             5:as_readdata <= {14'd0, status};
  52.             default:as_readdata <= 16'd0;
  53.         endcase   
  54.     end

  55. 4、用户逻辑对寄存器的赋值   
  56.     always@(posedge clk or negedge reset_n)
  57.     if(!reset_n)
  58.         status[0] <= 1'd0;
  59.     else if(Conv_Done)
  60.         status[0] <= 1'b1;
  61.     else if(as_chipselect && as_read && (as_address == 0))
  62.         status[0] <= 1'b0;
  63.    
  64.     always@(posedge clk or negedge reset_n)
  65.     if(!reset_n)
  66.         status[1] <= 1'd0;
  67.     else if(ADC_State)
  68.         status[1] <= 1'b1;
  69.     else
  70.         status[1] <= 1'b0;



您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

104

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

104

主题

104

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部