SRA не может иметь такие операнды? - PullRequest
2 голосов
/ 09 января 2011

Я кодировал алгоритм в VHDL, но у меня есть это сообщение, которое я не понимаю, "у sra / sla не может быть таких операндов в этом контексте".Любая помощь, пожалуйста?

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

entity hsl2rgb is
    generic(
        constant hue : integer := 85;
        constant sat : integer := 127
    );
    port(
        lum    : in  std_logic_vector(7 downto 0);
        ored   : out std_logic_vector(5 downto 0);
        ogreen : out std_logic_vector(5 downto 0);
        oblue  : out std_logic_vector(5 downto 0)
    );
end entity;

architecture behavioral of hsl2rgb is
begin

    process(lum)
        variable v : integer;
        variable m : integer;
        variable sextant : integer;
        variable fract : integer;
        variable vsf : integer;
        variable mid1 : integer;
        variable mid2 : integer;
        variable lumx : integer;
    begin
        lumx := to_integer(unsigned(lum));
        if (lumx < 127) then
            v := (lumx * (256 + sat)) sra 8;
        else
            v := (((lumx + sat) sla 8) - lumx * sat) sla 8;
        end if;

        if (v <= 0) then
            ored <= (others => '0');
            ogreen <= (others => '0');
            oblue <= (others => '0');
        else
            m := (2 * lumx) - v;
            sextant := (hue * 6) sra 8;
            fract := (hue * 6) - (sextant sla 8);
            vsf := (fract * (v - m)) sra 8;
            mid1 := m + vsf;
            mid2 := v - vsf;

            case sextant is
                when 0 =>
                    ored <= conv_std_logic_vector(v, 6);
                    ogreen <= conv_std_logic_vector(mid1, 6);
                    oblue <= conv_std_logic_vector(m, 6);
                when 1 =>
                    ored <= conv_std_logic_vector(mid2, 6);
                    ogreen <= conv_std_logic_vector(v, 6);
                    oblue <= conv_std_logic_vector(m, 6);
                when 2 =>
                    ored <= conv_std_logic_vector(m, 6);
                    ogreen <= conv_std_logic_vector(v, 6);
                    oblue <= conv_std_logic_vector(mid1, 6);
                when 3 =>
                    ored <= conv_std_logic_vector(m, 6);
                    ogreen <= conv_std_logic_vector(mid2, 6);
                    oblue <= conv_std_logic_vector(v, 6);
                when 4 =>
                    ored <= conv_std_logic_vector(mid1, 6);
                    ogreen <= conv_std_logic_vector(m, 6);
                    oblue <= conv_std_logic_vector(v, 6);
                when 5 =>
                    ored <= conv_std_logic_vector(v, 6);
                    ogreen <= conv_std_logic_vector(m, 6);
                    oblue <= conv_std_logic_vector(mid2, 6);
                when others =>
                    ored <= (others => '0');
                    ogreen <= (others => '0');
                    oblue <= (others => '0');
            end case;
        end if;
    end process;
end architecture;

Ответы [ 2 ]

2 голосов
/ 10 января 2011

С целыми числами вам придется использовать операторы * и /.Если они имеют постоянные степени-2 в нужных местах (то есть справа от деления по обе стороны от умножения), синтезатор будет «делать правильные вещи».

Или (как отметил Чарльз) используйте signed или unsigned типы из ieee.numeric_std library.

Кстати, почему вы используете conv_std_logic_vector, когда вы использовали ieee.numeric_std?

ored <= std_logic_vector(to_unsigned(mid1, 6));

должно бытьто, что вам нужно, то вы можете избавиться от неприятной ieee.std_logic_arith библиотеки

(в сторону: если вы (или будущий читатель этого) нацелены на FPGA (и я согласен, что вы не можете, но многолюди в наши дни :) вы можете обнаружить, что есть необходимость в некоторой передаче этой архитектуры, если целевая частота вообще сложна. При кратком синтезе глазного яблока, есть более полудюжины сумматоров, пара реальных множителей инесколько муксов - все в одном такте. В частности, это исключит использование жестких множителей во всех известных мне ПЛИС)

1 голос
/ 10 января 2011

Проблема в том, что вы преобразовали свой ввод-вывод std_logic_vector в целые числа для выполнения математических операций, но операнды sra / srl работают только с одномерными массивами битовых или логических типов. Вам, вероятно, повезет больше, если вы попытаетесь работать со знаковыми или беззнаковыми типами (которые представляют собой битовые векторные представления чисел) вместо того, чтобы смешивать std_logic_vectors (у которых нет присущего числового значения) и целые числа (у которых нет представления битового вектора).

...