cquyy 发表于 2015-12-28 21:42:25

SPI 主

module spi_master(
clk,    // global clock
reset_n,// global async low reset
clk_div,// spi clock divider
wr,    // spi write
wrdata,    // spi write data, 8bit
rddata,    // spi recieve data, 8bit, valid when ready assert
sck,    // spi master clock out
sdi,    // spi master data in (MISO)
sdo,    // spi master data out (MOSI)
ready    // spi master ready (idle)
);
input   clk;
input   reset_n;
input   clk_div;
input   wr;
input   wrdata;
outputrddata;
outputsck;
outputsdo;
outputready;
input   sdi;

parameter clock_polarity = 1;// '0': mode 0, sck=0 when idle; '1': mode 3, sck=1 when idle

reg   dat;
reg   rsck;
reg   cnt;
reg   busy;
reg   state;
reg   rddata;

wiresdo = dat;
wiresck = busy? rsck:clock_polarity;
wiresdi_tick = (cnt==clk_div>>1)/*synthesis keep*/;
wiresdo_tick = (cnt==clk_div)/*synthesis keep*/;
wireready = !(wr||busy);

always @(posedge clk or negedge reset_n)
if(!reset_n)
cnt <= 0;
else if(cnt<clk_div && busy)
cnt <= cnt + 1;
else
cnt <= 1;

always @(posedge clk or negedge reset_n)
if(!reset_n)
rsck<= 0;
else if(sdi_tick)
rsck<= 1;
else if(sdo_tick)
rsck<= 0;

always @(posedge clk or negedge reset_n)
if(!reset_n)
busy <= 0;
else if(wr && !busy)
busy <= 1;
else if(state==8 && sdo_tick)
busy <= 0;

always@(posedge clk or negedge reset_n)
if(!reset_n)
state<= 0;
else if(wr && !busy)
state<= 1;
else if(state==8 && sdo_tick)
state<= 0;
else if(sdo_tick)
state<= state + 1;

always @(posedge clk or negedge reset_n)
if(!reset_n)
dat<= 0;
else if(wr && !busy)
dat<= wrdata;
else if(sdo_tick && busy && state!=8)
dat<= dat<<1;

always @(posedge clk or negedge reset_n)
if(!reset_n)
rddata<= 0;
else if(sdi_tick && busy)
rddata<= {rddata,sdi};

endmodule

hyf760909 发表于 2016-1-6 05:40:10

哇代码都贴出了,感谢 !
页: [1]
查看完整版本: SPI 主