Verilog разворот бит в шине

Verilog разворот бит в шине

Verilog — язык описания цифровых схем. На первом уроке познакомимся с базовыми типами источников сигнала используемыми в языке.

Пожалуй было бы не плохо начать наше обсуждение с понятия сигнал ( signal ). Сигналы – это электрические импульсы, которые передаются по проводам ( wire ) между логическими элементами схемы. Провода переносят информацию не производя над ней никаких вычислений. В цифровой схеме сигналы важны для передачи двоичных данных.

Базовый тип источника сигнала в языке Verilog – это провод, wire . Таким образом, если у вас есть арифметическое или логическое выражение, вы можете ассоциировать результат выражения с именованным проводом и позже использовать его в других выражениях. Это немного похоже на переменные, только их (как провода в схеме) нельзя пересоединить на лету, нельзя поменять назначение. Значение провода ( wire ) – это функция того, что присоединено к нему.

Вот пример декларации однобитного провода в “программе” Verilog:

wire a;
Вы можете ему назначить другой сигнал, скажем сигнал “ b ”, вот так:
wire b;
assign a = b;
Или вы можете определить сигнал и сделать назначение ему одновременно в одном выражении:
wire a = b;
У вас могут быть провода передающие несколько бит:
wire [3:0] c; //это четыре провода
Провода передающие несколько бит информации называются “шина”, иногда “вектор”. Назначания к ним делаются так же:
wire [3:0] d;
assign c = d; //“подключение” одной шины к другой
Количество проводов в шине определяется любыми двумя целыми числами разделенными двоеточием внутри квадратных скобок.
wire [11:4] e; //восьмибитная шина
wire [0:255] f; //256-ти битная шина
Из шины можно выбрать некоторые нужные биты и назначить другому проводу:
wire g;
assign g = f[2]; //назначить сигналу “g” второй бит шины “f”
Кроме того, выбираемый из шины бит может определяться переменной:
wire [7:0] h;
wire i = f[h]; //назначить сигналу “i” бит номер “h” из шины “f”
Вы можете выбрать из сигнальной шины некоторый диапазон бит и назначить другой шине с тем же количеством бит:
wire [3:0] j = e[7:4];
Так же, в большинстве диалектов Verilog, вы можете определить массивы сигнальных шин:
wire [7:0] k [0:19]; //массив из двадцати 8-ми битных шин
Еще существует другой тип источника сигнала называемый регистр: reg . Его используют при поведенческом ( behavioral ) описании схемы. Если регистру постоянно присваивается значение комбинаторной (логической) функции, то он ведет себя точно как провод ( wire ). Если же регистру присваивается значение в синхронной логике, например по фронту сигнала тактовой частоты, то ему, в конечном счете, будет соответствовать физический D-триггер или группа D-триггеров. D-триггер – это логический элемент способный запоминать один бит информации. В англоязычных статьях D-триггер называют flipflop .

Регистры описываются так же как и провода:
reg [3:0] m;
reg [0:100] n;
Они могут использоваться так же, как и провода в правой части выражений, как операнды:
wire [1:0] p = m[2:1];
Вы можете определить массив регистров, которые обычно называют “память” ( RAM ):
reg [7:0] q [0:15]; //память из 16 слов, каждое по 8 бит
Еще один тип источника сигнала – это integer . Он похож на регистр reg , но всегда является 32х битным знаковым типом данных. Например, объявим:
integer loop_count;

Verilog позволяет группировать логику в блоки. Каждый блок логики называется “модулем” ( module ). Модули имеют входы и выходы, которые ведут себя как сигналы wire .

При описании модуля сперва перечисляют его порты (входы и выходы):

module my_module_name (port_a, port_b, w, y, z);
А затем описывают направление сигналов:

input port_a;
output [6:0] port_b;
input [0:4] w;
inout y; //двунаправленный сигнал, обычно используется

//только для внешних контактов микросхем

