woofer46 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 (изменено) · Жалоба Здравствуйте! Есть сдвиговый регистр и входящая линия. Я хочу после каждого сдвига (записи новых данных) проверять содержимое регистра, как правильно это сделать? 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 Я так понимаю что операция проверки и операция сдвига могут произойти в один момент и я получу неверный результат. Как правильно? Спасибо! Изменено 8 февраля, 2016 пользователем woofer46 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Здравствуйте! Есть сдвиговый регистр и входящая линия. Я хочу после каждого сдвига (записи новых данных) проверять содержимое регистра, как правильно это сделать? 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 Я так понимаю что операция проверки и операция сдвига могут произойти в один момент и я получу неверный результат. Как правильно? Спасибо! Можно вынести операцию проверки отдельно и по ее результатам делать сдвиг... А что именно Вы хотите проверять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Здравствуйте! Есть сдвиговый регистр и входящая линия. Я хочу после каждого сдвига (записи новых данных) проверять содержимое регистра, как правильно это сделать? ... Спасибо! То что Вы описали : - каждый такт новый бит данных вдвигаются в регистр и одновременно ПРЕДЫДУЩЕЕ значение регистра сравниваются с константами. То ли это что Вы хотели не совсем ясно из Вашего описания. Если же Вы хотите получать совпадение в тот же такт что и новый бит то ... DATA_PRELOAD <= { DATA_IN, DATA_PRELOAD[31:1] }; if ( { DATA_IN, DATA_PRELOAD[31:1] } == CONSTANT_TO_COMPARE}) begin end ... Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба То что Вы описали : - каждый такт новый бит данных вдвигаются в регистр и одновременно ПРЕДЫДУЩЕЕ значение регистра сравниваются с константами. То ли это что Вы хотели не совсем ясно из Вашего описания. Если же Вы хотите получать совпадение в тот же такт что и новый бит то ... DATA_PRELOAD <= { DATA_IN, DATA_PRELOAD[31:1] }; if ( { DATA_IN, DATA_PRELOAD[31:1] } == CONSTANT_TO_COMPARE}) begin end ... Успехов! Rob. Спасибо, я хочу именно чтобы сравнивались свежие данные (полученные в текущем такте) с константой. Можно вынести операцию проверки отдельно и по ее результатам делать сдвиг... А что именно Вы хотите проверять? Я жду когда в старших трех битах регистра появится 010 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sobol' 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Спасибо, я хочу именно чтобы сравнивались свежие данные (полученные в текущем такте) с константой. Я жду когда в старших трех битах регистра появится 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба always@(posedge CLK) begin CRC = CRC >> 1; CRC[7]=DATA_IN_KEEP[31-cnt_bit_crc]; CRC = CRC ^ CRC_MASK; end Про блокирующие и неблокирующие читали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Про блокирующие и неблокирующие читали? Читал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Читал И почему применяете блокирующие под "always@(posedge CLK)" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Приветствую! С точки зрения логики работы обе схемы будут давать одинаковый результат. Однако описание синхронной схемы для СИНТЕЗА блокирующими присвоениями считается "плохим стилем" так как легко можно ошибиться и наплодить latch вместо триггера; Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Приветствую! С точки зрения логики работы обе схемы будут давать одинаковый результат. Однако описание синхронной схемы для СИНТЕЗА блокирующими присвоениями считается "плохим стилем" так как легко можно ошибиться и наплодить latch вместо триггера; Успехов! Rob. Как раз переделывал под правильный, хороший стиль, хотел убедиться что написал правильно, спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Приветствую! Как раз переделывал под правильный, хороший стиль, хотел убедиться что написал правильно, спасибо! Хороший стиль это когда Вы сами понимаете что написали. Правильный это когда и другие понимают и при этом так же как и Вы :) Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Как раз переделывал под правильный, хороший стиль, хотел убедиться что написал правильно, спасибо! Вообще-то есть вполне определенные правила по написанию и по оформлению. И не "вдохновение", и не "самопал", а годами наработанные приемы создания, оформления и хранения и администрирования.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Подскажите пожалуйста еще, у меня есть такая конструкция, она с блокирующими присваиваниями и она работает, как изменить такую конструкцию на неблокирующие присваивания чтобы все работало? 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. Как правильн реализовать? Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 9 февраля, 2016 Опубликовано 9 февраля, 2016 · Жалоба Решил эту проблему следующим образом - по переднему фронту клока делаю вычисление, а по заднему делаю сбор 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 Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться