nRF24L01 无线收发控制 Verilog Quartus

名称:nRF24L01 无线收发控制 Verilog Quartus

软件:Quartus

语言:Verilog

功能介绍

该工程使用 Verilog 与 Quartus 实现 nRF24L01 无线收发控制,包含发送端和接收端两套工程。接收端顶层 `nrf24L01_rev` 负责配置无线模块寄存器、执行 SPI 串行事务,并根据 IRQ 和传输状态推进接收流程;发送端工程提供对应的发射控制逻辑,便于搭建成对的无线通信系统。 设计将 SPI 时序、收发核心、节点控制、定时、按键消抖和 LCD 显示等功能拆分为独立模块。接收端状态机依次处理寄存器访问与载荷读取,并提供阶段状态、接收锁定和定时使能等信号,适合用于学习 FPGA 与 nRF24L01 的接口控制、SPI 状态机组织及收发端工程配合。

运行环境

硬件描述语言:Verilog;开发软件:Quartus。

设计思路

接收端顶层以 `spi_rwqq` 作为流程状态,按顺序选择 nRF24L01 寄存器配置与数据读取操作。状态译码生成每次 SPI 事务的字节数和待发送字节;字节计数器在传输使能到来时递增,并在事务开始或结束时清零。`spi_mode` 负责 SPI 时序和串行收发,`nedge_mode` 对 IRQ 信号进行边沿检测,为中断触发的接收流程提供控制信号。 控制逻辑将配置寄存器访问、接收地址与发送地址设置、状态读取、RX FIFO 清理以及载荷读取组织为连续操作。`ce`、`rev_lock` 和 `stage_dq` 根据当前状态及 SPI 忙闲、完成标志给出射频使能、接收锁定和阶段状态。接收到的字节由底层 SPI 模块提供,顶层据此配合接收数据处理,形成与发送端工程对应的无线收发设计。

模块结构

工程主要模块包括:`nrf24L01_rev` 接收端顶层、`nrf24L01_tran` 发送端顶层、`spi_mode` SPI 时序控制、`nrf24L01_rx_core` 与 `nrf24L01_tx_core` 收发核心、`rf24_turn_node` 节点控制、`nedge_mode` 边沿检测、`timer_spi`/`timer_lcd` 定时,以及 `key_debounce` 按键消抖和 `lcd_24l01test0` 显示控制。rev 与 tran 目录分别提供接收和发送 Quartus 工程配置。

开发板验证

工程包含开发板管脚分配约束,并提供接收端与发送端的 Quartus 工程配置,可用于对应 FPGA 开发板的引脚配置与下载验证。

仿真图/仿真说明/设计文档图片

工程提供接收端与发送端的 Quartus 工程文件、管脚约束以及编译生成文件,可用于查看工程配置与构建流程。

部分代码

以下展示顶层模块 nrf24L01_rev 的部分代码,完整源码请下载压缩包查看。

module nrf24L01_rev(clk,rst,irq,miso,csn,sclk,mosi,ce,data_rev,rev_lock,en_1ms,en_1s,stage_dq);
input clk,rst,irq,miso;
output [15:0]data_rev;
output csn,sclk,mosi,ce,rev_lock,en_1ms,en_1s;
output [3:0]stage_dq;


reg [5:0]byte_num,byte_qq;
reg [7:0] byte_tran;
reg [3:0]spi_rwqq;
reg [15:0]data_rev;

wire irq_en,rwb_spi,spi_sta,en_100us,en_1ms,en_1s,byte_en_tran,byte_en_rev,spi_busy,spi_end;
wire [7:0]byte_rev;


assign ce=spi_rwqq[3] & spi_rwqq[1] & spi_rwqq[0] & ~spi_busy;
assign rev_lock=spi_rwqq[3] & spi_rwqq[1] & spi_rwqq[0] & spi_end;
assign stage_dq=spi_rwqq;
assign rwb_spi= spi_rwqq[3] & spi_rwqq[1] & spi_rwqq[0];
//assign data_rev=data_rev_reg;
assign spi_sta=(spi_rwqq[3] & spi_rwqq[1] & spi_rwqq[0])? irq_en : en_100us;