Позже мы увидим, что выход модуля может быть сразу декларирован как регистр reg , а не как провод wire :
output [3:0] z;
reg [3:0] z;
Еще проще можно сразу в описании модуля указать тип и направление сигналов:
module my_module
(
input wire port_a,
output wire [6:0]port_b,
input wire [0:4]w,
inout wire y,
output reg [3:0]z
);
Теперь можно использовать входные сигналы, как провода wire :
wire r = w[1];
Теперь можно делать постоянные назначения выходам, как функции от входов:
assign port_b = h[6:0];
В конце описания логики каждого модуля пишем слово endmodule .
module my_module_name ( input wire a, input wire b, output wire c);
assign c = a & b;
endmodule
Последний тип источника сигнала, о котором мы поговорим на этом уроке – это постоянные сигналы или просто числа:
wire [12:0] s = 12; //32-х битное десятичное число, которое будет “обрезано” до 13 бит
wire [12:0] z = 13’d12; //13-ти битное десятичное число
wire [3:0] t = 4’b0101; //4-х битное двоичное число
wire [3:0] q = 8’hA5; //8-ми битное шестнадцатеричное число A5
wire [63:0] u = 64’hdeadbeefcafebabe; //64-х битное шестнадцатеричное число
Если точно не определить размер числа, то оно принимается по умолчанию 32-х разрядным. Это может быть проблемой при присвоении сигналам с большей разрядностью.

Видео:System verilog constraint question sol 2, randomize 16 bit var,consecutive 2 bits are 1, rest 0Скачать

System verilog constraint question sol 2, randomize 16 bit var,consecutive 2 bits are 1, rest  0

Читайте также: Сколько стоят зимние шины бриджстоун

Числа – это числа. Они могут использоваться во всяких арифметических и логических выражениях. Например, можно прибавить 1 к вектору “ aa ”:
wire [3:0] aa;
wire [3:0] bb;
assign bb = aa + 1;
На следующих уроках будет рассказано про некоторые арифметические и логические функции.

Введение в Verilog. Пятый урок, Синхронная логика.

Verilog разворот бит в шине

На предыдущих уроках мы уже познакомились с типами источников сигналов, узнали как установить экземпляры разных модулей в свой модуль и как соединить их проводами. Так же мы уже рассмотрели разные арифметические и логические выражения в поведенческом коде. Теперь нам осталось познакомиться с синхронной логикой и триггерами.

Существует несколько видов триггеров. Наиболее важные для практического применения – это D-триггера. Вот графическое изображение D-триггера:

Verilog разворот бит в шине

D-Триггер ( flipflop ) – это специальный логический элемент, способный запоминать. Такой триггер запоминает логическое значение сигнала входа D , когда на втором входе C (обозначен треугольничком) появляется фронт сигнала. Фронт сигнала — это момент, когда входная линия переходит из состояния ноль в единицу. Один такой триггер запоминает один бит информации. Текущее значение записанное в триггер — на его выходе Q . Еще триггер может иметь сигналы ассинхронного сброса clrn или установки prn . По сигналу clrn = 0 триггер переходит в состояние ноль не зависимо от других входных сигналов D или C . Кое-что про триггера можно почитать в Википедии.

Все сложные цифровые схемы используют и комбинаторную логику и триггера. Вот типичный пример некой цифровой схемы:

Verilog разворот бит в шине

Логические функции func1 и func2 что-то вычисляют и по каждому фронту тактовой частоты результат вычисления запоминается в регистрах. Синхронно с каждым импульсом тактовой частоты схема переходит из одного устойчивого состояния в другое. Состояние всей схемы определяется текущими значениями в триггерах. В синхронной логике (в отличии от комбинаторной логики) обратные связи используются очень часто – то есть выход триггера может спокойно подаваться на его вход прямо или через другую логику.

Язык Verilog позволяет легко описать синхронные процессы.

Описание синхронной логики в поведенческом коде Verilog очень похоже на описание комбинаторной логики с одним важным отличием – в списке чувствительности always блока теперь будут не сами сигналы, а фронт тактовой частоты clock . Только в этом случае регистры, которым идет присвоение, будут реализованы в виде D-триггеров ( flipflops ).

