Перейти к содержанию
    

DCT vhdl

Добрый день, делаю дискретно косинусное преобразование в среде quarus II но есть нюанс. Выдает ошибку Error (10414): VHDL Unsupported Feature error at main.vhd(13): cannot synthesize non-constant real objects or values, на мои созданные типы. В чем может быть проблема?
Первый файл:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

package add is
type matrixreal is array(0 to 7, 0 to 7) of real range -255.0 to 255.0;
end package add;

Второй файл
Возможно ошибок еще много, еще изучаю vhdl язык.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use ieee.std_logic_unsigned.all;
--use ieee.std_logic_arith.all;
use work.add.all;


entity main is
port (
Clk : in std_logic;
Start : in std_logic;
Din : in matrixreal;
Done : out std_logic;
Dout : out matrixreal
);
end main;

architecture main of main is
begin
process
variable i, j, k: INTEGER;
variable OutBlock : matrixreal;	  
variable temp : matrixreal;	 
variable dct : matrixreal;
variable dctt : matrixreal;
variable OutAnother: matrixreal;

begin
	  
	dct := (
		(0.354, 0.354, 0.354, 0.354, 0.354, 0.354, 0.354, 0.354),
		(0.490, 0.416, 0.278, 0.098, -0.098, -0.278, -0.416, -0.490),
		(0.462, 0.191, -0.191, -0.462, -0.462, -0.191, 0.191, 0.462),
		(0.416, -0.098, -0.490, -0.278, 0.278, 0.490, 0.098, -0.416),
		(0.354, -0.354, -0.354, -0.354, 0.354, -0.354, -0.354, 0.354),
		(0.278, -0.490, 0.098, 0.416, -0.416, -0.098, 0.490, -0.278),
		(0.191, 0.462, 0.462, -0.191, -0.191, 0.462, -0.462, 0.191),
		(0.098, 0.278, 0.416, -0.490, 0.490, -0.416, 0.278, -0.098));	
		  
	wait until Start = '1';
		Done <= '0';    

	for i in 0 to 7 loop
		for j in 0 to 7 loop
			temp(i,j) := 0.0;	 
			OutBlock(i,j) := 0.0;
			Dout(i,j) <= 0.0;
		end loop;
	end loop; 
	
	for i in 0 to 7 loop
		for j in 0 to 7 loop
			for k in 0 to 7 loop
					temp(i,j) := temp(i,j) + dct(i,k) * Din(k,j);
			end loop;
		end loop;
	end loop;			
	
	for i in 0 to 7 loop
		for j in 0 to 7 loop
			dctt(i,j) := temp(j,i); 
		end loop;
	end loop; 

	for i in 0 to 7 loop
		for j in 0 to 7 loop
			for k in 0 to 7 loop	
			OutBlock(i,j) := OutBlock(i,j) + dct(i,k) * dctt(k,j);
			end loop;
		end loop;
	end loop;	
	
		for i in 0 to 7 loop
		for j in 0 to 7 loop
			OutAnother(i,j) := OutBlock(j,i); 
		end loop;
	end loop; 


	wait until Clk = '1' and Clk'event;
		Done <= '1';


	for i in 0 to 7 loop
		for j in 0 to 7 loop
			wait until Clk = '1' and Clk'event;
				Done <= '0';
			Dout(i,j)<= OutAnother(i,j);
		end loop;
	end loop;  
	
end process;
end main;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

он же пишет вам что синтез вещественных типов не поддерживается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 минуты назад, des00 сказал:

он же пишет вам что синтез вещественных типов не поддерживается.

Я не понимаю как её исправить.

Вот все ошибки которые выдает

Цитата

Error (10414): VHDL Unsupported Feature error at main.vhd(13): cannot synthesize non-constant real objects or values
Error (10414): VHDL Unsupported Feature error at main.vhd(15): cannot synthesize non-constant real objects or values
Error (12153): Can't elaborate top-level user hierarchy
Error: Quartus II 64-Bit Analysis & Synthesis was unsuccessful. 3 errors, 1 warning
    Error: Peak virtual memory: 497 megabytes
    Error: Processing ended: Fri Dec 09 19:25:35 2022
    Error: Elapsed time: 00:00:02
    Error: Total CPU time (on all processors): 00:00:01
Error (293001): Quartus II Full Compilation was unsuccessful. 5 errors, 1 warning
 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, kola said:

Я не понимаю как её исправить.

Никак не исправить. Нужно либо уходить на фиксированную точку, либо, если вам непременно нужно считать в плавучке, то брать IEEE-754, по учебнику делать модули выполняющие нужные операции, а потом интегрировать эти модули в ваше дкт ядро. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 09.12.2022 в 21:17, des00 сказал:

Никак не исправить. Нужно либо уходить на фиксированную точку, либо, если вам непременно нужно считать в плавучке, то брать IEEE-754, по учебнику делать модули выполняющие нужные операции, а потом интегрировать эти модули в ваше дкт ядро. 

Подскажите точнее, как мне перейти на "фиксированную точку"? Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, kola said:

Подскажите точнее, как мне перейти на "фиксированную точку"? Заранее спасибо.

работать с сигналами формата векторов, в которых часть бит представляет собой целочисленную составляющую (integer part) и другая часть - дробная (fractional part).

не забыть еще про знак для знаковых векторов

гугл - fixed point arithmetic in vhdl

http://math.unife.it/ing/informazione/Linguaggi-hw/lucidi-delle-lezioni/lucidi-anni-precedenti-al-2019-2020/aritmetica-fixed-e-floating-point-in-vhdl

 

а вообще вроде DCT было на opencores.org

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще в vhdl есть стандартные библиотеки (packages в библиотеке ieee) для фиксированной и плавающей точки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, Viktuar said:

Вообще в vhdl есть стандартные библиотеки (packages в библиотеке ieee) для фиксированной и плавающей точки.

а вы попробуйте синтезировать(не модулировать в симуляторе!!!) что-то с помощью этого пакета) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...