Boobrilla
Участник-
Постов
11 -
Зарегистрирован
-
Посещение
Репутация
0 Обычный-
Тестбенч не кидал, ибо он стандартно "пустой", ничего не добавлял. Кроме наверное ресета = 1 . ENTITY Final IS END Final; ARCHITECTURE behavior OF Final IS COMPONENT Toplvl PORT( clk : IN std_logic; reset : IN std_logic; sinus1 : OUT std_logic_vector(16 downto 0) ); END COMPONENT; --Inputs signal clk : std_logic := '0'; signal reset : std_logic := '0'; --Outputs signal sinus1 : std_logic_vector(16 downto 0); -- Clock period definitions constant clk_period : time := 10 ns; BEGIN -- Instantiate the Unit Under Test (UUT) uut: Toplvl PORT MAP ( clk => clk, reset => reset, sinus1 => sinus1 ); -- Clock process definitions clk_process :process begin clk <= '0'; wait for clk_period/2; clk <= '1'; wait for clk_period/2; end process; -- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. wait for 100 ns; wait for clk_period*10; reset <= '1'; -- insert stimulus here wait; end process; END;
-
Ну выходит что так) Но я бы просто тогда наверно вермя такта менял, если бы этого позволяло задание
-
По портам не заметил) Но, видимо, ISE позволяет) (оба in). По поводу подхода "в лоб" - я слишком еще не опытен. Лучше сделать так, как точно будет работать) Ну а если нужно будет изменить длину задержки, то просто добавлять/удалять кол-во переменных действий) В моем случае задержка была 190 ns = 19 по 10 ns.
-
sine with cordic vhdl
Boobrilla опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Ну и результат -
И снова я) В общем написал я вывод синусоиды используя алгоритм, все компилит, моделируется и т.д. Но либо он не берет значения из таблицы, либо просто плохой вывод,, не могу понять в чем причина и как с ней поступать. Была мысль просто убрать тип to_signed и описывать без него, либо как то правильно конвертировать в std_logic_vector. Но видимо не получилось. Вопрос в том, что я не правильно описал и как сделать лучше сейчас и в дальнейшем (совет какой-нибудь был бы кстати). library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; Entity sinyth is port( clk : in std_logic; resetn : in std_logic; z : in std_logic_vector(15 downto 0); x : in std_logic_vector(15 downto 0); y : in std_logic_vector(15 downto 0); sin : out std_logic_vector(15 downto 0)); end sinyth; Architecture masive of sinyth is type signed_array is ARRAY (natural range <>) of signed(15 downto 0); constant tan_array: signed_array(0 to 16) := ("0110010001111011", "0011101101100100", "0001111101011100", "0000111111101100", "0000011111111101", "0000001111111110", "0000000111111111", "0000000100000000", "0000000010000000", "0000000001000000", "0000000000100000", "0000000000010000", "0000000000001000", "0000000000000100", "0000000000000010", "0000000000000001", "0000000000000000"); signal x_array: signed_array (0 to 17) := (others => (others => '0')); signal y_array: signed_array (0 to 17) := (others => (others => '0')); signal z_array: signed_array (0 to 17) := (others => (others => '0')); begin process(clk) begin if resetn = '1' then x_array <= (others => (others => '0')); y_array <= (others => (others => '0')); z_array <= (others => (others => '0')); elsif rising_edge(clk) then if signed(z) < to_signed(0, 16) then x_array(x_array'low) <= signed(x) + signed(y); y_array(y_array'low) <= signed(y) - signed(x); z_array(z_array'low) <= signed(z) + tan_array(0); else x_array(x_array'low) <= signed(x) - signed(y); y_array(y_array'low) <= signed(y) + signed(x); z_array(z_array'low) <= signed(z) - tan_array(0); end if; for i in 1 to 14 loop if z_array(i-1) < to_signed(0,16) then x_array(i) <= x_array(i-1) + (y_array(i-1)/2**(i-1)); y_array(i) <= y_array(i-1) - (x_array(i-1)/2**(i-1)); z_array(i) <= z_array(i-1) + tan_array(i-1); else x_array(i) <= x_array(i-1) - (y_array(i-1)/2**(i-1)); y_array(i) <= y_array(i-1) + (x_array(i-1)/2**(i-1)); z_array(i) <= z_array(i-1) - tan_array(i); end if; end loop; end if; end process; sin <= std_logic_vector(y_array(y_array'length(15 downto 0))); end architecture masive;
-
Спасибо, топ, ни одной из этих ссылок не видел сам)
-
По-моему это не VHDL. Разве нет?
-
только так( file:///C:/Users/i.yakushevski/AppData/Local/Packages/Microsoft.SkypeApp_kzf8qxf38zg5c/LocalState/Downloads/03-Zakharov-Algoritmy-CORDIC-p-353.pdf (http://kit-e.ru/assets/files/pdf/2011_12_36.pdf))и там есть матч часть
-
1. Ну напишите на Veriloge (из спортивных соображений). Лишним не будет. 2. существующие взять не проблема, тут как раз таки академическая цель, для разбора написания их самому)
-
X Y - это координаты вектора (x0 y0 это начальные координаты.) Z - сдвиг фазы (со знаком) Конкретно вызывает вопросы реализация алгоритма на VHDL. сама мат часть
-
Всем привет. Всегда было проще разбираться в новом материале с помощью конкретных примеров. Но тут к сожалению пусто (либо я просто не нашел) в плане РАБОЧИХ примеров. По сухой теории сложно заходит. Поэтому пишу сюда в попытке получить помощь. (Сам не совсем новичок в программировании, но в программировании лог. устройств. чуть больше нолика ). Вот частичка того, что нужно, что самому получилось описать. В большей степени проблема в понимании основного куска кода, где и есть тот алгоритм, который двигает собственно вектор наш. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; entity sinustest is port( clk: in STD_LOGIC; rst: in STD_LOGIC; dataz : out STD_LOGIC_VECTOR (15 downto 0); data : out STD_LOGIC_VECTOR (15 downto 0)); ); end sinustest; architecture Behavioral of sinustest is type arr_type is array (0 to 16) of std_logic_vector(15 downto 0); signal Y : arr_type; signal X : arr_type; signal Z : arr_type; signal a : arr_type:= ( "0011111111111111", "0010010111000111", "0001001111110110", "0000101000100010", "0000010100010110", "0000001010001100", "0000000101000110", "0000000010100011", "0000000001010001", "0000000000101001", "0000000000010100", "0000000000001010", "0000000000000101", "0000000000000011", "0000000000000001", "0000000000000001","0000000000000000"); -- описание сигналов и фазового сдвига на каждый такт type mode is (functioning1, functioning2); signal state : mode; begin process (clk) begin if clk = '1' and clk'event then -- начальное значение (очевидно) по x y. стартовая отсечка вектора if rst = '1' then X(0) <= "0011111111111111"; Y(0) <= "0000000000000000"; state <= functioning1; Z(0) <= "0000000000000000"; .... .... -- та дичь, где должно все происходить end if; dataz <= Z(16); data <= Y (16); end process; end Behavioral; CODE Вот мне бы с "дичью" разобраться, был бы благодарен