Давайте посмотрим простой пример. Вот графическое представление восьмибитного регистра, запоминающего входные данные по фронту тактовой частоты:

Видео:4 Bit Adder in Verilog Using InstantiationСкачать

4 Bit Adder in Verilog Using Instantiation

Verilog разворот бит в шине

Его представление в Verilog может быть такое:

module DFF8 (clock, data, q);
input clock;
input [7:0] data;
output [7:0] q;
reg [7:0] q;
always @( posedge clock) begin
q end
endmodule

Здесь блок always чувствителен к фронту тактовой частоты: posedge clock . Еще, вместо posedge – положительного фронта тактовой частоты можно использовать negedge – отрицательный фронт. При использовании negedge запоминание в регистр происходит по перепаду сигнала clock с «1» в «0». Сам факт запоминания входных данных data в регистре q здесь описан оператором « «. Это так называемое «неблокирующее присвоение».

Читайте также: Шины пирелли летние 215 60 р17 скорпион

Понятно, что на вход in такого регистра может быть подано, например, значение выражения какой нибудь комбинаторной функции, вычисленной в другом always блоке.

В синхронной логике значение входов триггеров важно только в момент запоминания в триггерах, в момент фронта тактовой частоты clock. В этом главное отличие от комбинаторной логики. Комбинаторная логика, описанная always блоками, производит «постоянное» вычисление своей функции по отношению к входным сигналам: как только меняется сигнал на входе, так сразу может меняться и сигнал на выходе.

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

Вот пример реализации синхронного сброса регистра с активным положительным уровнем ( active-high ) :

Verilog разворот бит в шине

Вот так эту схему можно описать на языке Verilog:

module DFFSR (reset, clock, data, q);
input reset;
input clock;
input [7:0] data;
output [7:0] q;

reg [7:0] q;
always @( posedge clock) begin
if (reset) begin
q end else begin
q
end
end

Фактически, здесь при использовании синхронного сброса перед входом запоминающего регистра стоит мультиплексор. Если сигнал сброса reset активен («единица»), то на вход регистра подается ноль. Иначе – загружаются другие полезные данные. Запись в регистр происходит синхронно с фронтом тактовой частоты clock .

Видео:Урок 35 Блоки Операции с битамиСкачать

Урок 35 Блоки Операции с битами

Ассинхронный сброс c активным сигналом единица описывается следующим образом. Вот схема:

Verilog разворот бит в шине

А вот представление на Verilog:

module DFFAR (reset, clock, data, q);
input reset;
input clock;
input [7:0] data;
output [7:0] q;
reg [7:0] q;
always @( posedge clock or posedge reset) begin
if (reset) begin
q end else begin
q end
end

Обратите внимание, что сигнал reset теперь попал в список чувствительности для always блока.

Вообще-то для ассинхронных сбросов желательно всегда придерживаться вот такого стиля описания синхронной логики, как в приведенном выше примере. Сперва пишите » if(reset) » и все присвоения связанные с начальной инициализацией регистров. Потом пишите » else » и всю остальную логику. Дело в том, что синтезатор пытается в нашем коде выделить знакомые ему конструкции. Если написать иначе, хотя и логически правильно, то остается риск, что синтезатор чего-то не поймет и сгенерирует схему иначе, не используя все возможности триггера, не используя его ассинхронный сброс. В результате схема может стать больше (для ее реализации нужно больше логических элементов) и «медленнее» (работает стабильно на меньшей частоте).

Давайте рассмотрим еще один полезный практический пример. Предположим, что нам нужен счетчик по модулю 6, но чтобы исходное значение счетчика можно было бы загружать. Вот код описывающий такой счетчик:

module mod_counter(
input wire reset,
input wire clock,
input wire [3:0]in,
input wire load,
output reg [3:0]cnt
);

always @( posedge clock or posedge reset)
begin
if (reset)
cnt else
begin
if (load)
cnt else
if (cnt+1==MODULE)
cnt else
cnt end
end

