Петля для линий и для положения линий - PullRequest
0 голосов
/ 27 апреля 2019

Я хочу иметь цикл, который запускает все строки моего кода, а также выполняет каждую позицию всех строк.Моя проблема заключается в выборе строки для запуска цикла, и я хочу иметь простой способ сделать это без необходимости записывать каждую строку по одной, потому что в конечном коде будет сканироваться 66 строк.

Надеюсь, вы мне поможете.

У объекта этого кода будет 66 строк, но я сейчас просто проверяю эти 10 строк:

library ieee;  
use ieee.std_logic_1164.all;  
use ieee.numeric_std.all;  

 entity lshift is  
  port( RED_Buffer1 : in std_logic_vector(6 downto 0);
    RED_Buffer2 : in std_logic_vector(6 downto 0);
    RED_Buffer3 : in std_logic_vector(6 downto 0);
    RED_Buffer4 : in std_logic_vector(6 downto 0);
    RED_Buffer5 : in std_logic_vector(6 downto 0);
    IR_Buffer1 : in std_logic_vector(6 downto 0);
    IR_Buffer2 : in std_logic_vector(6 downto 0);
    IR_Buffer3 : in std_logic_vector(6 downto 0);
    IR_Buffer4 : in std_logic_vector(6 downto 0);
    IR_Buffer5 : in std_logic_vector(6 downto 0);

    output : out bit_vector(1 downto 0)); 
 end lshift;

Что я сделалпока, но безуспешно:

АРХИТЕКТУРА main OF lshift IS SIGNAL состояние1: логическое значение;значение сигнала: std_ulogic;

BEGIN

PROCESS(IR_Buffer5)
    BEGIN
        FOR I IN 1 TO 5 LOOP
            FOR J IN 1 TO 5 LOOP
                CONSTANT linha_cond : string(1 to 12) := string(("RED_Buffer") && I);
                IF (linha_cond(J) = '1') THEN
                    output <= "01";
                END IF;
            END LOOP;
        END LOOP;
END PROCESS;

END main;

1 Ответ

0 голосов
/ 28 апреля 2019

Цель этого ответа - продемонстрировать индексацию значений подэлементов от RED_Buffer1 до RED_Buffer5. Без цели раскрытия кода это может легко оказаться вопросом XY Problem .

Хотя можно организовать от RED_Buffer1 до RED_Buffer5 в значение, которое можно проиндексировать, как показано ниже, существуют и другие проблемы.

library ieee;  
use ieee.std_logic_1164.all;  

entity lshift is  
    port (
        red_buffer1:    in  std_logic_vector (6 downto 0);
        red_buffer2:    in  std_logic_vector (6 downto 0);
        red_buffer3:    in  std_logic_vector (6 downto 0);
        red_buffer4:    in  std_logic_vector (6 downto 0);
        red_buffer5:    in  std_logic_vector (6 downto 0);
        ir_buffer1:     in  std_logic_vector (6 downto 0);
        ir_buffer2:     in  std_logic_vector (6 downto 0);
        ir_buffer3:     in  std_logic_vector (6 downto 0);
        ir_buffer4:     in  std_logic_vector (6 downto 0);
        ir_buffer5:     in  std_logic_vector (6 downto 0);
        output:         out bit_vector (1 downto 0)
    ); 
 end entity lshift;

architecture indexed_array of lshift is 
    signal condition1:  boolean;
    signal valor:       std_ulogic;
    type lbuffer is array (1 to 5) of std_logic_vector (6 downto 0);
    signal red_buffer:  lbuffer;
begin
    red_buffer <= (red_buffer1, red_buffer2, red_buffer3, red_buffer4,
                   red_buffer5);       
    process (red_buffer)
    begin
        for i in 1 to 5 loop
            for j in red_buffer'range loop
                if red_buffer(i)(j) = '1' then
                    output <= "01";
                end if;
            end loop;
        end loop;
    end process;
end architecture indexed_array;

Как здесь осуществляется индексация

