|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
在做毕业设计,其中一部分需要用到FPGA采集数据,用ARM来隔一段时间通过SPI采集一次数据,因此编写了一个简单的仿SPI从机的小程序,因为新手,遇到了折腾一个月也没解决的问题,试用过状态机的方法,移位寄存器的方法,还有目前的类似于数组指针的方法,统统出现一个问题,就是仿真没有问题,但是下载到片内就不正常运行。最近两天用Technology Map Viewer(我用Quartus II 9.0)看,发现有好几个寄存器被优化掉了,而且本来应该在下降沿发生计数变化的,居然在上升沿也会跳变,总之实际结果与预想结果相差太远,实在是没有办法了,身边没有人教,纯粹自学,由于关系到毕业设计,所以还请各位大哥大姐大叔大婶大爷大妈,行行好,帮我看看究竟怎么回事,该怎么解决这个问题啊,俺给您磕头了。
以下为源程序:
module spi(SCK,MOSI,MISO,SSEL,RevData);
input SCK;
input MOSI;
input SSEL;
output reg MISO;
wire temp;
output [7:0]RevData;
reg [7:0]Data;
wire [7:0] ParaData;
assign ParaData=8'h72;
spimod myspi(.SCK(SCK),.SSEL(SSEL),.MISO(temp),.MOSI(MOSI),
.ParaData(ParaData),.RevData(RevData));
endmodule
///////////////////////////////////////////////////////
module spimod(SCK,SSEL,MISO,MOSI,ParaData,RevData);
input SCK;
input SSEL;
output reg MISO;
input MOSI;
input [7:0] ParaData;
reg [3:0] ShiftCount;
reg [15:0] ShiftReg;
wire ShiftClock;
output reg [7:0] RevData;
assign ShiftClock=SCK | SSEL;
always @(negedge ShiftClock)
begin
if(ShiftCount>=4'h8)
ShiftCount<=4'b0000;
else
ShiftCount<=ShiftCount+1'b1;
end
always @(posedge SCK)
begin
MISO<=ShiftReg[16-ShiftCount];
end
always @(negedge SSEL)
begin
ShiftReg[15:8]<=ParaData;
end
always @(negedge SCK)
begin
ShiftReg[7:1]<=ShiftReg[6:0];
ShiftReg[0]<=MOSI;
end
always @(posedge SSEL)
begin
RevData<=ShiftReg[7:0];
end
endmodule
再磕三个响头了……谢谢 |
|