endmodule
В этом модуле у нас есть ассинхронный сброс счетчика, синхронная загрузка счетчика по условию load и синхронное увеличение значения счетчика до модуля. Эквивалентная схема такого модуля будет вот такая (нажмите чтобы увеличить):

Verilog разворот бит в шине

Здесь видно два мультиплексора, сумматор, компаратор и собственно регистр.
Оба модуля, и написаный на Verilog и выполненный в виде схемы, работают абсолютно одинаково:

Verilog разворот бит в шине

На диаграмме симуляции видно, что если нет сигнала reset , то по каждому фронту тактовой частоты значение счетчика растет до модуля. Потом счет начинается сначала. Если появляется сигнал загрузки load , то значение счетчика перезагружается новым входным значением.

Видео:Verilog Behavioral Modeling of Four bit Binary Adder on Xilinx | Digital Logic DesignСкачать

Verilog Behavioral Modeling of Four bit Binary Adder on Xilinx | Digital Logic Design

Читайте также: Шины в кургане yokohama

Теперь давайте посмотрим внимательнее на операторы присвоения языка Verilog. В случае синхронной логики присвоение обычно обозначает запись в регистр или триггер синхронно с фронтом тактовой частоты. Однако с точки зрения языка программирования Verilog мы опять подошли к этим двум понятиям: блокирующее и неблокирующее присвоение.

Блокирующее присвоение (с помощью оператора «=») называется так потому, что вычисления производятся строго в порядке, описанном в always блоке. Второе выражение вычисляется только после первого и результат второго выражения может зависить от результата первого.

