thy110 发表于 2017-11-20 16:50:22

FPGA作为从机给STM32发送数据,仿真可以通过,实际却不行。

本帖最后由 thy110 于 2017-11-20 17:18 编辑

我以114个数据为一组,给stm32发送数据,仿真可以看出数据都发送出去的了,但是接受的数据却不正确,接收的都是114个相同的数据,求助啊
module SPI_Test(
                                                input clk,
                                                input rst_n,
                                                input SCK,
                                                input CS,
                                                input MOSI,
                                                output MISO,                                       
                                                input      rx,
                                                output       tx);


reg spi_ad ;                        //存储发送的ASIC字符
reg txd_data;
reg spi_cnt;
regspi_stat;
always@(CS)
begin   //定义发送的字符
if(spi_stat == 0) begin
               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=49;                           //存储字符 1
               spi_ad<=58;                           //存储字符 :
               spi_ad<=0;                      //存储字符 正负          
               spi_ad<=48;          //存储字符 个位                        
               spi_ad<=46;                           //存储字符 .
               spi_ad<=48;          //存储字符 小数点后一位
               spi_ad<=48;         //存储字符 小数点后二位
               spi_ad<=48;            //存储字符 小数点后三位
               spi_ad<=48;            //存储字符 小数点后四位
               spi_ad<=86;                        //存储字符 V
               spi_ad<=32;                        //存储字符 空格
               spi_ad<=32;                        //存储字符 空格
               
               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=50;                           //存储字符 2
               spi_ad<=58;                           //存储字符 :
               spi_ad<=0;                      //存储字符 正负          
               spi_ad<= 48;          //存储字符 个位                        
               spi_ad<=46;                           //存储字符 .
               spi_ad<=48;          //存储字符 小数点后一位
               spi_ad<=48;         //存储字符 小数点后二位
               spi_ad<=48;            //存储字符 小数点后三位
               spi_ad<=48;            //存储字符 小数点后四位
               spi_ad<=86;                           //存储字符 V
               spi_ad<=32;                           //存储字符 空格
               spi_ad<=32;                           //存储字符 空格
               
               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=51;                           //存储字符 3
               spi_ad<=58;                           //存储字符 :
               spi_ad<=0;                      //存储字符 正负          
               spi_ad<=48;          //存储字符 个位                        
               spi_ad<=46;                           //存储字符 .
               spi_ad<=48;          //存储字符 小数点后一位
               spi_ad<=48;         //存储字符 小数点后二位
               spi_ad<=48;            //存储字符 小数点后三位
               spi_ad<=48;            //存储字符 小数点后四位
               spi_ad<=86;                           //存储字符 V
               spi_ad<=32;                           //存储字符 空格
               spi_ad<=32;                           //存储字符 空格       
               
               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=52;                           //存储字符 4
               spi_ad<=58;                           //存储字符 :
               spi_ad<=0;                      //存储字符 正负          
               spi_ad<=48;          //存储字符 个位                        
               spi_ad<=46;                           //存储字符 .
               spi_ad<=48;          //存储字符 小数点后一位
               spi_ad<=48;         //存储字符 小数点后二位
               spi_ad<=48;            //存储字符 小数点后三位
               spi_ad<=48;            //存储字符 小数点后四位
               spi_ad<=86;                           //存储字符 V
               spi_ad<=32;                           //存储字符 空格
               spi_ad<=32;                           //存储字符 空格
               
               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=53;                           //存储字符 5
               spi_ad<=58;                           //存储字符 :
               spi_ad<=0;                      //存储字符 正负          
               spi_ad<=48;          //存储字符 个位                        
               spi_ad<=46;                           //存储字符 .
               spi_ad<=48;          //存储字符 小数点后一位
               spi_ad<=48;         //存储字符 小数点后二位
               spi_ad<=48;            //存储字符 小数点后三位
               spi_ad<=48;            //存储字符 小数点后四位
               spi_ad<=86;                           //存储字符 V
               spi_ad<=32;                           //存储字符 空格
               spi_ad<=32;                           //存储字符 空格
               
               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=54;                           //存储字符 6
               spi_ad<=58;                           //存储字符 :
               spi_ad<=0;                      //存储字符 正负          
               spi_ad<=48;          //存储字符 个位                        
               spi_ad<=46;                           //存储字符 .
               spi_ad<=48;          //存储字符 小数点后一位
               spi_ad<=48;         //存储字符 小数点后二位
               spi_ad<=48;            //存储字符 小数点后三位
               spi_ad<=48;            //存储字符 小数点后四位
               spi_ad<=86;                           //存储字符 V
               spi_ad<=32;                           //存储字符 空格
               spi_ad<=32;                           //存储字符 空格

               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=55;                           //存储字符 7
               spi_ad<=58;                           //存储字符 :
               spi_ad<=0;                      //存储字符 正负          
               spi_ad<=48;          //存储字符 个位                        
               spi_ad<=46;                           //存储字符 .
               spi_ad<=48;          //存储字符 小数点后一位
               spi_ad<=48;         //存储字符 小数点后二位
               spi_ad<=48;            //存储字符 小数点后三位
               spi_ad<=48;            //存储字符 小数点后四位
               spi_ad<=86;                           //存储字符 V
               spi_ad<=32;                           //存储字符 空格
               spi_ad<=32;                           //存储字符 空格       

               spi_ad<=65;                           //存储字符 A
               spi_ad<=68;                           //存储字符 D
               spi_ad<=56;                        //存储字符 8
               spi_ad<=58;                        //存储字符 :
               spi_ad<=0;                     //存储字符 正负          
               spi_ad<=48;         //存储字符 个位                        
               spi_ad<=46;                        //存储字符 .
               spi_ad<=48;         //存储字符 小数点后一位
               spi_ad<=48;          //存储字符 小数点后二位
               spi_ad<=48;         //存储字符 小数点后三位
               spi_ad<=48;         //存储字符 小数点后四位
               spi_ad<=86;                        //存储字符 V
               spi_ad<=32;                        //存储字符 空格
               spi_ad<=32;                        //存储字符 空格               

               spi_ad<=10;                        //换行符
               spi_ad<=13;                        //回车符

               end                
end
wireCS_n;            
reg CS_r0,CS_r1;                                       
always@(posedge clk or negedge rst_n)
begin
        if(!rst_n)
                begin
                        CS_r0 <= 1'b0;
                        CS_r1 <= 1'b0;
                end
        else
                begin
                        CS_r0 <= CS;
                        CS_r1 <= CS_r0;               
                end
end
assign CS_n = (~CS_r0 & CS_r1)? 1'b1:1'b0;

always@( CS_n )//CS边缘检测下降沿
begin
        if(!rst_n) begin   
        spi_cnt<=0;
        spi_stat <= 0;
        end
        else if(spi_cnt == 114) begin
        spi_cnt <= 0;
        spi_stat <= 0;
        end
        else if(CS_n & !CS )begin                    
                txd_data <= spi_ad;
                spi_cnt <= spi_cnt + 1'b1;
                spi_stat <= 1;
        end
end
                                               
wire SCK_n,SCK_p;
SPI_SCK u1(
                                .clk(clk),
                                .rst_n(rst_n),
                                .SCK(SCK),
                                .SCK_n(SCK_n),
                                .SCK_p(SCK_p));

SPI_TX u4(
                                .clk(clk),
                                .rst_n(rst_n),
                                .SCK_n(SCK_n),
                                .CS(CS),
                                .txd_data(txd_data),
                                .MISO(MISO));                               
endmodule


WM_CH 发表于 2017-11-20 19:11:55

感脚软件仿真是功能验证,实际不行是硬件不通{:titter:}猜的

pisgah 发表于 2017-11-20 20:10:05

用真实的示波器,测量你可以测到的波形来比对看看

ArthurBruin 发表于 2017-11-20 20:35:48

本帖最后由 ArthurBruin 于 2017-11-20 20:46 编辑

楼主的Verilog水平还有待加强,以下几点问题:
1. 即便是testbench测试程序也不能出现语法问题:前面是组合逻辑always@(CS),而中间spi_ad 用"<="如何同步?肯定会出现时序问题的;
2. 原则上Verilog代码不管是可综合的还是testbench都应该同步至clk上,这里面你又是组合逻辑又是时序逻辑,又没状态机同步,如何控制时序?

leey 发表于 2017-11-20 20:45:49

你可以把你要发的数据放在mif文件里作为ROM的初始值,然后从ROM里往出读试试。

zxq6 发表于 2017-11-20 22:22:45

spi从机没那么复杂把?

小LV要加油 发表于 2017-11-21 08:38:09

拿逻辑分析仪抓一下波形看看。

thy110 发表于 2017-11-21 09:06:54

解决了,我理解错了,spi主机直接连续发过来114*8个时钟,而我写成了不连续的114*8时钟,对spi理解不透测啊

thy110 发表于 2017-11-21 09:10:37

ArthurBruin 发表于 2017-11-20 20:35
楼主的Verilog水平还有待加强,以下几点问题:
1. 即便是testbench测试程序也不能出现语法问题:前面是组合 ...

好的,O(∩_∩)O谢谢,Verilog还不是很熟,还要多练啊
页: [1]
查看完整版本: FPGA作为从机给STM32发送数据,仿真可以通过,实际却不行。