|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
路过的大神帮看一眼吧,就是一个接口从机的收发数据的代码,就是编译不过去,一共三个模块,接收模块是串行转并行,RAM模块是内存,发送模块是并行转串行,到底问题出在哪啊
`timescale 1ns/1nsmodule spi_sl(sck,cs,rst,spi_mosi,spi_miso);
input wire sck,cs,rst;
input wire spi_mosi;
output wire spi_miso;
reg spi_en; //control parallel data send to data_bus
wire [9:0] data_bus; //parallel bus
reg [3:0] state;
reg [3:0] stateo;
reg [9:0] spi_i; //save date when the data send to slave
//reg [7:0]spi_o; //save date when the data is sent to master
//reg re_tb; //receive register
//reg se_tb; //send register
integer i;
reg [7:0] mem[0:1]; //ram 2*8
reg wrd_en = 1'bz; // write and read ram enable 1=write 0=read
reg add = 1'bz; //address
reg [7:0]data = 8'bz;
reg [7:0] data1 = 8'bz;//output register
parameter ready = 4'b0000,
bit0 = 4'b0001,
bit1 = 4'b0011,
bit2 = 4'b0010,
bit3 = 4'b0110,
bit4 = 4'b0111,
bit5 = 4'b0101,
bit6 = 4'b0100,
bit7 = 4'b1100,
bit8 = 4'b1101,
bit9 = 4'b1111;
parameter start = 4'b0000, bito0 = 4'b0001,bito1 = 4'b0011,bito2 = 4'b0010,
bito3 = 4'b0110,bito4 = 4'b0111,bito5 = 4'b0101,bito6 = 4'b0100,bito7 = 4'b1100;
//spi_en =1 mean the data have received
assign data_bus = spi_en? spi_i:10'bz;
//serial conversion to parallel bus
always @(posedge sck or negedge rst)
begin
if(!rst)
begin
spi_i <= 0;
spi_en <= 1'b0;
end
else
if(cs)
begin spi_i <= 0;
spi_en <= 1'b0;
end
else
case (state)
ready:
begin
spi_i <= 0;
spi_en <= 1'b0;
state <= bit0;
end
bit0:
begin
spi_i <= {spi_i[10:0],spi_mosi};
state <= bit1;
end
bit1:
begin
spi_i <= {spi_i[10:0],spi_mosi};
state <= bit2;
end
bit2:
begin
spi_i <= {spi_i[10:0],spi_mosi};
state <= bit3;
end
bit3:
begin
spi_i <= {spi_i[10:0],spi_mosi};
state <= bit4;
end
bit4:
begin
spi_i <= {spi_i[10:0],spi_mosi};
state <= bit5;
end
bit5:
begin
spi_i <= {spi_i[10:0],spi_mosi};
state <= bit6;
end
bit6:
begin
spi_i <= {spi_i[10:0],spi_mosi};
state <= bit7;
end
bit7:
begin
spi_i <= {spi_i[10:0],spi_mosi};
spi_en <= 1'b1;
state <= bit8;
end
bit8:
begin
spi_i <= {spi_i[10:0],spi_mosi};
spi_en <= 1'b1;
state <= bit9;
end
bit9:
begin
spi_i <= {spi_i[10:0],spi_mosi};
spi_en <= 1'b1;
state <= bit10;
end
bit10:
begin
spi_i <= {spi_i[10:0],spi_mosi};
spi_en <= 1'b1;
state <= ready;
end
default: state <= ready;
endcase
end
always @(spi_en)
begin
if(spi_en)
begin
wrd_en = data_bus[9];
add = data_bus[8];
data = data_bus[7:0];
end
else
begin
wrd_en = 1'bz;
add = 1'bz;
data = data;
end
//ram
always @(posedge sck or negedge rst)
begin
if(!rst)
begin
for(i = 0;i <= 1;i = i + 1)
mem <= 1'b0;
end
else
begin
case(wrd_en)
1: mem[add] <= data;
0: data1 <= mem[add];
default: data1 <= 8'bz;
endcase
end
end
//output module
always @(data1)
begin
case (stateo)
start:
begin
state0 = bito0;
spi_miso = data1[7];
end
bito0:
begin
state0 = bito1;
spi_miso = data1[6];
end
bito1:
begin
state0 = bito2;
spi_miso = data1[5];
end
bito2:
begin
state0 = bito3;
spi_miso <= data1[4];
end
bito3:
begin
state0 = bito4;
spi_miso = data1[3];
end
bito4:
begin
state0 = bito5;
spi_miso = data1[2];
end
bito5:
begin
state0 = bito6;
spi_miso = data1[1];
end
bito6:
begin
state0 = bito7;
spi_miso = data1[0];
end
bito7:
begin
state0 = start;
spi_miso = 1'bz;
end
endcase
end
endmodule |
|