Перейти к содержанию
    

Проверка данных в регистре после сдвига

Здравствуйте!

Есть сдвиговый регистр и входящая линия.

Я хочу после каждого сдвига (записи новых данных) проверять содержимое регистра, как правильно это сделать?

 

always@(posedge CLK)
begin
    DATA_PRELOAD <= { DATA_IN, DATA_PRELOAD[31:1] };
    if((DATA_PRELOAD[31]==0) && (DATA_PRELOAD[30]==1) && (DATA_PRELOAD[29]==0))
    begin
        ///
    end
end

Я так понимаю что операция проверки и операция сдвига могут произойти в один момент и я получу неверный результат.

Как правильно?

Спасибо!

Изменено пользователем woofer46

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

Есть сдвиговый регистр и входящая линия.

Я хочу после каждого сдвига (записи новых данных) проверять содержимое регистра, как правильно это сделать?

 

always@(posedge CLK)
begin
    DATA_PRELOAD <= { DATA_IN, DATA_PRELOAD[31:1] };
    if((DATA_PRELOAD[31]==0) && (DATA_PRELOAD[30]==1) && (DATA_PRELOAD[29]==0))
    begin
        ///
    end
end

Я так понимаю что операция проверки и операция сдвига могут произойти в один момент и я получу неверный результат.

Как правильно?

Спасибо!

Можно вынести операцию проверки отдельно и по ее результатам делать сдвиг...

А что именно Вы хотите проверять?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

Есть сдвиговый регистр и входящая линия.

Я хочу после каждого сдвига (записи новых данных) проверять содержимое регистра, как правильно это сделать?

...

Спасибо!

То что Вы описали : - каждый такт новый бит данных вдвигаются в регистр и

одновременно ПРЕДЫДУЩЕЕ значение регистра сравниваются с константами.

То ли это что Вы хотели не совсем ясно из Вашего описания.

Если же Вы хотите получать совпадение в тот же такт что и новый бит то

...
  DATA_PRELOAD <= { DATA_IN, DATA_PRELOAD[31:1] };
  if ( { DATA_IN, DATA_PRELOAD[31:1] } == CONSTANT_TO_COMPARE}) begin

  end
...

 

Успехов! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То что Вы описали : - каждый такт новый бит данных вдвигаются в регистр и

одновременно ПРЕДЫДУЩЕЕ значение регистра сравниваются с константами.

То ли это что Вы хотели не совсем ясно из Вашего описания.

Если же Вы хотите получать совпадение в тот же такт что и новый бит то

...
  DATA_PRELOAD <= { DATA_IN, DATA_PRELOAD[31:1] };
  if ( { DATA_IN, DATA_PRELOAD[31:1] } == CONSTANT_TO_COMPARE}) begin

  end
...

 

Успехов! Rob.

Спасибо, я хочу именно чтобы сравнивались свежие данные (полученные в текущем такте) с константой.

 

Можно вынести операцию проверки отдельно и по ее результатам делать сдвиг...

А что именно Вы хотите проверять?

Я жду когда в старших трех битах регистра появится 010

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, я хочу именно чтобы сравнивались свежие данные (полученные в текущем такте) с константой.

 

 

Я жду когда в старших трех битах регистра появится 010

 

wire [31:0] new_data = { DATA_IN, DATA_PRELOAD[31:1] };

 

always@(posedge CLK)

begin

DATA_PRELOAD <= new_data;

if(new_data[31:29] == 3'b010)

begin

///

end

end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

wire [31:0] new_data = { DATA_IN, DATA_PRELOAD[31:1] };

 

always@(posedge CLK)

begin

DATA_PRELOAD <= new_data;

if(new_data[31:29] == 3'b010)

begin

///

end

end

Спасибо!

 

А еще вопрос эквивалентны ли эти записи:

always@(posedge CLK)
begin
    CRC = CRC >> 1;
    CRC[7]=DATA_IN_KEEP[31-cnt_bit_crc];
    CRC = CRC ^ CRC_MASK;
end

и

always@(posedge CLK)
begin
    CRC<={DATA_IN_KEEP[31-cnt_bit_crc],CRC[7:1]}^CRC_MASK;
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

always@(posedge CLK)
begin
    CRC = CRC >> 1;
    CRC[7]=DATA_IN_KEEP[31-cnt_bit_crc];
    CRC = CRC ^ CRC_MASK;
end

Про блокирующие и неблокирующие читали?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

С точки зрения логики работы обе схемы будут давать одинаковый результат.

Однако описание синхронной схемы для СИНТЕЗА блокирующими присвоениями считается "плохим стилем" так как легко можно ошибиться и наплодить latch вместо триггера;

 

Успехов! Rob.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

С точки зрения логики работы обе схемы будут давать одинаковый результат.

Однако описание синхронной схемы для СИНТЕЗА блокирующими присвоениями считается "плохим стилем" так как легко можно ошибиться и наплодить latch вместо триггера;

 

Успехов! Rob.

Как раз переделывал под правильный, хороший стиль, хотел убедиться что написал правильно, спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Как раз переделывал под правильный, хороший стиль, хотел убедиться что написал правильно, спасибо!

Хороший стиль это когда Вы сами понимаете что написали.

Правильный это когда и другие понимают и при этом так же как и Вы :)

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как раз переделывал под правильный, хороший стиль, хотел убедиться что написал правильно, спасибо!

Вообще-то есть вполне определенные правила по написанию и по оформлению. И не "вдохновение", и не "самопал", а годами наработанные приемы создания, оформления и хранения и администрирования....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста еще, у меня есть такая конструкция, она с блокирующими присваиваниями и она работает, как изменить такую конструкцию на неблокирующие присваивания чтобы все работало?

always@(posedge CLK)
begin
    if(run_crc==1) 
    begin            
        if(cnt_bit_crc<24)
        begin    
            CRC_MASK[7]=CRC[0];
            CRC_MASK[5]=CRC[0];
            CRC_MASK[4]=CRC[0];
            CRC_MASK[3]=CRC[0];
            CRC<={DATA_IN_KEEP[31-cnt_bit_crc],CRC[7:1]}^CRC_MASK;
            cnt_bit_crc<=cnt_bit_crc+1;
        end    
        else if(cnt_bit_crc==24) 
        begin
            crc_ready<=1;
        end
    end
    else
    begin
        CRC<=8'b11111111;
        CRC_MASK<=8'b00000000;
        cnt_bit_crc<=0;
    end
end

 

Если я данный кусок заменяю на неблокирующее, то расчет идет неправильно, почему, примерно представляю:

        
    CRC_MASK[7]=CRC[0];
    CRC_MASK[5]=CRC[0];
    CRC_MASK[4]=CRC[0];
    CRC_MASK[3]=CRC[0];

Мне для действия CRC<={DATA_IN_KEEP[31-cnt_bit_crc],CRC[7:1]}^CRC_MASK; необходимо сначала собрать маску CRC_MASK, а потом уже сделать операцию XOR.

Как правильн реализовать? Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решил эту проблему следующим образом - по переднему фронту клока делаю вычисление, а по заднему делаю сбор CRC_MASK для нового вычисления.

Оно работает, так я ушел от блокирующего присваивания, такое решение имеет место быть?

always@(posedge CLK)
begin        
    if(crc_start==1)
    begin
        if(cnt_bit_crc<24)
        begin
            CRC<={DATA_IN_KEEP[31-cnt_bit_crc],CRC[7:1]}^CRC_MASK;   // Сдвиг и операция XOR
            cnt_bit_crc<=cnt_bit_crc+1;
        end    
        else if(cnt_bit_crc==24) 
        begin
            crc_ready<=1;
            CRC_KEEP<=CRC;
        end
    end
    else
    begin
        CRC<=8'b11111111; // Инициализация
        crc_ready<=0;
        cnt_bit_crc<=0;
    end    
end
always@(posedge nCLK)
begin        
    if(crc_start==1)
    begin
        if(cnt_bit_crc>0)
        begin
            CRC_MASK[7]<=CRC[0]; // Сбор новой маски
            CRC_MASK[5]<=CRC[0];
            CRC_MASK[4]<=CRC[0];
            CRC_MASK[3]<=CRC[0];
        end
    end
    else
        CRC_MASK<=8'b10111000; // Инициализация
end

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...