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

Реализация сдвигового регистра с асинхронным сбросом и параллельной загрузкой

Есть код сдвигового регистра с асинхронным сбросом и параллельной загрузкой, не могу понять зачем нужны сигналы InS, InP, SHFT, какова их функция?))) можете пожалуйста поподробнее объяснить как они работают в коде

 

изображение.png

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


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

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

Далее смотрим логику case. Если LD == 1 (активно) и Clear == 1 (неактивно), то независимо от значения SHFT значение InP подается на выход D за один такт. А если LD == 0 (неактивно) и SHFT == 1 (активно), то InS подается в D со сдвигом вправо, то есть каждый такт значение InS продвигается в D на один такт вправо.

Правда синтаксис подобного сдвигового регистра у меня вызывает сомнения. Точно не знаю, как будет синтезироваться подобная конструкция, есть даже подозрение, что Vivado выдаст ошибку multidriven net. Я бы не стал ставить регистр D и в блокирующее, и в неблокирующее присваивание, а реализовал бы всю логику в рамках одного always @ (negedge CLK).

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


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

1 минуту назад, attaboy сказал:

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

Далее смотрим логику case. Если LD == 1 (активно) и Clear == 1 (неактивно), то независимо от значения SHFT значение InP подается на выход D за один такт. А если LD == 0 (неактивно) и SHFT == 1 (активно), то InS подается в D со сдвигом вправо, то есть каждый такт значение InS продвигается в D на один такт вправо.

Правда синтаксис подобного сдвигового регистра у меня вызывает сомнения. Точно не знаю, как будет синтезироваться подобная конструкция, есть даже подозрение, что Vivado выдаст ошибку multidriven net. Я бы не стал ставить регистр D и в блокирующее, и в неблокирующее присваивание, а реализовал бы всю логику в рамках одного alwayw @ (negedge CLK).

ну я проверял этот код на EDA Playground, запускается)))) а вообще сами сигналы InP InS SHFT что означают??? в этом не могу разобраться))) LD - это загрузка как я понял

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


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

Код и фактическое наличие такого флопа - две разные вещию Скорее всего это описание некого кастомного компонента.

Данный RTL реализует последовательную загрузку через serial порт InS и сдвигает по одному биту при активном сигнале сдвига (SHIFT).
Если же подать единичное значение на сигнал загрузки (load - LD)  произведётся запись из параллельного порта InP во все соответствующие флопы.

Хотя куку было упомянуто - описание достаточно корявое

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


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

Just now, Bovee said:

ну я проверял этот код на EDA Playground, запускается)))) а вообще сами сигналы InP InS SHFT что означают??? в этом не могу разобраться))) LD - это загрузка как я понял

LD - это Load, имеется в виду загрузка за один такт. SHFT - это shift, сдвиг побитно. Ну и соответственно источники данных. Для LD - это InP, а для SHFT - InS.

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


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

Только что, attaboy сказал:

LD - это Load, имеется в виду загрузка за один такт. SHFT - это shift, сдвиг побитно. Ну и соответственно источники данных. Для LD - это InP, а для SHFT - InS.

понял, спасибо большое!!!!!

 

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


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

Это где такие горбатые примеры дают для изучения? Запись в сигнал из разных блоков! Асинхронный сброс прекрасно описывается в одном блоке с остальной логикой:


always @(negedge clk, negedge Clear) begin
    if(!Clear) begin
        D <= 0;
    end
    else begin
        if(LD) begin
            D <= InP;
        end
        else begin
            if(SHFT) begin
                D <= {InS, D[3:1]};
            end
        end
    end
end

К тому же присваивания в 'edge' блоках должны быть неблокирующими.

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


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

извините, можно еще вопрос?)) почему во входных сигналах мы записываем и сигнал LD, и его источник данных InP, такая же ситуация для сигнала SHFT и его источника данных InS))) почему происходит именно такая запись? и почему используется активный 0 в условии асинхронного сброса???))))

 

8 часов назад, dxp сказал:

Это где такие горбатые примеры дают для изучения? Запись в сигнал из разных блоков! Асинхронный сброс прекрасно описывается в одном блоке с остальной логикой:



always @(negedge clk, negedge Clear) begin
    if(!Clear) begin
        D <= 0;
    end
    else begin
        if(LD) begin
            D <= InP;
        end
        else begin
            if(SHFT) begin
                D <= {InS, D[3:1]};
            end
        end
    end
end

К тому же присваивания в 'edge' блоках должны быть неблокирующими.

а тут получается реализован и асинхронный сброс и параллельная загрузка?

Изменено пользователем Bovee
дополнение

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


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

8 часов назад, dxp сказал:

