Maverick_ 15 16 сентября, 2016 Опубликовано 16 сентября, 2016 · Жалоба Приветствую. Возможно ли динамический диапазон бит передавать в регистр ? проблема вот в этой строке: slash_reg_data <= prepare_bit_vector(reg_data_mem, slash_reg_data, bit_counter_reg); Error (10779): VHDL error at xxx.vhd(172): expression is not constant Error (10658): VHDL Operator error at xxx.vhd(172): failed to evaluate call to operator ""&"" Error (10657): VHDL Subprogram error at xxx.vhd(216): failed to elaborate call to subprogram "prepare_bit_vector" Error (12153): Can't elaborate top-level user hierarchy library IEEE; use IEEE.STD_LOGIC_1164.ALL; --use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use ieee.numeric_std.all; entity xxx is port ( clk : in std_logic; rst : in std_logic; we : in std_logic; din : in std_logic_vector (127 downto 0); data_out : out std_logic_vector (15 downto 0) ); end xxx; architecture rtl of xxx is attribute ramstyle : string; type srl_ram is array (127 downto 0) of std_logic_vector(127 downto 0); -- 26 bit in row signal ram : srl_ram := --(OTHERS => (OTHERS => '0')); ( "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111001", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111111111111111", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000000000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000011111111111111110000000000", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100110000000000000010110000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000000000000101000000000000010", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111101000000000000100000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000000000111000000000000011000", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000000101000000000000", "000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000000000000000000000000001000000000000000011000000", "111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111111111111111111111111100000000100000000000000001" ); --attribute ramstyle of ram : signal is "MLAB,no_rw_check"; constant mem_width_read : integer := 26; signal cnt : std_logic_vector (5 downto 0):= (OTHERS => '0'); signal reg_data_mem : STD_LOGIC_VECTOR(127 DOWNTO 0):= (OTHERS => '0'); signal reg_addr, addr_mem : STD_LOGIC_VECTOR(6 DOWNTO 0):= (OTHERS => '0'); signal bit_counter, bit_counter_reg : integer range 0 to 127 := 0; signal slash_reg_data : STD_LOGIC_VECTOR (mem_width_read*2 DOWNTO 0 ):= (OTHERS => '0'); function prepare_bit_vector (reg_data_mem_v : std_logic_vector(127 downto 0); bit_vector : std_logic_vector(mem_width_read*2 DOWNTO 0 ); bit_quantity : integer range 0 to 16 ) return std_logic_vector is variable result : std_logic_vector (mem_width_read*2 DOWNTO 0 ):= (OTHERS => '0'); begin result(bit_quantity+mem_width_read-1 downto 0) := (reg_data_mem_v ( (mem_width_read - 1) downto 0) & bit_vector( (15+bit_quantity) DOWNTO 16 )); return result; end function; begin process (clk) begin if rising_edge(clk) then if we = '1' then ram(conv_integer(addr_mem)) <= din; end if; reg_data_mem <= ram(conv_integer(addr_mem)); end if; end process; data_out <= slash_reg_data(15 downto 0); process (clk) begin if rising_edge(clk) then if rst = '1' then cnt <= (OTHERS => '0'); else bit_counter_reg <= bit_counter; if ( bit_counter / 16 = 0) then cnt <= cnt + "000001"; addr_mem <= addr_mem + '1'; bit_counter <= mem_width_read + bit_counter - 16; else bit_counter <= bit_counter - 16; end if; if (cnt > 0) then if (bit_counter_reg = 0) then slash_reg_data( (mem_width_read - 1) downto 0) <= reg_data_mem( (mem_width_read - 1) downto 0); elsif (bit_counter_reg <= 16) then slash_reg_data <= prepare_bit_vector(reg_data_mem, slash_reg_data, bit_counter_reg); else slash_reg_data( ((mem_width_read*2)-16) DOWNTO 0 ) <= slash_reg_data( (mem_width_read*2) DOWNTO 16 ); end if; end if; end if; end if; end process; end rtl; Описание моделируется, но не синтезируется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 16 сентября, 2016 Опубликовано 16 сентября, 2016 · Жалоба Думаю, нужно определить функцию смешивания с побитным выбором: function bit_mux2(a,b,s:std_logic_vector)return std_logic_vector is begin return (a and s) or (b and not s); end; И представить необходимую вам функцию в форме композиции сдвигов на переменное число бит и смешиваний с побитным выбором. Маски для смешивания создавать с помощью сдвигов единичных векторов на переменное число бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ADA007 0 19 сентября, 2016 Опубликовано 19 сентября, 2016 · Жалоба Проблема действительно не понятная...т.к. эта же конструкция в ISE синтезится на "УРА". так к примеру, кто ходчет попробовать код: library ieee; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity xxxx is port ( clk : in std_logic; rst : in std_logic; slash : in integer range 0 to 15; din : in std_logic_vector (15 downto 0); data_out : out std_logic_vector (15 downto 0) := X"0000" ); end xxxx; architecture rtl of xxxx is signal reg_empty : STD_LOGIC_VECTOR(3 DOWNTO 0):= (OTHERS => '0'); begin process (clk) begin if clk'event and clk = '1' then if rst = '1' then data_out <= X"0000"; else data_out <= din(slash-1 downto 0) & din(15 downto slash); end if; end if; end process; end architecture; В ISE 14.7 проверял - синтезируется, в QUARTUS 11.0 - выдает ошибку : Error (10394): VHDL error at xxxx.vhd: left bound of range must be a constant. Как объяснить Quartus-у , что эту конструкцию нужно построить на мультиплексорах...а не плеваться на нее...?! :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ADA007 0 20 сентября, 2016 Опубликовано 20 сентября, 2016 · Жалоба А вот если подменить строку для выдачи data_out на => data_out <= to_stdlogicvector(to_bitvector(din) ror slash); то все прекрасно синтезится в ISE и quartus-e ... вроде бы то же самое написано по функционалу, но видать как-то там эти функции так написаны, что синтезатору они понятнее описаны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться