always@(posedge clk) //cs的下降沿中的CS出發串行行輸出
begin
if(!cs)
begin
data_read <= {data_read[6:0],1'b0}; //移位
miso_o<=data_read[7];
end
end
endmodule
這是最初的代碼,直接了當的描述要實現的功能。但是編譯時報如下錯
Error (10028): Can't resolve multiple constant drivers for net "data_read[7]" at spi02.v(33)
Error (10029): Constant driver at spi02.v(18)
Error (10028): Can't resolve multiple constant drivers for net "data_read[6]" at spi02.v(33)
Error (10028): Can't resolve multiple constant drivers for net "data_read[5]" at spi02.v(33)
Error (10028): Can't resolve multiple constant drivers for net "data_read[4]" at spi02.v(33)
。。。。。。作者: 面壁 時間: 2011-11-18 13:10
看上去錯誤似乎是 兩個ALWAYS事件中都對data_read 的連接方式作出要求,而且這兩種連接方式有沖突。
always@( posedge cs ) //flag至0
begin
flag<=1'b0;
end
always@(posedge clk)
begin
if((!cs)&&flag)
begin
data_read <= {data_read[6:0],1'b0};
miso_o<=data_read[7];
end
end
endmodule
我希望通過 FLAG來告訴他當 兩個觸發同時發生時 先做哪個。但是好像不起作用。
報錯還多了一個:
Error (10028): Can't resolve multiple constant drivers for net "flag" at spi02.v(34)作者: 面壁 時間: 2011-11-18 13:28
最后我索性把 兩個信號放在一個ALWAYS里
always@( cs or clk )
begin
if (!cs)
begin
if(!flag)
begin
data_read[0]<= data[0];
data_read[1]<= data[1];
data_read[2]<= data[2];
data_read[3]<= data[3];
data_read[4]<= data[4];
data_read[5]<= data[5];
data_read[6]<= data[6];
data_read[7]<= data[7];
flag<=1;
end
else
begin
data_read <= {data_read[6:0],1'b0};
miso_o<=data_read[7];
end
end
else
begin
flag<=1;
end