task write_to_eeprm;
begin
shift_in(memory_buf);
address={ctrl_byte[3:1],addr_byte};
memory[address]=memory_buf;
$display("eeprm-------memory[%0h]=%0h",address,memory[address]);
state=2'b00;
end
endtask
task read_from_eeprm;
begin
shift_in(ctrl_byte);
if(ctrl_byte==r7 || ctrl_byte==r6 ||ctrl_byte==r5
|| ctrl_byte==r4 ||ctrl_byte==r3 ||ctrl_byte==r2
||ctrl_byte==r1 || ctrl_byte==r0 )
begin
address={ctrl_byte[3:1],addr_byte};
sda_buf=memory[address];
shift_out;
state=2'b00;
end
end
endtask
task shift_in;
output[7:0] shift;
begin
@(posedge scl) shift[7]=sda;
@(posedge scl) shift[6]=sda;
@(posedge scl) shift[5]=sda;
@(posedge scl) shift[4]=sda;
@(posedge scl) shift[3]=sda;
@(posedge scl) shift[2]=sda;
@(posedge scl) shift[1]=sda;
@(posedge scl) shift[0]=sda;
@(negedge scl)
begin
# `timeslice;
out_flag=1;
sda_buf=0;
end
@(negedge scl)
# `timeslice out_flag=0;
end
endtask
task shift_out;
begin
out_flag=1;
for(i=6;i<=0;i=i-1)
begin
@(negedge scl);
# `timeslice;
sda_buf=sda_buf<<1;
end
@(negedge scl) #`timeslice sda_buf[7]=1;
@(negedge scl) # `timeslice out_flag=0;
end
endtask
能说的具体点吗?memory_buf是做什么用的?