FPGA——实现三线SPI和UART

目录

逻辑框图(原理图)

端口约束和ILA

 ILA waveform

 实测波形

串口调试工具

源代码

顶层


逻辑框图(原理图)

  1.  FPGA和芯片之间通过三线SPI接口通信(DATA复用一个IO端口),FPGA和PC之间通过UART串口通信。
  2. 原理图包含4个模块,分别为:内建模块IBUFDS(用于将外部差分时钟转换为内部单端时钟)、UART接收模块uart_rx(用于从串口接收上位机发送的数据)、SPI收发模块spi_trx(用于将串口接收到的数据转换为SPI信号,根据芯片规定的SPI时序,FPGA发送(write)数据给芯片或从芯片回读(read)数据),UART发送模块uart_tx(用于将SPI回读到的数据从串口发给上位机)
  3. 原理图包含4个输入端口,分别为:差分时钟sys_clk_p和sys_clk_n,频率为200MHz(用于产生系统工作时钟);复位信号rst_n;UART输入端口uart_top_input(用于接收来自串口的数据)。

  4. 原理图包含5个输出端口,分别为:3个SPI端口spi_clk/spi_csn/spi_io(用于FPGA和芯片通信);UART输出端口uart_top_output(用于串口发送数据给上位机);led[3:0](用于串口调试)

端口约束和ILA

 ILA waveform

  1. 根据不同的SPI时钟频率,需要设置不同的ILA波形采样深度,此处SPI时钟频率为1MHz,ILA采样深度设置为8192。
  2. 波形触发条件设置为信号spi_csn下降沿触发F(1 to 0 transition)。

 实测波形

串口调试工具

 自动识别串口COM7,波特率为9600,无校验位,8位数据位,1位停止位。

源代码

顶层

`timescale 1ns / 1ps
module uart_spi_v10(
    input             sys_clk_p,
    input             sys_clk_n,
    input             rst_n,
    
    input             uart_top_input,
    
    output    [3:0]     led,
    
    output             uart_top_output,
    
    output             spi_csn,
    output             spi_clk,
    inout             spi_io
    );
    
    wire    [7:0]    uart_rx_output;
    
    wire    [7:0]    spi_data_rd;
    
    
    
    IBUFDS #(
      .DQS_BIAS("FALSE")  // (FALSE, TRUE)
        )
    IBUFDS_inst (
      .O(clk),   // 1-bit output: Buffer output
      .I(sys_clk_p),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
      .IB(sys_clk_n)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
        );
        
    uart_rx_v10 
        #(        
        .BAUD_RATE      (9600)
        )
        uart_rx_v10
        (
        .clk            (clk),
        .rst_n            (rst_n),
        
        .uart_rx_input    (uart_top_input),
        
        .uart_rx_output    (uart_rx_output),
        .uart_rx_valid    (uart_rx_valid),
        .uart_rx_stop    (uart_rx_stop),
        
        .led            (led)        
        );    
    
    
    spi_trx_v10    
        #(        
        .FREQ_SPI_CLK   (1_000_000)
        //.FREQ_SPI_CLK   (10_000_000)
        )
        
        spi_trx_v10
        (
        .clk            (clk),
        .rst_n            (rst_n),
        
        // from uart_rx
        .spi_data_in    (uart_rx_output),
        .data_in_valid    (uart_rx_valid),
        
        // to device
        .spi_csn        (spi_csn),
        .spi_clk        (spi_clk),
        .spi_io            (spi_io),
        
        // to uart_tx
        .spi_data_rd    (spi_data_rd),
        .spi_rd_done    (spi_rd_done)
        );
        
    
    uart_tx_v10
        #(        
        .BAUD_RATE   (9600)
        )
        uart_tx_v10
        (
        .clk            (clk),
        .rst_n            (rst_n),
        
        .uart_tx_input    (spi_data_rd),
        .spi_rd_done    (spi_rd_done),
        
        .uart_tx_output    (uart_top_output)
        
        );
    
endmodule
 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值