spi_mode U0(clk,rst,rwb_spi,spi_sta,byte_num,byte_tran,byte_en_tran,byte_rev,byte_en_rev,spi_busy,csn,sclk,mosi,miso,en_100us,en_1ms,en_1s,spi_end);
nedge_mode U1(clk,rst,1'b1,irq,irq_en);


always@(posedge clk or negedge rst)
if(~rst)
   spi_rwqq<=4'b0000;
else if(spi_end)
  begin
     if(spi_rwqq[3] & spi_rwqq[1] & spi_rwqq[0])
         spi_rwqq<=4'b0111;
     else
         spi_rwqq<=spi_rwqq + 1'b1;
  end



always@(posedge clk or negedge rst)
if(~rst)
   byte_qq<=6'b000000;
else if(~spi_busy & spi_sta | spi_busy & spi_end)
   byte_qq<=6'b000000;
else if(byte_en_tran)
   byte_qq<=byte_qq + 1'b1;

always@(spi_rwqq)
 case(spi_rwqq)
  4'b0000:byte_num=6'b000101;
  4'b0001:byte_num=6'b000101;
  4'b0010:byte_num=6'b000001;
  4'b0011:byte_num=6'b000001;
  4'b0100:byte_num=6'b000001;
  4'b0101:byte_num=6'b000001;
  4'b0110:byte_num=6'b000001;
  4'b0111:byte_num=6'b000001;
  4'b1000:byte_num=6'b000001;
  4'b1001:byte_num=6'b000000;
  4'b1010:byte_num=6'b000001;
  4'b1011:byte_num=6'b000010;  
  default:byte_num=6'b000000;
 endcase


always@(posedge clk or negedge rst)
if(~rst)
   byte_tran<=8'b00000000;
else if(~spi_busy)
  case(spi_rwqq)
  4'b0000:byte_tran=8'h2A;  //RX_ADDR_P0 通道0接收地址
  4'b0001:byte_tran=8'h30;  //TX_ADDR 发送地址
  4'b0010:byte_tran=8'h21;  //EN_AA 自动应答,禁止后可通信
  4'b0011:byte_tran=8'h22;  //EN_RXADDR 接收地址允许
  4'b0100:byte_tran=8'h24;  //SEPUT_RETR 建立自动重发
  4'b0101:byte_tran=8'h25;  //RF_CH 射频通道
  4'b0110:byte_tran=8'h26;  //RF_SERUP 射频寄存器
  4'b0111:byte_tran=8'h27;   //STATUS 状态寄存器
  4'b1000:byte_tran=8'h31;  //RX_PW_P0 接收通道0有效数据宽度
  4'b1001:byte_tran=8'hE2;   //FLUSH_RX 清除RX FIFO寄存器
  4'b1010:byte_tran=8'h20;   //配置寄存器  配置接收模式
  4'b1011:byte_tran=8'h61;  //R_RX_PAYLOAD读取存入寄存器
  default:byte_tran=8'h00;    //预防报错
 endcase
else if(byte_en_tran)
 case(byte_qq)
  6'b000000: case(spi_rwqq)
                 4'b0000:byte_tran=8'h57;  //RX_ADDR_P0 通道0接收地址
                 4'b0001:byte_tran=8'h57;  //TX_ADDR 发送地址
                 4'b0010:byte_tran=8'h01;  //EN_AA 自动应答,禁止后可通信
                 4'b0011:byte_tran=8'h01;  //EN_RXADDR 接收地址允许
                 4'b0100:byte_tran=8'h2F;  //SEPUT_RETR 建立自动重发
                 4'b0101:byte_tran=8'h28;  //RF_CH 射频通道
                 4'b0110:byte_tran=8'h07;  //RF_SERUP 射频寄存器
                 4'b0111:byte_tran=8'hFF;  //STATUS 状态寄存器
                 4'b1000:byte_tran=8'h02;  //RX_PW_P0 接收通道0有效数据宽度
                 4'b1001:byte_tran=8'hff;  //FLUSH_RX 清除RX FIFO寄存器
                 4'b1010:byte_tran=8'h0f;  //配置寄存器  配置接收模式
                 4'b1011:byte_tran=8'h00;  //R_RX_PAYLOAD读取存入寄存器
               default:byte_tran=8'h00;    //预防报错
             endcase
  6'b000001: case(spi_rwqq)
                 4'b0000:byte_tran=8'h68;  //RX_ADDR_P0 通道0接收地址
                 4'b0001:byte_tran=8'h68;  //TX_ADDR 发送地址
               default:byte_tran=8'h00;    //预防报错
             endcase
  6'b000010: case(spi_rwqq)
                 4'b0000:byte_tran=8'h94;  //RX_ADDR_P0 通道0接收地址
                 4'b0001:byte_tran=8'h94;  //TX_ADDR 发送地址
               default:byte_tran=8'h00;    //预防报错
             endcase
  6'b000011: case(spi_rwqq)
                 4'b0000:byte_tran=8'hA7;  //RX_ADDR_P0 通道0接收地址
                 4'b0001:byte_tran=8'hA7;  //TX_ADDR 发送地址
               default:byte_tran=8'h00;    //预防报错
             endcase
  6'b000100: case(spi_rwqq)
                 4'b0000:byte_tran=8'hE0;  //RX_ADDR_P0 通道0接收地址
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » nRF24L01 无线收发控制 Verilog Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员