Неблокирующее присвоение в always блоке (используется оператор » always блоке выполняются не последовательно, а одновременно. И присвоение, тоже произойдет одновременно.

Обычно принято применять блокирующие присвоения при описании комбинаторной логики, а неблокирующие для синхронной логики. Так проще всего представлять себе описываемые алгоритмы (хотя оба типа присвоений могут соседствовать в одном always блоке).

Давайте попробуем поэкспериментировать с блокирующими и неблокирующими присвоениями.
Рассмотрим вот такой пример:

module test(
input wire clock,
input wire [3:0]in,
output reg [3:0]x,
output reg [3:0]y,
output reg [3:0]z );

always @( posedge clock)
begin
x end

Из этого кода синтезатор сделает три физических четырехбитных регистра на триггерах и три сумматора. Эквивалентная схема к такому коду будет вот такая:

Verilog разворот бит в шине

Попробуем просимулировать такой модуль. Предположим исходное состояние триггеров неизвестно (значение X). Пусть, например, входное значение шины in равно 3 и модуль тактируется частотой clock .

Verilog разворот бит в шине

На этом рисунке виден результат симуляции.

Вместе с первым фронтом тактовой частоты clock в регистр x будет записано значение суммы in+1 и оно равно четырем. В этот же момент времени в регистр y должна быть записана сумма x+1 , но симулятор еще не знает текущего значения регистра x . Оно еще не определено. Только второй импульс тактовой частоты запишет в регистр y число 5. Присвоение в регистр z так же происходит синхронно с остальными присвоениями. Но только на третьем такте в регистр z запишется число 6, так как только к этому времени симулятору будет известно значение регистра y . В реальной схеме все работает точно так же. Сигнал на выходе z получается задержанным на 2 такта относительно выхода x .

Видео:6. Программирование ПЛИС: цифровые часы на AHDL, VHDL, VerilogСкачать

6. Программирование ПЛИС: цифровые часы на AHDL, VHDL, Verilog

Попробуем теперь изменить наш модуль. Сейчас мы будем использовать блокирующее присвоение:

module test(
input wire clock,
input wire [3:0]in,
output reg [3:0]x,
output reg [3:0]y,
output reg [3:0]z );

always @( posedge clock)
begin
x = in + 1;
y = x + 1;
z = y + 1;
end

Поведение модуля стало принципиально другим! И это неудивительно, ведь этот код описывает теперь уже другую цифровую схему. Регистры теперь соединены не последовательно один за другим, а как бы параллельно, только загружаемые значения разные:

Verilog разворот бит в шине

Verilog разворот бит в шине

Поскольку мы использовали блокирующие присвоения, то это обозначает, что следующее выражение учитывает результат предыдущего (в порядке написания). Фактически в этом случае наша запись подразумевает следущее:

always @( posedge clock)
begin
x = in + 1;
y = in + 2; // y = x+1 = (in+1)+1
z = in + 3; // z = y+1 = ((in+1)+1)+1
end

Мы так же получим три регистра, только в них будет записаны суммы одновременно уже в первом такте.

Давайте теперь попробуем изменить порядок строк наших выражений в always блоке. Неблокирующие присвоения даже не будем пробовать — результат не изменится. А вот с блокирующими присвоениями не так. Тут важна очередность выражений. Поменяем местами две строки, вот так:

begin
x = in + 1;
z = y + 1;
y = x + 1;
end

Получаем вот такой результат:

Verilog разворот бит в шине

В регистр z будет помещено результирующая сумма на такт позже, чем в регистр y . И это правильно! По первому фронту тактовой частоты может быть вычисленно точно только x и y , но нельзя вычислить z . К моменту вычисления z по первому фронту значение y неопределено. А вот на втором фронте сигнала clock уже z будет посчитан.

Видео:System verilog constraint interview question so 1, randomize 16 bit var, consecutive 2 bits 1 rest 0Скачать

System verilog constraint interview question so 1, randomize 16 bit var, consecutive 2 bits 1 rest 0

Вот так. Блокирующие и неблокирующие присвоения действуют по разному.

Сейчас можно подвести некоторый итог: неблокирующие присвоения «

  • Свежие записи
    • Нужно ли менять пружины при замене амортизаторов
    • Скрипят амортизаторы на машине что делать
    • Из чего состоит стойка амортизатора передняя
    • Чем стянуть пружину амортизатора без стяжек
    • Для чего нужны амортизаторы в автомобиле


    🎦 Видео

    Счетчики в языке VerilogСкачать

    Счетчики в языке Verilog

    КАК РАБОТАТЬ С БИТАМИ | ОСНОВЫ ПРОГРАММИРОВАНИЯСкачать

    КАК РАБОТАТЬ С БИТАМИ | ОСНОВЫ ПРОГРАММИРОВАНИЯ

    Бит | Байт | Системы счисления | Микроконтроллеры с нуля #3Скачать

    Бит | Байт | Системы счисления | Микроконтроллеры с нуля #3

    VHDL Code for 4 Bit Adder using 1 bit full adder componentСкачать

    VHDL Code for 4 Bit Adder using 1 bit full adder component

    Verilog. Интерфейс UARTСкачать

    Verilog. Интерфейс UART

    Verilog. Интерфейс VGAСкачать

    Verilog. Интерфейс VGA

    Мастерская Pit_Stop:как пользовать ударно-поворотную отверткуСкачать

    Мастерская Pit_Stop:как пользовать ударно-поворотную отвертку

    Verilog - Язык Проектирования Схем §0Скачать

    Verilog - Язык Проектирования Схем §0

    Опасное вождение№3: Несоблюдение бокового интервала ("грядки", "междурядье")Скачать

    Опасное вождение№3: Несоблюдение бокового интервала ("грядки", "междурядье")

    Соединение элементов на языке VerilogСкачать

    Соединение элементов на языке Verilog

    Verilog. Генерация псевдослучайных чиселСкачать

    Verilog. Генерация псевдослучайных чисел

    Битовые сдвигиСкачать

    Битовые сдвиги

    Задание которое ставит в ступор!?Выбрать место для разворота на ул. Мальцева?Все варианты выполненияСкачать

    Задание которое ставит в ступор!?Выбрать место для разворота на ул. Мальцева?Все варианты выполнения
Поделиться или сохранить к себе:
Технарь знаток