spi 成功触发主机发送
This commit is contained in:
@@ -70,9 +70,9 @@ class SpiInterface extends Module{
|
|||||||
|
|
||||||
// spiRegUp.io.enw := isSckPosedgeNext(1) & ~shiftCSn(1+1) & bitSel === 0.U & spiCmd === 1.U
|
// spiRegUp.io.enw := isSckPosedgeNext(1) & ~shiftCSn(1+1) & bitSel === 0.U & spiCmd === 1.U
|
||||||
|
|
||||||
io.isEnR := isSckPosedgeNext(0) & bitSel === 0.U & byteSel >= 3.U & isSpiRead
|
io.isEnR := isSckPosedge & ~shiftCSn(1+1) & bitSel === 7.U & byteSel >= 3.U & isSpiRead
|
||||||
io.isEnW := isSckPosedgeNext(1) & ~shiftCSn(1+1) & bitSel === 0.U & isSpiWrite & byteSel >= 4.U
|
io.isEnW := isSckPosedgeNext(0) & ~shiftCSn(1+1) & bitSel === 0.U & isSpiWrite & byteSel >= 4.U
|
||||||
io.dataw := exReg
|
io.dataw := RegNext(exReg)
|
||||||
|
|
||||||
when( shiftCSn(2) & ~shiftCSn(1) ){
|
when( shiftCSn(2) & ~shiftCSn(1) ){
|
||||||
bitSel := 0.U
|
bitSel := 0.U
|
||||||
@@ -86,9 +86,9 @@ class SpiInterface extends Module{
|
|||||||
|
|
||||||
when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳
|
when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳
|
||||||
addrSel := 0.U
|
addrSel := 0.U
|
||||||
} .elsewhen(isSckPosedgeNext(0) & ~shiftCSn(1) & bitSel === 0.U & byteSel === 1.U){ //CS为低,且SCK上跳的第0byte
|
} .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel === 7.U & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte
|
||||||
addrSel := exReg
|
addrSel := exReg
|
||||||
} .elsewhen(isSckPosedgeNext(0) & ~shiftCSn(1) & bitSel === 0.U & byteSel === 2.U) {//CS为低,且SCK上跳的第0byte
|
} .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel === 7.U & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte
|
||||||
addrSel := Cat(exReg, addrSel(7,0))
|
addrSel := Cat(exReg, addrSel(7,0))
|
||||||
} .otherwise{ // byteSel > 1.U
|
} .otherwise{ // byteSel > 1.U
|
||||||
when( isSckPosedge & byteSel > 3.U & bitSel === 7.U ){
|
when( isSckPosedge & byteSel > 3.U & bitSel === 7.U ){
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ module ShinTopSpiTb(
|
|||||||
wire spi_miso;
|
wire spi_miso;
|
||||||
reg [4:0] spi_csn;
|
reg [4:0] spi_csn;
|
||||||
|
|
||||||
|
wire isResp;
|
||||||
|
|
||||||
ShinTop s_ShinTop_Mst(
|
ShinTop s_ShinTop_Mst(
|
||||||
.clock(clock),
|
.clock(clock),
|
||||||
@@ -34,7 +34,7 @@ ShinTop s_ShinTop_Mst(
|
|||||||
.io_ospi_miso(spi_miso),
|
.io_ospi_miso(spi_miso),
|
||||||
.io_ospi_csn (spi_csn[0]),
|
.io_ospi_csn (spi_csn[0]),
|
||||||
|
|
||||||
.io_rsp_valid(),
|
.io_rsp_valid(isResp),
|
||||||
.io_rsp_bits_isError(),
|
.io_rsp_bits_isError(),
|
||||||
.io_rsp_bits_length()
|
.io_rsp_bits_length()
|
||||||
);
|
);
|
||||||
@@ -218,11 +218,11 @@ end
|
|||||||
|
|
||||||
reg [11:0] transCnt;
|
reg [11:0] transCnt;
|
||||||
reg [11:0] byteCnt;
|
reg [11:0] byteCnt;
|
||||||
reg [3:0] bitCnt;
|
reg [2:0] bitCnt;
|
||||||
|
|
||||||
|
|
||||||
always @(posedge sck) begin
|
always @(posedge clock) begin
|
||||||
if( isReq ) begin
|
if( isReq & sck == 0 ) begin
|
||||||
isBusy <= #5 1'b1;
|
isBusy <= #5 1'b1;
|
||||||
transCnt <= #5 0;
|
transCnt <= #5 0;
|
||||||
|
|
||||||
@@ -232,12 +232,17 @@ always @(posedge sck) begin
|
|||||||
spi_csn[idx] <= #5 1'b0;
|
spi_csn[idx] <= #5 1'b0;
|
||||||
exChangeReg <= txBuf[0];
|
exChangeReg <= txBuf[0];
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
always @(posedge sck) begin
|
||||||
if( isBusy ) begin
|
if( isBusy ) begin
|
||||||
if( transCnt < length ) begin
|
if( transCnt < length ) begin
|
||||||
bitCnt <= bitCnt + 1;
|
bitCnt <= bitCnt + 1;
|
||||||
|
|
||||||
if( bitCnt == 7 ) begin
|
if( bitCnt == 7 ) begin
|
||||||
byteCnt <= byteCnt +1;
|
byteCnt <= byteCnt +1;
|
||||||
|
transCnt <= transCnt + 1;
|
||||||
rxBuf[byteCnt] <= exChangeReg;
|
rxBuf[byteCnt] <= exChangeReg;
|
||||||
exChangeReg <= txBuf[byteCnt+1];
|
exChangeReg <= txBuf[byteCnt+1];
|
||||||
end else begin
|
end else begin
|
||||||
@@ -355,7 +360,7 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
|
|||||||
txBuf[1] <= saddress[15:8];
|
txBuf[1] <= saddress[15:8];
|
||||||
txBuf[2] <= scmd;
|
txBuf[2] <= scmd;
|
||||||
|
|
||||||
length <= slength;
|
length <= slength + 3;
|
||||||
idx <= sidx;
|
idx <= sidx;
|
||||||
|
|
||||||
#5
|
#5
|
||||||
@@ -364,8 +369,8 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
|
|||||||
@(posedge sck) #5
|
@(posedge sck) #5
|
||||||
isReq <= 0;
|
isReq <= 0;
|
||||||
|
|
||||||
|
@( negedge isBusy) #1000
|
||||||
|
begin end
|
||||||
end
|
end
|
||||||
|
|
||||||
endtask
|
endtask
|
||||||
@@ -420,6 +425,8 @@ initial begin
|
|||||||
|
|
||||||
txBuf[0+3] = 8'h01;
|
txBuf[0+3] = 8'h01;
|
||||||
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
||||||
|
@(posedge isResp) #5 begin end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -471,7 +478,7 @@ initial begin
|
|||||||
|
|
||||||
txBuf[0+3] = 8'h01;
|
txBuf[0+3] = 8'h01;
|
||||||
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
||||||
|
@(posedge isResp) #5 begin end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -575,7 +582,7 @@ initial begin
|
|||||||
|
|
||||||
txBuf[0+3] = 8'h01;
|
txBuf[0+3] = 8'h01;
|
||||||
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
||||||
|
@(posedge isResp) #5 begin end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -646,7 +653,7 @@ initial begin
|
|||||||
|
|
||||||
txBuf[0+3] = 8'h01;
|
txBuf[0+3] = 8'h01;
|
||||||
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
|
||||||
|
@(posedge isResp) #5 begin end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user