Это где такие горбатые примеры дают для изучения? Запись в сигнал из разных блоков! Асинхронный сброс прекрасно описывается в одном блоке с остальной логикой:



always @(negedge clk, negedge Clear) begin
    if(!Clear) begin
        D <= 0;
    end
    else begin
        if(LD) begin
            D <= InP;
        end
        else begin
            if(SHFT) begin
                D <= {InS, D[3:1]};
            end
        end
    end
end

К тому же присваивания в 'edge' блоках должны быть неблокирующими.

а можете кратко описать принцип работы кода пожалуйста!!!!)))))

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


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

44 минуты назад, Bovee сказал:

почему во входных сигналах мы записываем и сигнал LD, и его источник данных InP, такая же ситуация для сигнала SHFT и его источника данных InS))) почему происходит именно такая запись?

В смысле? А как иначе? Это же просто входные сигналы, они все одновременно присутствуют.

44 минуты назад, Bovee сказал:

и почему используется активный 0 в условии асинхронного сброса???

Это я уж не знаю, почему так выбрали - так в вашем примере. Не нравится активный ноль, сделайте активную единицу, при этом negedge Clear поменяется на posedge Clear и if(!Clear) на if(Clear).

 

44 минуты назад, Bovee сказал:

а тут получается реализован и асинхронный сброс и параллельная загрузка?

А в чём сомнения? Вы на код посмотрите и всё поймёте, он же тривиальный. Промоделируйте в голове, что будет происходить при изменениях входных сигналов.

7 минут назад, Bovee сказал:

а можете кратко описать принцип работы кода пожалуйста!!!!

Какое место вам не понятно? always? if...else? Тут же просто описана логика обработки входных сигналов. Она строится из приоритета действий. D принимает значения, формированием которых управляют входные сигналы.

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


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

3 минуты назад, dxp сказал:

В смысле? А как иначе? Это же просто входные сигналы, они все одновременно присутствуют.

Это я уж не знаю, почему так выбрали - так в вашем примере. Не нравится активный 0, сделай те активную единицу, при этом negedge Clear поменяется на posedge Clear и if(!Clear) на if(Clear).

 

А в чём сомнения? Вы на код посмотрите и всё поймёте, он же тривиальный. Промоделируйте в голове, что будет происходить при изменениях входных сигналов.

Какое место вам не понятно? always? if...else? Тут же просто описана логика обработки входных сигналов. Она строится из приоритета действий. D принимает значения, формированием которых управляют входные сигналы.

ну вот допустим строчка:........ то есть при изменении сигнала LD сигналу D идет загрузка???? не совсем в голове укладывается((((( также и про if(SHFT)....

if(SHFT) begin
                D <= {InS, D[3:1]}
if(LD) begin
            D <= InP;

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


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

14 minutes ago, Bovee said:

ну вот допустим строчка:........ то есть при изменении сигнала LD сигналу D идет загрузка???? не совсем в голове укладывается((((( также и про if(SHFT)....


if(SHFT) begin
                D <= {InS, D[3:1]}

if(LD) begin
            D <= InP;

Вы сколько занимаетесь разработкой/изучением схемотехники?

Это обычный enable для флопа (читай регистр).

Если такие элементарные понятия не укладываются в голове, то нужно почитать детальнее соответствующую литературу.

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


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

14 часов назад, Bovee сказал:

ну вот допустим строчка:........ то есть при изменении сигнала LD сигналу D идет загрузка???? не совсем в голове укладывается((((( также и про if(SHFT)....


if(SHFT) begin
                D <= {InS, D[3:1]}

if(LD) begin
            D <= InP;

а else между ними вы не видите? Как конструкция if ... else ... работает, понимаете?

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


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

26.01.2022 в 11:23, Bovee сказал:

извините, можно еще вопрос?)) почему во входных сигналах мы записываем и сигнал LD, и его источник данных InP, такая же ситуация для сигнала SHFT и его источника данных InS))) почему происходит именно такая запись? и почему используется активный 0 в условии асинхронного сброса???))))

 

а тут получается реализован и асинхронный сброс и параллельная загрузка?

 

Рекомендую.


assign Dv = (ld)? inp : (shift)? {ins, D[3:1]} : D;
always @(negedge clk, negedge Clear) begin
    if(!Clear) D = 0;    else D = Dv;
end        
 

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


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

26 минут назад, vt313 сказал:

Рекомендую.


assign Dv = (ld)? inp : (shift)? {ins, D[3:1]} : D;
always @(negedge clk, negedge Clear) begin
    if(!Clear) D = 0;    else D = Dv;
end        
 

Прикольный язык. Так вообще кто-нибудь вообще пишет ? Ничего же не понятно ! Но это на мой VHDL'ный взгляд...

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


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

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

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

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

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

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

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

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

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

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