This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于C6678 EVM开发板FPGA上电程序的疑问

Other Parts Discussed in Thread: CDCE62005, TMS320C6678

RT,最近在弄6678有关boot的东西  ,在开发板上能正常进行BOOT,但是只能进行IIC的方式启动,SPI未能成功,但是在自己的板子上无法启动,问题应该是出在FPGA上电配置程序上,看了下EVM上里面带的一些代码(C6678 EVM FPGA code reference),有些疑问想请教下,我看了里面有关拨码开关是这样赋值的,

force_bootmode [13:1] = (bm_gpio_i[6:5]==2'b00 && bm_gpio_i[3:1]==3'b000)? bm_gpio_i[13:1] : 13'h405; //20110219

我能不能理解为EVM只有两种模式,NO-BOOT还有就是IIC模式,直接写死了,还有就是关于内部的复位个人觉得也有一些疑问,

想烦请问下下,这个评估板的上电程序是用这些源代码写的吗,还是有改动?

最后还有个疑问就是,在6678进行boot的时候,有no-boot和boot两种拨码开关状态,但是在DSP的后续中,还要用到GPIO中断,想问下会有冲突吗,请有相关经验的人解答下,谢谢了。。

  • 烦请解答下  谢谢

  • 哈哈,最近刚把这个FPGA控制gpio的问题解决掉。

    值得注意的地方有:

    1.debug加载FPGA程序,抓取一下FPGA控制GPIO的状态,或者直接用示波器or万用表量一下GPIO管脚上的电压。

      我们当时遇到都是高电平。

    2.修改FPGA程序,直接把GPIO输出管脚写死成你boot需要的值,然后可以看你的boot是否可以起来,并测量GPIO管脚上的状态是否正常。

      如果DSP也在控制GPIO管脚,比如点灯,可能造成GPIO上的电压不是标准的高电平or低电平。具体可以自己分析下。

    3.还有一个地方是,DSP_GPIO_Output_delay_time,FPGA程序中的这个值,可能需要改大一点。

        它的意思是FPGA保持初始化GPIO状态的时间。太小,有可能FPGA提前释放了GPIO状态,而此时DSP还未获取到GPIO上的初始化状态值。

    btw:大概说下我个人对这部分的理解,

    上电完成之后,FPGA会将gpio给个初始化状态,开发板的意思是,如果拨码开发不是no boot模式则强制拉成I2C模式了。另外还有两个使能信号来控制GPIO管脚,如果是自己做的板子可以去掉。然后FPGA会保持一段时间的GPIO状态之后,就会将其置成三态。

    这些都是我们当时遇到的问题,希望对你有所帮助。

  • 哦,对了,另外,查看你的片子是不是PG2.0的。

    如果是,直接设置成SPI模式,很容易就起来了。不需要再去通过I2C来过渡,麻烦。

  • @ w ww   你好,首先谢谢你的解答

     

    我想问一下,你是用自带的那个FPGA程序修改的吗?

    如果是的话,有几个地方我想请教你一下,首先就是关于复位reset_req_s里面的代码,

     

    //////////////////////////////////////////////////////////////////////
    ////                                                              ////
    ////  Advantech Co., Ltd FPGA Design                           ////
    ////                                                              ////
    //////////////////////////////////////////////////////////////////////
    ////  Project : TI Shannon EVM FPGA                             ////
    ////  File name : reset_req.v                             ////
    ////  Description                                                 ////
    ////        : Shannon EVM FPGA Core MODULE                    ////
    ////  Created Date                                                ////
    ////   : 2010/12/10           ////
    //////////////////////////////////////////////////////////////////////
    ////                                                              ////
    //// Copyright (C) 2010 Advantech Co., Ltd                        ////
    ////                                                              ////
    //////////////////////////////////////////////////////////////////////

     `include "params.v"

    module reset_req_s (
     clk,    // Clock input for the timing delay counter
     rst_n,    // Reset input to this block
     por_req_n,    // POR Request
     resetfull_req_n, // Resetfull Request
        hreset_req_n, // Hard Reset Request
        sreset_req_n, // Soft Reset Request
        cs_por_n,   // Current Status of PORZ signal
        cs_resetfull_n,     // Current Status of ResetfullZ signal
        cs_reset_n,   // Current Status of ResetZ signal
        cs_resetstat_n,  // Current Status of ResetstatZ signal
        por_out_n,   // Output to PORz
        resetfull_out_n, // Output to ResetfullZ
        reset_out_n   // Output to ResetZ
    );

    input clk;
    input rst_n;
    input por_req_n;
    input resetfull_req_n;
    input hreset_req_n;
    input   sreset_req_n;
    input  cs_por_n;
    input cs_resetfull_n;
    input  cs_reset_n;
    input  cs_resetstat_n;
    output por_out_n;
    output resetfull_out_n;
    output reset_out_n;

    reg  por_out_n;
    reg  resetfull_out_n;
    reg  reset_out_n;


    reg  [23:0] delay_timing_counter;    //counter for clock divider

    reg  [3:0] reset_st;  //Reset Mechanism State-Machine
    parameter idle = 4'h0;
    parameter por_assert = 4'h1;
    parameter por_delay = 4'h2;
    parameter por_release = 4'h3;
    parameter resetfull_check = 4'h4;
    parameter resetfull_assert = 4'h5;
    parameter resetfull_delay = 4'h6;
    parameter resetfull_release = 4'h7;
    parameter hreset_check = 4'h8;
    parameter hreset_assert = 4'h9;
    parameter hreset_delay = 4'ha;
    parameter hreset_release = 4'hb;
    parameter sreset_check = 4'hc;
    parameter sreset_assert = 4'hd;
    parameter sreset_delay = 4'he;
    parameter sreset_release = 4'hf;

    always@(posedge clk or negedge rst_n)  
    begin
     if (~rst_n) begin
      reset_st <= idle;
      por_out_n <= 1'b1;
      resetfull_out_n <= 1'b1;
      reset_out_n <= 1'b1;   
      delay_timing_counter <= 24'b0;
     end
     else begin 
         case (reset_st)

      idle: begin  
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;   
       delay_timing_counter <= 24'b0;
          if (~por_req_n)
        reset_st <= por_assert;
       else if (~resetfull_req_n)
           reset_st <= resetfull_check;
       else if (~hreset_req_n)
           reset_st <= hreset_check; 
       else if (~sreset_req_n)
           reset_st <= sreset_check;  
       else
        reset_st <= idle;
      end

      ////////////////////  POR   ///////////////////////////////
      por_assert: begin 
          por_out_n <= 1'b0;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;   
       delay_timing_counter <= 24'b0;
       if (por_req_n)
        reset_st <= por_delay;
       else
        reset_st <= por_assert;
      end
       
      por_delay: begin 
          por_out_n <= 1'b0;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;   
       if (~cs_por_n & cs_resetfull_n & cs_reset_n & ~cs_resetstat_n)
           if(delay_timing_counter >= `POR_assert_delay_time) begin
         reset_st <= por_release;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= por_delay;
         delay_timing_counter <= delay_timing_counter + 1;
        end 
       else begin  
                    reset_st <= por_delay;
        delay_timing_counter <= 24'b0;
       end 
      end
       
      por_release: begin 
       por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;
                if (cs_por_n & cs_resetfull_n & cs_reset_n & cs_resetstat_n)
           if(delay_timing_counter >= `POR_release_delay_time) begin
         reset_st <= idle;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= por_release;
         delay_timing_counter <= delay_timing_counter + 1;
        end  
                 else begin
            reset_st <= por_release;
         delay_timing_counter <= 24'b0;
       end 
      end
           
      ////////////////////  Full-Reset   ///////////////////////////////
      resetfull_check: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;   
       if (~por_req_n)
        reset_st <= por_assert;
       else if (cs_por_n & cs_resetfull_n & cs_reset_n)
           if(delay_timing_counter >= `Resetfull_check_delay_time) begin
         reset_st <= resetfull_assert;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= resetfull_check;
         delay_timing_counter <= delay_timing_counter + 1;
        end 
       else begin
                    reset_st <= resetfull_check;
        delay_timing_counter <= 24'h0;
                end    
      end
      
      
            resetfull_assert: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b0;
       reset_out_n <= 1'b1;   
       delay_timing_counter <= 24'b0;
       if (resetfull_req_n)
        reset_st <= resetfull_delay;
       else
        reset_st <= resetfull_assert;
      end
       
      resetfull_delay: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b0;
       reset_out_n <= 1'b1;   
       if (cs_por_n & ~cs_resetfull_n & cs_reset_n & ~cs_resetstat_n)
           if(delay_timing_counter >= `Resetfull_assert_delay_time) begin
         reset_st <= resetfull_release;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= resetfull_delay;
         delay_timing_counter <= delay_timing_counter + 1;
        end 
       else begin  
                    reset_st <= resetfull_delay;
        delay_timing_counter <= 24'b0;
       end 
      end
       
      resetfull_release: begin 
       por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;
                if (cs_por_n & cs_resetfull_n & cs_reset_n & cs_resetstat_n)
           if(delay_timing_counter >= `Resetfull_release_delay_time) begin
         reset_st <= idle;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= resetfull_release;
         delay_timing_counter <= delay_timing_counter + 1;
        end  
                 else begin
            reset_st <= resetfull_release;
         delay_timing_counter <= 24'b0;
       end 
      end
      
      ////////////////////  Hard-Reset   ///////////////////////////////
      hreset_check: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;   
       if (~por_req_n)
        reset_st <= por_assert;
       else if (~resetfull_req_n)
                    reset_st <= resetfull_check;   
       else if (cs_por_n & cs_resetfull_n & cs_reset_n)
           if(delay_timing_counter >= `Hardreset_check_delay_time) begin
         reset_st <= hreset_assert;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= hreset_check;
         delay_timing_counter <= delay_timing_counter + 1;
        end 
       else begin
                    reset_st <= hreset_check;
        delay_timing_counter <= 24'h0;
                end    
      end
      
      
            hreset_assert: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b0;   
       delay_timing_counter <= 24'b0;
       if (hreset_req_n)
        reset_st <= hreset_delay;
       else
        reset_st <= hreset_assert;
      end
       
      hreset_delay: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b0;   
       if (cs_por_n & cs_resetfull_n & ~cs_reset_n & ~cs_resetstat_n)
           if(delay_timing_counter >= `Hardreset_assert_delay_time) begin
         reset_st <= hreset_release;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= hreset_delay;
         delay_timing_counter <= delay_timing_counter + 1;
        end 
       else begin  
                    reset_st <= hreset_delay;
        delay_timing_counter <= 24'b0;
       end 
      end
       
      hreset_release: begin 
       por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;
                if (cs_por_n & cs_resetfull_n & cs_reset_n & cs_resetstat_n)
           if(delay_timing_counter >= `Hardreset_release_delay_time) begin
         reset_st <= idle;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= hreset_release;
         delay_timing_counter <= delay_timing_counter + 1;
        end  
                 else begin
            reset_st <= hreset_release;
         delay_timing_counter <= 24'b0;
       end 
      end
      
      ////////////////////  Soft-Reset   ///////////////////////////////
            sreset_check: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;   
       if (~por_req_n)
        reset_st <= por_assert;
       else if (~resetfull_req_n)
                    reset_st <= resetfull_check;
                else if (~hreset_req_n)
                    reset_st <= hreset_check;    
       else if (cs_por_n & cs_resetfull_n & cs_reset_n)
           if(delay_timing_counter >= `Softreset_check_delay_time) begin
         reset_st <= sreset_assert;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= sreset_check;
         delay_timing_counter <= delay_timing_counter + 1;
        end 
       else begin
                    reset_st <= sreset_check;
        delay_timing_counter <= 24'h0;
                end    
      end
      
      
            sreset_assert: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b0;   
       delay_timing_counter <= 24'b0;
       if (sreset_req_n)
        reset_st <= sreset_delay;
       else
        reset_st <= sreset_assert;
      end
       
      sreset_delay: begin 
          por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b0;   
       if (cs_por_n & cs_resetfull_n & ~cs_reset_n & ~cs_resetstat_n)
           if(delay_timing_counter >= `Softreset_assert_delay_time) begin
         reset_st <= sreset_release;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= sreset_delay;
         delay_timing_counter <= delay_timing_counter + 1;
        end 
       else begin  
                    reset_st <= sreset_delay;
        delay_timing_counter <= 24'b0;
       end 
      end
       
      sreset_release: begin 
       por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;
                if (cs_por_n & cs_resetfull_n & cs_reset_n & cs_resetstat_n)
           if(delay_timing_counter >= `Softreset_release_delay_time) begin
         reset_st <= idle;
         delay_timing_counter <= 24'b0;
        end 
        else begin
            reset_st <= sreset_release;
         delay_timing_counter <= delay_timing_counter + 1;
        end  
                 else begin
            reset_st <= sreset_release;
         delay_timing_counter <= 24'b0;
       end 
      end
      
      default : begin
                reset_st <= idle;
       por_out_n <= 1'b1;
       resetfull_out_n <= 1'b1;
       reset_out_n <= 1'b1;   
       delay_timing_counter <= 24'b0;
         end                      
      endcase  
     end
    end  
       
    endmodule

     就拿por_req_n这个请求,在shevm_fpga_core中它一直是高,也就是不可能有上电复位啊(感觉还有挺多这类似的问题),但是实际上不是要有一个上电复位顺序吗

     

    还有你对时钟芯片62005的配置时用的程序代码,还是软件进行配置啊,如果方便的话,能加下QQ吗  1342605270  谢谢了

     

     

  • 就是直接利用开发板的FPGA程序,可以对比下自己的板子和开发板之间的差异,把不必要的FPGA信号给屏蔽掉。多理解下开发板的控制逻辑。

    开发板的FPGA程序里面有SPI相关的,以及CLK2/3,这些就是配置62005时用的,你只需要修改mif文件,就可以配置出来自己想要的时钟了。

    mif里面对应的bit就需要看62005的文档了,我们当时也看了两三天呢。

  • 好的   谢谢你的回答  我自己的板子  最终用的是ALTERA的芯片    就是感觉自带的那个代码  写的好乱

  • @VV  WW

    你配置62005的时候,用到了6678通过SPI接口给FPGA发参数???  我看它的程序

    CDCE62005_2x clk2
       (.FPGA_48MHz          (main_48mhz_clk_r_i)     ,
        .FPGA_rst            (fpga_ireset_n)          ,
        .Vccpg               (set_clk2)               ,
        .PLL_Lock2           (clock2_pll_lock_status) ,
        .start               (set_spi_reg_128)        ,
        .busy                (spi2_busy)              ,
        .ready               (spi2_ready)             ,

        .clk2_por_en         (spi_10h_bit432[0]),                  
        .clk2_resetfull_en   (spi_10h_bit432[1]),            
        .clk2_resetz_en      (spi_10h_bit432[2]),               
        .clk2_por            (clk2_por         ),                     
        .clk2_resetfull      (clk2_resetfull   ),               
        .clk2_resetz         (clk2_resetz      ),         
     
        .iClock_div          (clock2_baudi)       ,
        .Write_data          (clock2_datai)       ,
        .Read_data           (clock2_datao)       ,
        .CLOCK2_SSPCS_o      (clock2_sspcs1_o)    ,
        .CLOCK2_SSPCK_o      (clock2_sspck_o)     ,
        .CLOCK2_SSPSI_o      (clock2_sspsi_o)     ,
        .CLOCK2_SSPSO_i      (clock2_sspso_i)     );     Write_data 和iClock_div 等参数都是通过SPI接口发送过来的,但是这个时候DSP的工作频率都没产生吧,还是你就是用的mif中的初始化值,就是说CLK2这个工程中的ram其实没有写入操作,只是读了其中初始化的值?

    因为我的板子最近不在身边,所以还不能板级调试,所以有些疑问只能咨询下你了       麻烦解答下  谢谢

  • 基于TMS320C6678、FPGA XC5VSX95T的6U CPCI 8路光纤信号处理卡”这款C6678板卡不错,有需要可以关注一下!