bezobraznic 0 7 июня, 2007 Опубликовано 7 июня, 2007 · Жалоба Помогите кто может блоком spi slave!!! Я только начал осваивать verilog. Работаю в квартусе. Заранее большое спасибо!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 8 июня, 2007 Опубликовано 8 июня, 2007 · Жалоба Помогите кто может блоком 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. Работает, проверено на Ксайлинксе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bezobraznic 0 8 июня, 2007 Опубликовано 8 июня, 2007 · Жалоба Спасибо большое будем пробовать!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 8 июня, 2007 Опубликовано 8 июня, 2007 · Жалоба Спасибо большое будем пробовать!!!! А еще имеет смысл посмотреть опенкорес там есть модель слейва. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться