[an error occurred while processing this directive]
|
Если в списке событий фронт, тоесть:
always@(posedge Clk)
а в теле проверяэтся уровень сигнала, тоесть:
if(Clk)...,
то компилятор генерирует комбинаторику,- это основной способ сделать ассинхронный reset.
Таким образом, если Вам нужна сихронная логика, то в теле олвейса, не должно быть проверки уровней сигналов из списка событий.
Для решения Вашей задачи нужно разнести по разный олвейсах передний и задний фронт, вот пример определения старта и стопа на I2C:
module IO_I2C(SDA,scl,incycle,in_first,in_second,in_third,out_first,out_second,out_third);
inout SDA;
input scl;
output incycle;
input[7:0]in_first;
input[7:0]in_second;
input[7:0]in_third;
output[7:0]out_first;
output[7:0]out_second;
output[7:0]out_third;
reg start;
reg stop;
//старт стоп
always@(negedge SDA)
begin
if(scl == 1) start = 1;
else start = 0;
end
always@(posedge SDA)
begin
if(scl == 1) stop = 1;
else stop = 0;
end
//формирование окна цикла обмена
assign incycle = start? 1'b1 : (stop? 1'b0 : incycle);
...
incycle = 1 - после старта и 0 после стопа
E-mail: info@telesys.ru