-
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) ругается, мол не могу такое сранивать. Или массивы (одинаковые по разрядности и количеству ячеек) целиком в принципе нельзя сравнивать?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
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
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
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
-
Автор темы
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 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 тоже срабатвает, типа как совпадение.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
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 за быстрые и полезные советы! ))
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
MacSys
-
-
Не в сети
-
Новый участник
-
-
Сообщений: 1
-
Спасибо получено: 0
-
-
|
Прошу прощения, у меня появилась схожая ситуация.
Есть 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.
|
Время создания страницы: 0.131 секунд