Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Сравнение массивов в Verilog

Сравнение массивов в Verilog 8 года 3 мес. назад #6075

  • fender_p
  • fender_p аватар Автор темы
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 26
  • Спасибо получено: 0
Доброго всем дня!

Недавно взялся за изучение Verilog. Обычно по пустякам стараюсь не беспокоить форумчан, но все таки зашел в тупик. А именно.

Можно ли сравнивать массивы целиком? То есть есть например reg [0:5] array_a [0:3] и reg [0:5] array_b [0:3].

Один из них заранее инициализирован, к примеру числами 5, 8, 4, 16, а второй с каждым тактом меняет содержимое своих ячеек. Не важно как, важно, что содержимое все время разное. И вот когда в один момент их содержимое становится идентичным, то есть в обоих по порядку идут числа 5, 8, 4, 16, нужно, что бы некая переменная приняла значение 1. то есть типа такого

initial begin

array_b[0]= 6'd5;
array_b[1]= 6'd8;
array_b[2]= 6'd4;
array_b[3]= 6'd16;
end

always @(posedge clk)

begin

array_a[0] <= data_in;

for
(i=1; i<=3; i=i+1)

array_a <= array_a[i-1];


if
(array_a == array_b)

j = 1;

else

j = 0;
end

То есть как сравнить эти два массива целиком? На запись (array_a == array_b) ругается, мол не могу такое сранивать. Или массивы (одинаковые по разрядности и количеству ячеек) целиком в принципе нельзя сравнивать?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от fender_p.

Сравнение массивов в Verilog 8 года 3 мес. назад #6079

  • Falcon
  • Falcon аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 8
А индексы вы куда дели?

Где то так было бы правильней.
always @(posedge clk)
begin
if (count == 2'd3) count <= 0;
else count <= count + 1'd1;
if (array_a [count] == array_b[count]) бла бла бла
end
Спасибо сказали: fender_p

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Сравнение массивов в Verilog 8 года 3 мес. назад #6081

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

fender_p пишет: Можно ли сравнивать массивы целиком? То есть есть например reg [0:5] array_a [0:3] и reg [0:5] array_b [0:3].

Можно в SystemVerilog для упакованных массивов, в тч с разным числом ячеек/разрядности, и даже разной размерности.
Именно поэтому советую в настройках Квартуса указать поддержку SystemVerilog, и использовать упакованные массивы, например: reg [3:0][5:0] array_a, array_b. Надо только внимательно разобраться с порядком следования слов и бит в таком массиве, сначала непривычно, зато потом удобно.
Спасибо сказали: fender_p

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Сравнение массивов в Verilog 8 года 3 мес. назад #6082

  • fender_p
  • fender_p аватар Автор темы
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 26
  • Спасибо получено: 0
Получается та же история, как и с

for (count=0; count<=3; count=count+1)

if array_a[count]==array_b[count] и т. д.

Вроде как срабатывет, но так же срабатывает, если число 16 оказывается в array_b[3]; при любых других значениях остальных ячеек массива. то есть при 0, 0, 0, 16 тоже срабатвает, типа как совпадение.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Сравнение массивов в Verilog 8 года 3 мес. назад #6083

  • fender_p
  • fender_p аватар Автор темы
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 26
  • Спасибо получено: 0
Помогло включение поддержки SystemVerilog. Теперь компилятор понимает, что значит array_a[0:3] == array_b[0:3]

Теперь прокатывает просто

if (array_a[0:3] == array_b[0:3])
y=1 и т.д.

Вопрос решен! Спасибо Falcon и Leka за быстрые и полезные советы! ))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от fender_p.

Сравнение массивов в Verilog 4 года 4 мес. назад #7755

Прошу прощения, у меня появилась схожая ситуация.
Есть 3 условия if, которые выполняются практически последовательно, и в каждой выполняется операция вывода данных на шину res[9:0]
Ситуация следующего характера: в первом условии в res заносится константа 10'b1101001010 через определенное время, выполняется второе условие, в котором в шину res нужно занести данные выполнив логическое "И" с константой 10'b1101001010 и регистром в котором хранится 10битная комбинация например 10'b1101001100, res = (10'b1101001010 & 10'b1101001010);
И в третьем условии в шину res уже загружается 10'b1101001010

if((work == 1) && (first == 1) && (first_gear == 1))
begin
res = 10'b1101001010;
B = res;
if(timer == 20)
begin
res = (B[9:0] & gear_prev[9:0]);
first_gear = 0;
sample = 1;
clock = 0;
timer = 0;
end
end

Так вот ситуация такого характера, не работает побитовое "И" с двумя константами, что бы исключить в res не совпадающие значения.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от MacSys.
  • Страница:
  • 1
Время создания страницы: 0.131 секунд
Работает на Kunena форум