Объявляется составной тип (lbuffer), имеющий необходимое количество элементов с требуемым подтипом элемента. Это возможно, потому что объявления для портов RED_Buffer1 - RED_Buffer5 имеют общий указатель подтипа. Присваивание элементам объекта типа lbuffer будет совместимым, если совпадают элементы между целевым и правосторонним выражением.

Объявлен сигнал red_buffer с отметкой типа lbuffer.

Было выполнено параллельное назначение сигналу в операторе одновременного назначения сигналов в части оператора архитектуры из агрегата. Ассоциация в совокупности является позиционной. Можно легко использовать именованную ассоциацию

    -- red_buffer <= (red_buffer1, red_buffer2, red_buffer3, red_buffer4,
    --                red_buffer5);
   red_buffer <= (1 => red_buffer1, 2 => red_buffer2, 3 => red_buffer3,
                  4 => red_buffer4, 5 => red_buffer5);

Тип агрегата взят из контекста, здесь оператор присваивания, где red_buffer имеет подтип lbuffer.

Выбранный элемент композиции red_buffer выбирается по имени индекса (red_buffer(i)). Подэлемент red_buffer(i) выбирается с помощью индексированного имени, где имя red_buffer(i), где 'i is a constant using 'j из внутреннего цикла - red_buffer(i)(j).

Обратите внимание, что диапазон параметра j не совпадает с индексным диапазоном подтипа элемента lbuffer, здесь идентичного подтипу от RED_Buffer1 до RED_Buffer5. Это означает еще одну потенциальную семантическую проблему с исходным кодом, цель которого здесь не ясна. Единственная подсказка, присутствующая в оригинальном коде, взята из linha_cond, где linha означает строку на португальском или каталонском языке, указывающую, что j используется для индексации внутри 'строки'.

Исходный код не работает по двум причинам

Во-первых, объект не может быть объявлен встроенным в VHDL. Параметр цикла for динамически разрабатывается из неявного объявления, параметр цикла виден только в последовательности операторов оператора цикла. Синтаксис не допускает дополнительных объявлений объектов.

Во-вторых, имя для объявления объекта передается в списке идентификаторов, состоящем из одного или нескольких идентификаторов, которые являются лексическими элементами (лексемами), которыми нельзя манипулировать программно.

Другие семантические проблемы с кодом вопроса

Назначение output без времени не представляется полезным.

Оператор процесса - это независимо выполняемый параллельный оператор, в котором оператор цикла, содержащий присвоение тому же сигналу output, перезапишет прогнозируемый выходной сигнал для элементов output без какого-либо промежуточного промежутка времени. ,

Существует только одна запись в очереди прогнозируемого выходного сигнала для любого конкретного времени моделирования. Цикл моделирования состоит из обновлений сигналов с последующим возобновлением и последующей приостановкой любых процессов, чувствительных к обновлениям сигналов. Цель состоит в том, чтобы эмулировать параллелизм в аппаратных средствах при описании поведения с помощью последовательных операторов.

Здесь это будет означать, что output будет обновлено до значения "01", если какое-либо из условий оператора if в развернутых циклах оценивается как ИСТИНА. Это, вероятно, не предполагаемое поведение (без дополнительной информации от первоначального автора).

Также обратите внимание, что output не присваивается другое значение и нет значения по умолчанию или другого назначенного значения. Для синтеза это будет представлять задержку задержки на output до тех пор, пока не будет найдено «1».

В обоих случаях это относится к неявной защелке для output.

Эта проблема с примером кода не может быть решена без знания того, как он должен работать, и единственная подсказка, которая была показана здесь на Stackoverflow, на данный момент - это вопрос, удаленный пользователем , требующий 10K + репутация для доступа (другие увидят сообщение Page not found, см. редакция 1 ).

Кроме того, понятия, передаваемые из языков программирования или языков сценариев, обычно не переносятся на языки описания аппаратного обеспечения, которые обычно являются формальными обозначениями, определяемыми самостоятельно (здесь в IEEE Std 1076, Справочное руководство по языку VHDL), требующими внедрения или настойчивых усилий для изучения. HDL обычно описывают аппаратное и структурное поведение, а не программную эквивалентность.

...