Перейти к содержанию
    

SPI slave help!?

Помогите кто может блоком spi slave!!! Я только начал осваивать verilog. Работаю в квартусе. Заранее большое спасибо!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите кто может блоком spi slave!!! Я только начал осваивать verilog. Работаю в квартусе. Заранее большое спасибо!!

 

 

SPI mode 00

 

`timescale 1 ps / 1 ps


module SPI (nRESET, SCL ,SDA,SSB,MISO,
    HiTreshold,LoTreshold5,LoTreshold4,LoTreshold3,LoTreshold2,LoTreshold1,LoTr
eshold0,TH_FC_1_2,TH_FC_3_4,
    X_REG_SUPR,PRBS_I2C_MODE,rw
      );
    
    input SCL;
    wire SCL;
    input nRESET;
    input SDA;     
    input SSB;
    output [7:0] HiTreshold,LoTreshold5,LoTreshold4,LoTreshold3,LoTreshold2,LoTreshold1,LoTreshol
d0;
    output [7:0] TH_FC_1_2,TH_FC_3_4;
    output [7:0] X_REG_SUPR,PRBS_I2C_MODE;            
    output MISO;
    output rw;
    
    
    reg acc_done;
    reg [7:0] sr;
    reg [2:0] state; // synopsys enum_state
    reg [2:0] bit_cnt; 
    wire rw;   //0-write;1-read;
    wire [3:0] mem_adress;
    //-----------------------------------------------------------------------------------------
    wire mosi_int,ssb_int,scl_int;
    reg [7:0] miso_int;
    wire miso_bit;
    //------------------------------------------------------------------------------------------   
    reg [7:0] mem [0:15]; // initiate memory       //GENERATE!!
    reg [4:0] mem_adr;   // memory address
    
    //SPI statemachine declaration
    parameter idle        = 3'b000;
    parameter get_mem_adr = 3'b010;
    parameter data        = 3'b100;
    

    
assign mosi_int=SDA;
assign ssb_int=SSB;
//assign    scl_int=(!SSB) ? SCL: 1'bZ;
assign    scl_int=SCL;


always@(posedge scl_int or posedge SSB)
     if(SSB)
            state<=idle;
     else
         case(state)
             idle: state<=get_mem_adr;     
             get_mem_adr: if(acc_done)
                            begin
                              state<=data;
                            end 
            data: state<=data; 
                 default: state<=idle;
        endcase     
                              
     
always@(posedge scl_int or posedge SSB)
    if(SSB)
        sr<={8{1'b0}};
    else
        sr<={sr[6:0],mosi_int};
        
always@(negedge scl_int or posedge SSB)
    if (SSB)
        bit_cnt<=3'b111;
    else if(state==get_mem_adr || state==data)
        bit_cnt<=bit_cnt-1;          
        
always@(posedge scl_int)
    acc_done <= !(|bit_cnt);
    
always@(negedge scl_int)
    if(acc_done)
     begin    
      if (state==get_mem_adr)
      mem_adr<=sr[4:0];
    else
      mem_adr<=mem_adr+2;
     end    

assign rw=mem_adr[0];
assign mem_adress=mem_adr[4:1];
        
always@(negedge scl_int or negedge nRESET)
    if(!nRESET)
            begin 
            mem[0]<=8'hA7;    //HiTreshold 
            mem[1]<=8'h40;  //LoTreshold5
            mem[2]<=8'h20;    //LoTreshold4
            mem[3]<=8'h10;    //LoTreshold3
            mem[4]<=8'h08;    //LoTreshold2
            mem[5]<=8'h04;    //LoTreshold1
            mem[6]<=8'h02;    //LoTreshold0
            mem[7]<=8'h14;    //TH_FC_1_2
            mem[8]<=8'h80;    //TH_FC_3_4
            mem[9]<=8'hC1;    //X_REG_SUPR
            mem[10]<=8'b00001011;    //PRBS_I2C_SPI_MODE
        //    mem[11]<=8'b00001100;
        //    mem[12]<=8'b00001101;
        //    mem[13]<=8'b00001110;
        //    mem[14]<=8'b00001111;
        //    mem[15]<=8'b00010000; 
            end
    else if(state==data && rw==0 && bit_cnt==3'b000)
        mem[mem_adress]<=sr;
    
        
assign miso_bit =(rw)? miso_int[bit_cnt] : 1'b1;    

always@(mem_adress,bit_cnt,mem[0],mem[1],mem[2],mem[3],mem[4],mem[5],mem[6],mem[7],mem[8],mem[9],mem[10])
    case(mem_adress)
     4'd0:miso_int<=mem[0];
     4'd1:miso_int<=mem[1];
     4'd2:miso_int<=mem[2];
     4'd3:miso_int<=mem[3];
     4'd4:miso_int<=mem[4];
     4'd5:miso_int<=mem[5];
     4'd6:miso_int<=mem[6];
     4'd7:miso_int<=mem[7];
     4'd8:miso_int<=mem[8];
     4'd9:miso_int<=mem[9];
     4'd10:miso_int<=mem[10];
     default:miso_int<=mem[0];
     endcase

assign MISO=(SSB) ? 1'bZ: miso_bit;        
assign     HiTreshold=mem[0];
assign  LoTreshold5=mem[1];
assign  LoTreshold4=mem[2];
assign  LoTreshold3=mem[3];
assign  LoTreshold2=mem[4];
assign  LoTreshold1=mem[5];
assign  LoTreshold0=mem[6];
assign  TH_FC_1_2=mem[7];
assign  TH_FC_3_4=mem[8];
assign  X_REG_SUPR=mem[9]; 
assign  PRBS_I2C_MODE=mem[10]; // PRBS_I2C_SPI_MODE only 4 lsb;
endmodule

 

Под сигналом SDA подразумевать MOSI. Работает, проверено на Ксайлинксе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое будем пробовать!!!!

А еще имеет смысл посмотреть опенкорес там есть модель слейва.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...