Jump to content
    

SPI verilog

Здравствуйте жители форума.

 

Не подскажите есть ли SPI-master коры на верилоге или vhdl??

На опенсоурсе только слейвы или мастера на шины wishbone или еще че. А мне бы простенький. :)

 

СПС!

Share this post


Link to post
Share on other sites

От блин промахнулся разделом :cranky: . Модераторы подвиньте ее пжлста в работаем с плис или в языки ;)

Share this post


Link to post
Share on other sites

Может пригодиться:

h**p_: //direct.xilinx.com/bvdocs/appnotes/xapp386.pdf

фтп_://ftp.xilinx.com/pub/applications/refdes/xapp386.zip

Share this post


Link to post
Share on other sites

а какая разница: мастер/слейв?

по сути мастер: это слейв с подведенными источниками клока и чипселекта (и выведенными наружу). а база одна - регистр сдвига.

 

PS: да и что мешает тот же wishbone отвинтить, а параметры (делитель клока, разрядность) задать через define

Share this post


Link to post
Share on other sites

спасибо всем за участие.

 

Еще вопрос что за конструкция такая хитрая???

 

   ATTRIBUTE fpga_dont_touch : STRING;
   ATTRIBUTE fpga_dont_touch OF XLXI_9 : LABEL IS "true";


XLXI_9 : NAND2B1
      PORT MAP (I0=>xmit_shift, I1=>xmit_shift, O=>vcc);

 

Причем тут vcc???

 

это из xapp386.zip

Share this post


Link to post
Share on other sites

спасибо всем за участие.

 

Еще вопрос что за конструкция такая хитрая???

 

   ATTRIBUTE fpga_dont_touch : STRING;
   ATTRIBUTE fpga_dont_touch OF XLXI_9 : LABEL IS "true";


XLXI_9 : NAND2B1
      PORT MAP (I0=>xmit_shift, I1=>xmit_shift, O=>vcc);

 

Причем тут vcc???

 

это из xapp386.zip

 

Конструкция устанавливает и постоянно удерживает сигнал vcc в состоянии логической 1, это, наверное, и объяняет авторское название сигнала.

Share this post


Link to post
Share on other sites

спасибо всем за участие.

 

Еще вопрос что за конструкция такая хитрая???

 

   ATTRIBUTE fpga_dont_touch : STRING;
   ATTRIBUTE fpga_dont_touch OF XLXI_9 : LABEL IS "true";


XLXI_9 : NAND2B1
      PORT MAP (I0=>xmit_shift, I1=>xmit_shift, O=>vcc);

 

Причем тут vcc???

 

это из xapp386.zip

 

Конструкция устанавливает и постоянно удерживает сигнал vcc в состоянии логической 1, это, наверное, и объяняет авторское название сигнала.

 

А почему нельзя просто VCC задать на вход требуемой схемы??

А тем более ставить атрибут не оптимизировать??

Share this post


Link to post
Share on other sites

А почему нельзя просто VCC задать на вход требуемой схемы??

А тем более ставить атрибут не оптимизировать??

 

Точный ответ дать затрудняюсь, могу лишь предположить, что авторы считают такую конструкцию наиболее оптимальной для CPLD.

Share this post


Link to post
Share on other sites

А почему нельзя просто VCC задать на вход требуемой схемы??

А тем более ставить атрибут не оптимизировать??

///////////////////////////////

Скорее всего разработчик работал так называемым методом тыка.

Share this post


Link to post
Share on other sites

А почему нельзя просто VCC задать на вход требуемой схемы??

А тем более ставить атрибут не оптимизировать??

///////////////////////////////

Скорее всего разработчик работал так называемым методом тыка.

 

Я просто сделал VCC и оно заработало, но неприятный осадок остался ;)

Share this post


Link to post
Share on other sites

module spi_master ( clk,nWR,MOSI,SCLK,SS,DATA,IN_SS);
    
    input clk,nWR,IN_SS;
    input [9:0] DATA;
    output MOSI,SCLK,SS;
    reg MOSI,MOSI_int,SS,SCLK;
    reg ss,sclk,mosi;
    wire clk;
    reg [9:0] S_DATA;
    reg [3:0] cnt_div;
    reg RESET,s_clk,spi_clk,spi_tmp1,spi_tmp2,spi_tmp3,cnt_en;
    
    reg [3:0] cnt; 
    
    
    
    initial 
        begin     
            RESET<=1;
            cnt<=0;
            cnt_div<=0;
            cnt_en<=0;
        end        // executes first assignment and then repeats the statement as long as 
    
    
    always@(posedge clk)        //counter for clock division clk/8
        cnt_div<=cnt_div+1;
    
    always@(posedge clk)
        s_clk<=cnt_div[3];         //divided frequency clk/8
    
    always@(posedge clk)              //shifting frequency
        begin
            spi_tmp1<=cnt_div[3];
            spi_tmp2<=spi_tmp1;
            spi_tmp3<=spi_tmp2;
            spi_clk<=spi_tmp3;
        end
    
    localparam piso_shift=10; 
    integer I;                        //inverting bus (MSB in spi MUST be FIRST
    always@(DATA) 
        for (I=0; I<10; I=I+1)
            S_DATA[I]<=DATA[9-I];
    
    
    //assign S_DATA=DATA;
    
    reg [piso_shift-1:0] DATA_INT;                                                  // terminates excution of a named group of statements
    
    always @(posedge s_clk or negedge RESET)
        if (!RESET)    
            begin
                DATA_INT <= 0;
                MOSI_int    <= 1'b0;
            end
        else if (!nWR)
            DATA_INT<=S_DATA;
        // <ouput>    <= <input>[0];
        else if (!SS)
            begin
                DATA_INT <= {1'b0,DATA_INT[piso_shift-1:1]};
                MOSI_int   <= DATA_INT[0];
            end     
    
    always@(posedge nWR or negedge RESET) 
        if  (!RESET) cnt_en<=1'b0;
        else 
            cnt_en<=1'b1;
    
    always@(cnt_en) 
        //if (cnt>=1 && cnt_en==1)
        ss<=~cnt_en;
    //else
    //SS<=0;    
    
    
    
    always@(posedge s_clk or negedge nWR or negedge RESET)
        if(!RESET || !nWR)
            cnt<=4'b0000;
        else if(cnt_en)
            cnt<=cnt+1;
    
    always@(posedge s_clk)
        if (cnt==10)
            RESET<=0;
        else 
            RESET<=1;
    
    always@(posedge clk)    //sdelat po frontu clk
        begin//clk
            if (!ss) 
                if (cnt>0)    
                    sclk<=spi_clk; 
                else 
                    sclk<=1'b0;
        end
    
    always@( posedge clk)
        if (!ss) 
            mosi<=MOSI_int;
        else 
            mosi<=1'b1;    
    
    always@(IN_SS,mosi,sclk,ss)
        if (IN_SS)
            begin
                MOSI<=mosi;
                SCLK<=sclk;
                SS<=ss;
            end
        else     
            begin
                MOSI<=1'bz;
                SCLK<=1'bz;
                SS<=1'bz;
            end
endmodule

 

Скажите мне люди добрые, какие траблы могут быть у этой схемы, если конечно они есть.

Share this post


Link to post
Share on other sites

Еще вопросик??

 

В у меня должно быть два SPI мастера, один контроллер, второй FPGA. В каком состоянии должны быть ножки плисины, когда она не передает???

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...