发一个自己写的FPGA SPI从机,跨时钟域,SPI跑到18M没发现问题
模块比较简单,直接粘代码了module spi_module(
CLK,
SSEL, SCK, MOSI, MISO,
byte_received, byte_data_received, byte_data_sent
);
input CLK;
// SPI Interface
input SSEL;
input SCK;
input MOSI;
output MISO;
// FPGA Interface
input byte_data_sent;
output byte_received;
output byte_data_received;
reg bitcnt;
reg byte_data_received_w;
always @(posedge SCK or posedge SSEL)
begin
if(SSEL)begin
bitcnt <= 4'b0000;
end
else begin
bitcnt <= bitcnt + 4'b0001;
byte_data_received_w <= {byte_data_received_w, MOSI};
end
end
wire byte_received_w = (~SSEL) && (bitcnt == 4'b1000);
reg byte_data_sentr;
always @(negedge SCK or posedge SSEL)
begin
if(SSEL)
byte_data_sentr <= byte_data_sent;
else begin
if(bitcnt == 3'b000)
byte_data_sentr <= 8'h00;
else
byte_data_sentr <= {byte_data_sentr,1'b0};
end
end
assign MISO = byte_data_sentr;
reg byte_received_r; always @(posedge CLK) byte_received_r <= {byte_received_r,byte_received_w};
assign byte_received = (byte_received_r==2'b01);
reg byte_data_received_r;
always @(posedge CLK)
begin
byte_data_received_r <= byte_data_received_w;
byte_data_received_r <= byte_data_received_r;
end
assign byte_data_received = byte_data_received_r;
endmodule
速度不错,报下在什么器件上实现的呗 mfkiwl 发表于 2015-7-21 18:05
速度不错,报下在什么器件上实现的呗
这个倒是跟器件没太大关系,因为是直接取自SPI的SCK来采集数据的,非同步方式。
用的EP4CE6 有点牛逼,可惜Verilog看不懂,只会VHDL. lans0625 发表于 2015-7-21 20:08
有点牛逼,可惜Verilog看不懂,只会VHDL.
会了Verlog以后,在学校学的VHDL基本忘干净了。 hantnt 发表于 2015-7-21 20:09
会了Verlog以后,在学校学的VHDL基本忘干净了。
我是先学的verilog后学的vhdl,最后前者忘得一干二净。 FPGA当丛机
最大的问题就是 SCK 进入FPGA后,进入全局BUFFER,这段延迟,再加上
FPGA的数据输出在Output Buffer上的延时
这2个延迟加起来有十几ns。
这2个延时不解决,一般FPGA当丛机,SPI时钟最好不要超过30M。 全频阻塞干扰 发表于 2015-7-21 22:11
FPGA当丛机
最大的问题就是 SCK 进入FPGA后,进入全局BUFFER,这段延迟,再加上
FPGA的数据输出在Output Bu ...
说的有道理。 支持原创 全频阻塞干扰 发表于 2015-7-21 22:11
FPGA当丛机
最大的问题就是 SCK 进入FPGA后,进入全局BUFFER,这段延迟,再加上
FPGA的数据输出在Output Bu ...
{:handshake:} 跨时钟域了
页:
[1]