📄 spi.v
字号:
module spi(
clock ,
reset48 ,
add ,
cs128 ,
cs ,
cs_invert,
rd ,
din ,
dout ,
sclk ,
irq_b ,
dataout
);
input clock ;
input din ;
input reset48 ;
input cs ;
input rd ;
input cs_invert;
input [14:0]add ;
output dout ;
output cs128 ;
output sclk ;
output irq_b ;
output [ 7:0] dataout ;
wire r_fpga ;
wire [14:0] address ;
reg dout ;
reg cs128 ;
reg irq_b ;
reg [ 7:0] dataout ;
reg [ 7:0] bytes ;
reg [ 2:0] bits ;
reg [ 3:0] div_counter ;
reg [11:0] counter ;
reg work_period ;
reg work_period_d ;
reg [ 3:0] work_counter;
reg [ 3:0] work_counter_d;
reg [ 7:0] sram3[159:0] ;
reg [ 6:0] words ;
reg sclk ;
reg [ 7:0] q ;
assign r_fpga =cs_invert && (~rd) ;
assign address =add-15'd300 ;
always @ (posedge clock or negedge reset48)
if(~reset48)
counter <=12'd0;
//else if((~work_period) && work_period_d)
// counter <=12'd0;
else if(counter==12'd3749)
counter <=12'd0;
else
counter <=counter+12'd1;
always @ (posedge clock or negedge reset48)
if(~reset48)
work_period <=1'b0;
else if(counter==12'd3749)
work_period <=1'b1;
else if(work_counter==4'd0 && work_counter_d==4'd15)
work_period <=1'b0;
always @ (posedge clock or negedge reset48)
if(~reset48)
work_counter_d <=4'd0;
else
work_counter_d <=work_counter;
always @ (posedge sclk or negedge reset48)
if(~reset48)
work_period_d <=1'b0;
else
work_period_d <=work_period;
always @ (posedge sclk or negedge reset48)
if(~reset48)
work_counter <=4'd0;
else if(work_counter==4'd15)
work_counter <=4'd0;
else if(work_period && work_period_d)
work_counter <=work_counter+4'd1;
always @ (posedge clock or negedge reset48)
if(~reset48)
div_counter <=4'd0;
//else if(counter==12'd3750)
// div_counter <=4'd0;
else
div_counter <=div_counter+4'd1;
always @ (posedge clock or negedge reset48)
if(~reset48)
sclk <=1'b0;
else
sclk <=div_counter[3];
always @ (posedge sclk)
if(work_period)
sram3[bytes] <=q;
always @ (negedge sclk)
if(work_period)
q[bits] <=din;
always @ (posedge clock or negedge reset48)
if(~reset48)
words <= 7'd0;
else if(words==7'd80)
words <= 7'd0;
else if((~work_period) && work_period_d)
words <= words+7'd1;
always @ (posedge sclk or negedge reset48)
if(~reset48)
bytes <= 8'd0;
else if(bytes==8'd160 && bits==3'd7)
bytes <= 8'd0;
else if(bits==3'd7)
bytes <= bytes+8'd1;
always @ (posedge sclk or negedge reset48)
if(~reset48)
bits <= 3'd0;
else if(work_period && work_period_d)
bits <= bits+3'd1;
always @ (negedge sclk or negedge reset48)
if(~reset48)
dout <= 1'b0;
else
dout <= 1'b0;
always @ (posedge clock or negedge reset48)
if(~reset48)
cs128 <= 1'b1;
else if(work_period)
cs128 <= 1'b0;
else
cs128 <= 1'b1;
always @ (posedge clock or negedge reset48)
if(~reset48)
irq_b <= 1'b1;
else if(bytes==8'd160 && bits==3'd7)
irq_b <= 1'b0;
else if(~(rd||cs))
irq_b <= 1'b1;
always @ (posedge clock)
if(r_fpga)
dataout<=sram3[address];
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -