-
Kipling
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 8
-
Спасибо получено: 0
-
-
|
Приветствую всех!!!
У многих в процессе изучения языка Verilog возникают вопросы и поэтому я создал эту тему.
Так вот, если вам что-либо непонятно в статье «Введение в Verilog – язык описания цифровых схем. Николай К.», нужно всего лишь процитировать непонятный для вас фрагмент и задать вопрос.
Я думаю, это тема будет очень полезной не только для меня, но и другим посетителям форума.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Kipling.
|
-
Kipling
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 8
-
Спасибо получено: 0
-
-
|
module simple_shift (
operandA, operandB,
out_shl, out_shr, out_sar);
// два входных 8-ми битных операнда
input [7:0] operandA, operandB;
// Выходы для операций сдвига
output [15:0] out_shl;
output [7:0] out_shr;
output [7:0] out_sar;
//логический сдвиг влево
assign out_shl = operandA << operandB;
/* пример: на сколько сдвигать определяется 3-мя битами второго
операнда */
assign out_shr = operandA >> operandB[2:0];
//арифметический сдвиг вправо (сохранение знака числа)
assign out_sar = operandA >>> operandB[2:0];
endmodule
.
.
Ответьте пожалуйста, чем команда сдвиг в право >> , отличается от команды сдвига в право с сохранение знака числа >>> ??? И почему когда помпилируешь данный модуль, в редакторе «Netlist viewers» оба элемента отображаются и называются одинакого???
Заранее большое спасибо.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Kipling.
|
-
digitalinvitro
-
-
Не в сети
-
Давно я тут
-
-
Сообщений: 100
-
Спасибо получено: 8
-
-
-
|
//арифметический сдвиг вправо (сохранение знака числа)
assign out_sar = operandA >>> operandB[2:0];
Арифметический сдвиг вправо сохраняет бит находящийся в старшем разряде числа, можно записать его так
A = {A[High],A[High:1] }
где High самый старший разряд
на Си это выглядело бы так
Sign = A&(1<<HIGH);
A = Sign|(A >> 1);
можно посмотреть команду ASR например AVR:
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Kipling
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 8
-
Спасибо получено: 0
-
-
|
Урок 4. Процедурные блоки.
........
module find_high_bit(input wire [7:0]in_data, output reg
[2:0]high_bit, output reg valid);
integer i;
always @(in_data)
begin
//определим, есть ли в шине единицы
valid = |in_data;
//присвоим хоть что нибудь
high_bit = 0;
for(i=0; i<8; i=i+1)
begin
if(in_data)
begin
// запомним номер бита с единицей в шине
high_bit = i;
end
end
end
endmodule
Никак не могу понять, как работает этот модуль???
always @(in_data) // после того как на входе in_data меняется значение, начинает выполняться это выражение
valid = |in_data; // определяет есть или в шине единица
А дальше совсем запутался, как перебирая входя в шине if(in_data ) можно найти что-то????
И зачем присваивать high_bit нуль???
Объясните пожалуйста.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Kipling.
|
-
digitalinvitro
-
-
Не в сети
-
Давно я тут
-
-
Сообщений: 100
-
Спасибо получено: 8
-
-
-
|
Kipling пишет: Никак не могу понять, как работает этот модуль???
always @(in_data) // после того как на входе in_data меняется значение, начинает выполняться это выражение
valid = |in_data; // определяет есть или в шине единица
А дальше совсем запутался, как перебирая входя в шине if(in_data) можно найти что-то????
И зачем присваивать high_bit нуль???
Объясните пожалуйста.
На самом деле конструкция for в HDL не синтезируется напрямую. По сути это размножение внутрициклового выражения - если можно так выразиться unroll. Это будет преобразовано в цепочку мультиплексоров на входы которых подан номер соответствующего провода в шине (вход А мультиплексора) а проводом этой шины будет произведен выбор A или B, где В это такой же каскадируемый мультиплексор с номером провода на А и следующим мультиплексором на B. Таких мультиплексоров будет по количеству проводников в шине. Если на всех проводниках будет сигнал 0 то последний в каскаде мультиплексор должен нам дать значение 0, вот оно то и присваивается до входа в цикл. Кроме того мультиплексоры выстраиваются в нужный порядок соответствующий направлению перебора
что бы исключить ситуацию когда единичек в шине будет более одной, в этом случае high_bit будет равняться номеру более старшего бита. Насколько я понял код ситуацию с high_bit=0 нужно дополнительно подтверждать сигналом valid так как можно этот ноль получить двумя способами как дефолтный (т.е. в шине не одного проводника равного 1, и как законный когда нулевой проводник активный (=1). Про синтезируемость for хорошо пишет Николая в своем учебнике Verilog
marsohod.org/11-blog/84-veriloglesson4
.
Давайте теперь рассмотрим циклы. Тут нужно сделать замечание, что циклы в Verilog имеют несколько иной смысл, не такой, как в языках C или Pascal. На языке C цикл обозначает, что некоторое действие должно быть выполнено последовательно раз за разом. Чем больше итераций в цикле, тем дольше он будет исполняться процессором. На языке Verilog цикл скорее описывает сколько экземпляров логических функций должно быть реализовано аппаратно. Чтобы синтез прошел успешно, циклы должны иметь заданное фиксированное число итераций – иначе синтезатор просто не сможет ничего сделать.
Честно говоря такого рода штуки как мне кажется лучше решаются с помощью дешифраторов построенных по принципу LOOK UP TABLE входной сигнал АДРЕС выходной сигнал ДАННЫЕ. Тогда на входе коды от 0 до 2^кол-во шин а на выходе данные соответствующие номеру единички.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
sl_64
-
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 21
-
Спасибо получено: 0
-
-
|
модуль с переменным коэффициентом деления
module div_f_in(clk, k,rst, out);// k- коэффициент деления
input clk,rst;
input [15:0] k;
output out;
reg [15:0] count;
reg out;
always @(posedge clk)
begin
if((rst == 1) || (count == 0))
begin
count <= k;
out <= ~rst;
//
end
else
begin
if (count==0) begin
out <=clk;
end
count <= count - 1'b1;
out <= 1'b0;
end
end
endmodule
это первое что я написал на верилоге . Так как делить но 0 нельзя минимальный коэффициент деления = 2
Не могу ни как заставить этот модуль при входном коэффициенте деления =0 передать входную частоту без деления с входа clk на out , или этого сделать не получится :(
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
digitalinvitro
-
-
Не в сети
-
Давно я тут
-
-
Сообщений: 100
-
Спасибо получено: 8
-
-
-
|
Тут у нас уже и с Юрием и с Николаем была дискуссия что на пути клока ничего не должно быть, а Вам придется как минимум один мультиплексор туда засунуть. А так как Вы хотите по фронту клока (clk) передавать его уже поздно, фактически клок режется вдвое первым же триггером (out).
assign out = (k==0)? clk : out2;
где out2 - это ваш out который вы используете внутри always
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от digitalinvitro. Причина: исправил сигнал out1 на clk
|
-
umarsohod
-
-
Не в сети
-
Администрация форума
-
-
Сообщений: 816
-
Спасибо получено: 168
-
-
|
Ваш модуль при k=0 будет давать максимальнуй коэффициент деления - clk/65536,
а при к=1 - минимальный - clk/2. А преобразовывать clk в clk какой смысл?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
sl_64
-
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 21
-
Спасибо получено: 0
-
-
|
digitalinvitro пишет: Вам придется как минимум один мультиплексор туда засунуть.
использую такую связку
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от sl_64.
|
-
digitalinvitro
-
-
Не в сети
-
Давно я тут
-
-
Сообщений: 100
-
Спасибо получено: 8
-
-
-
|
Ну в общем то да но вот вопрос куда этот клок потом пойдет и если вдруг этот клок на какомто блоке встретиться с исходным clk, что будете делать? От Квартуса впрочем вы в любом случае схватитите предупреждение, может только если попробовать выход с вашего модуля определить в Global Clock?
вопрос: у вас k был 16-битным k[15:0], а теперь появился еще один проводник d[16] или я что то неправильно понял?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.193 секунд