Beste,
Ik ben weer eens wat aan het spelen met FPGA's. Nu heb ik hier bijzonder weinig ervaring mee, maar met wat simuleren en veel zoeken online lukt het aardig. Nu ben ik een SPI slave interface aan het maken, puur ter leering en vermaak. Ik heb 2 verschillende implementaties en ik vraag me af of hier doorgewinterde specialisten zitten die eens willen kijken of het een beetje oke is zo.
Ik gebruik trouwens dit om te testen: http://digitaljs.tilk.eu/
Ontwerp 1.
Wat ik hier zelf een nadeel aan vind, is het ophogen van de 'cnt' en het vergelijken in dezelfde edge. Ik weet niet of het verstandig is om op de propagatie delay van het systeem te vertrouwen.
verilog code:
module Spi (
input clk,
input cs,
input sck,
input mosi,
output reg miso,
input [7:0] dataIn,
output reg [7:0] dataOut,
output reg dataClk
);
reg sSCK, sCS, sMOSI;
always @(posedge clk) begin
sSCK <= sck;
sCS <= cs;
sMOSI <= mosi;
end
reg [2:0] cnt;
reg [7:0] dataBuf;
always @(posedge sSCK or posedge sCS) begin
if(sCS) begin
cnt <= 3'b000;
dataClk <= 0;
end else begin
cnt <= cnt + 1;
dataOut <= {dataOut[6:0], sMOSI};
dataClk <= (cnt==3'b111);
if(cnt == 3'b000) begin
dataBuf <= dataIn;
end else begin
dataBuf <= {dataBuf[6:0], 1'b1};
end
end
end
always @(negedge sSCK) begin
miso <= dataBuf[7];
end
endmodule
In de tweede implementatie los ik dit zo op:
verilog code:
always @(posedge sSCK) begin
if(~sCS) begin
dataOut <= {dataOut[6:0], sMOSI};
dataClk <= (cnt==3'b111);
if(cnt == 3'b000) begin
dataBuf <= dataIn;
end else begin
dataBuf <= {dataBuf[6:0], 1'b1};
end
end
end
always @(negedge sSCK or posedge sCS) begin
if(sCS) begin
cnt <= 3'b000;
end else begin
cnt <= cnt + 1;
miso <= dataBuf[7];
end
end
Kan iemand hier wat tips geven wat hier goed of fout aan zou zijn?