verilog spi slave 错误记录三

 

加上 spi_clk  , 使用 gpio 观察 代码 执行逻辑 !!!

 

///////////////////////////////////////////////////////////////////////////////////////////////////
// Company: <Name>
//
// File: spi_slave.v
// File history:
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//
// Description: 
//
// <Description here>
//
// Targeted device: <Family::SmartFusion2> <Die::M2S010S> <Package::144 TQ>
// Author: <Name>
//
/////////////////////////////////////////////////////////////////////////////////////////////////// 

`timescale 1ns / 1ps

module spi_slave(


    output wire led_1,       // pin_129 / 2.5V
    output wire mod1_gpio_0, // pin_93 / 3.3V

    input wire spi_cs,   // spi_cs / pin_90 / MOD1-4
    input wire spi_clk,  // spi_clk / pin_83 / MOD1-2
    input wire spi_mosi, 
    output wire spi_miso ); // spi_miso / pin_82 / MOD1-7
    
    reg spi_miso_reg;

    reg led_reg = 1'b0;
    
    always @( posedge spi_clk or negedge spi_cs) begin
        if(!spi_cs) begin
            led_reg <= 1'd1;
        end else begin
            led_reg <= 1'd0;
        end
    end
        
    assign spi_miso = spi_miso_reg;

    assign led_1 = led_reg;
    assign mod1_gpio_0 = led_reg;

endmodule

 

不得不说, FLASH FPGA 编程,怎么这么慢!!!,,,波形抓取如下:

image

尝试理解 : 这样 只执行了一次,  因为    SPI_CLK 触发时 和 SPI_CS 下降沿触发时, cs 永远是 low ,因此只执行 第一个分支代码, gpio0  输出永远是 高!!

 

现在更改代码, if 判断 不是 spi_cs  而是  spi_clk 信号, 看看 结果如何?

///////////////////////////////////////////////////////////////////////////////////////////////////
// Company: <Name>
//
// File: spi_slave.v
// File history:
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//
// Description: 
//
// <Description here>
//
// Targeted device: <Family::SmartFusion2> <Die::M2S010S> <Package::144 TQ>
// Author: <Name>
//
/////////////////////////////////////////////////////////////////////////////////////////////////// 

`timescale 1ns / 1ps

module spi_slave(


    output wire led_1,       // pin_129 / 2.5V
    output wire mod1_gpio_0, // pin_93 / 3.3V

    input wire spi_cs,   // spi_cs / pin_90 / MOD1-4
    input wire spi_clk,  // spi_clk / pin_83 / MOD1-2
    input wire spi_mosi, 
    output wire spi_miso ); // spi_miso / pin_82 / MOD1-7
    
    reg spi_miso_reg;

    reg led_reg = 1'b0;
    
    always @( posedge spi_clk or negedge spi_cs) begin
        if(spi_clk) begin  // 修改了 这里
            led_reg <= 1'd1;
        end else begin
            led_reg <= 1'd0;
        end
    end
        
    assign spi_miso = spi_miso_reg;

    assign led_1 = led_reg;
    assign mod1_gpio_0 = led_reg;

endmodule

 

这次很奇怪 ,  LED 上电就是灭的, 上电应该 亮灯才对, 因为 LED1 是低电平点亮!!!

复位抓取波形: GPIO0 输出 乱糟糟!!!

 

image

 

SPI 抓取波形;

image

 

  spi_cs 下降沿信号, 为什么 执行   led_reg <= 1'd0,这个语句 ??????????

  spi_clk 上升沿信号, 为什么执行 led_reg <= 1'd1; 这个语句 ????????????

上面这么写代码,可能不符合逻辑, 因此 换一种写法:

 

 

`timescale 1ns / 1ps

module spi_slave(


    output wire led_1,       // pin_129 / 2.5V
    output wire mod1_gpio_0, // pin_93 / 3.3V

    input wire spi_cs,   // spi_cs / pin_90 / MOD1-4
    input wire spi_clk,  // spi_clk / pin_83 / MOD1-2
    input wire spi_mosi, 
    output wire spi_miso ); // spi_miso / pin_82 / MOD1-7
    
    reg spi_miso_reg;

    reg led_reg = 1'b0;
    
    always @( posedge spi_clk or negedge spi_cs) begin
        if(!spi_cs) begin
            led_reg <= ~led_reg;  // 修改了 这里
        end else begin
            led_reg <= 1'd0;
        end
    end
        
    assign spi_miso = spi_miso_reg;

    assign led_1 = led_reg;
    assign mod1_gpio_0 = led_reg;

endmodule

 

 

 

波形抓取如下:

 

image

 

 

这个感觉逻辑也不对,因为  led_reg <= ~led_reg; 这句代码 应该只是 在  spi_cs 下降沿 或者 spi_clk 上升沿的时候触发, 现在 是 触发很多次!!!

 

posted on 2025-07-30 21:24  所长  阅读(13)  评论(0)    收藏  举报

导航