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

    

Boobrilla

Участник
  • Публикаций

    11
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Цитата(Maverick @ Sep 28 2017, 14:58) где тестбенч для симуляции? Тестбенч не кидал, ибо он стандартно "пустой", ничего не добавлял. Кроме наверное ресета = 1 . CODEENTITY 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;
  2. Ну выходит что так) Но я бы просто тогда наверно вермя такта менял, если бы этого позволяло задание
  3. По портам не заметил) Но, видимо, ISE позволяет) (оба in). По поводу подхода "в лоб" - я слишком еще не опытен. Лучше сделать так, как точно будет работать) Ну а если нужно будет изменить длину задержки, то просто добавлять/удалять кол-во переменных действий) В моем случае задержка была 190 ns = 19 по 10 ns.
  4. Цитата(Boobrilla @ Sep 28 2017, 08:48) Привет всем. Просто доделал, решил поделиться) Может молодым спецам пригодится) Кордик для вычисления синуса 100KHz c четвертью в 250 тактов. (если какие нибудь замечания будут, или советы по оптимизации, был бы рад) CODElibrary IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity Toplvl is port ( clk : std_logic; reset : std_logic; sinus1 : out std_logic_vector(16 downto 0)); end Toplvl; architecture Behavioral of Toplvl is signal quarter_1 : std_logic_vector (1 downto 0); signal t : std_logic_vector (16 downto 0); signal e : std_logic_vector (16 downto 0); component math port ( clk : in std_logic; reset : in std_logic; qu : out std_logic_vector (1 downto 0); cosin : out std_logic_vector (16 downto 0); sinus : out std_logic_vector (16 downto 0)); end component; component right port ( clk : in std_logic; reset : in std_logic; x : in std_logic_vector(16 downto 0); y : in std_logic_vector(16 downto 0); quarter : in std_logic_vector (1 downto 0); xo : out std_logic_vector(16 downto 0); yo : out std_logic_vector(16 downto 0)); end component; begin --sinus1 <= yx; math_end : math port map ( clk => clk, reset => reset, qu => quarter_1, cosin => t, sinus => e); right_end : right port map ( clk => clk, reset => reset, x => t, y => e, quarter => quarter_1, yo => sinus1); end Behavioral; CODEentity math is port ( clk : in std_logic; reset : in std_logic; qu : out std_logic_vector (1 downto 0); sinus : out std_logic_vector (16 downto 0); cosin : out std_logic_vector (16 downto 0)); end math; architecture Behavioral of math is type my_type is array (0 to 16) of signed (16 downto 0); signal x : my_type; signal y : my_type; signal z : my_type; signal j : my_type :=("00111110011110010", "00100100111011010", "00010011011111111", "00001001111011110", "00000100111101111", "00000010011111000", "00000001001111011", "00000000100111110", "00000000010011011", "00000000001010000", "00000000000101000", "00000000000010100", "00000000000001010", "00000000000000101", "00000000000000011", "00000000000000010", "00000000000000001"); signal l : std_logic_vector(16 downto 0); signal f : std_logic_vector(16 downto 0); component delay port ( clk : in std_logic; reset : in std_logic; quarter_do : out std_logic_vector(1 downto 0)); end component; component rotation generic ( first : integer := 0; second : integer := 1; third : integer := 2; fourth : integer := 3); Port ( clk : in std_logic; reset : in std_logic; Angle : out std_logic_vector (12 downto 0); quarter_in : out std_logic_vector (1 downto 0)); end component; signal xangle : std_logic_vector(12 downto 0); signal xxangle : signed(16 downto 0); begin rotation_XYN : rotation port map ( clk => clk, Angle => xangle, reset => reset ); delay_XYN : delay port map ( clk => clk, reset => reset, quarter_do => qu ); xxangle(16) <= '0'; xxangle(15 downto 4) <= signed(xangle(11 downto 0)); xxangle(3 downto 0) <= (others => '0'); process(clk) begin if rising_edge(clk) then if reset <= '1' then x(0) <= "00000100110110110"; y(0) <= "00000000000000000"; z(0) <= signed(xxangle); For n in 0 to 15 loop if (z(n) < 0) then x(n+1) <= x(n) + (y(n)/2**n); y(n+1) <= y(n) - (x(n)/2**n); z(n+1) <= z(n) + j(n); else x(n+1) <= x(n) -(y(n)/2**n); y(n+1) <= y(n) +(x(n)/2**n); z(n+1) <= z(n) - j(n); end if; f <= std_logic_vector(x(16)); l <= std_logic_vector(y(16)); cosin <= f; sinus <= l; end loop; end if; end if; end process; end Behavioral; CODEentity rotation is generic ( first : integer := 0; second : integer := 1; third : integer := 2; fourth : integer := 3); Port ( clk : in std_logic; reset : in std_logic; Angle : out std_logic_vector (12 downto 0); quarter_in : out std_logic_vector (1 downto 0)); end rotation; architecture Behavioral of rotation is signal Ang : std_logic_vector (12 downto 0) := (others => '0'); signal state : unsigned (1 downto 0) := to_unsigned(first,2); signal count_ang : std_logic_vector (11 downto 0) := (others => '0'); begin process (clk) begin if (rising_edge(clk)) then if (reset = '1') then case(state) is when to_unsigned(first,2) => if (count_ang >= 3999) then --00 state <= to_unsigned(second,2); count_ang <= "000000010000"; quarter_in <= "01"; Ang <= Ang - 16; else state <= to_unsigned(first,2); quarter_in <= "00"; Ang <= Ang + 16; count_ang <= count_ang + 16; end if; when to_unsigned(second,2) => if (count_ang >= 3999) then --01 state <= to_unsigned(third,2); count_ang <= "000000010000"; quarter_in <= "10"; Ang <= Ang + 16; else state <= to_unsigned(second,2); quarter_in <= "01"; Ang <= Ang - 16; count_ang <= count_ang + 16; end if; when to_unsigned(third,2) => if (count_ang >= 3999) then state <= to_unsigned(fourth,2); count_ang <= "000000010000"; quarter_in <= "11"; Ang <= Ang - 16; else state <= to_unsigned(third,2); quarter_in <= "10"; Ang <= Ang + 16; count_ang <= count_ang + 16; end if; when to_unsigned(fourth,2) => if (count_ang >= 3999) then state <= to_unsigned(first,2); count_ang <= "000000010000"; quarter_in <= "00"; Ang <= Ang + 16; else state <= to_unsigned(fourth,2); quarter_in <= "11"; Ang <= Ang - 16; count_ang <= count_ang + 16; end if; when others => count_ang <= (others => '0'); end case; end if; end if; end process; Angle <= Ang; end Behavioral; CODEentity delay is port ( clk : in std_logic; reset : in std_logic; quarter_do : out std_logic_vector(1 downto 0)); end delay; architecture Behavioral of delay is signal delay_1 : std_logic_vector(1 downto 0); signal delay_2 : std_logic_vector(1 downto 0); signal delay_3 : std_logic_vector(1 downto 0); signal delay_4 : std_logic_vector(1 downto 0); signal delay_5 : std_logic_vector(1 downto 0); signal delay_6 : std_logic_vector(1 downto 0); signal delay_7 : std_logic_vector(1 downto 0); signal delay_8 : std_logic_vector(1 downto 0); signal delay_9 : std_logic_vector(1 downto 0); signal delay_10 : std_logic_vector(1 downto 0); signal delay_11 : std_logic_vector(1 downto 0); signal delay_12 : std_logic_vector(1 downto 0); signal delay_13 : std_logic_vector(1 downto 0); signal delay_14 : std_logic_vector(1 downto 0); signal delay_15 : std_logic_vector(1 downto 0); signal delay_16 : std_logic_vector(1 downto 0); signal delay_17 : std_logic_vector(1 downto 0); signal delay_18 : std_logic_vector(1 downto 0); signal delay_19 : std_logic_vector(1 downto 0); component rotation generic ( first : integer := 0; second : integer := 1; third : integer := 2; fourth : integer := 3); Port ( clk : in std_logic; reset : in std_logic; Angle : out std_logic_vector (12 downto 0); quarter_in : out std_logic_vector (1 downto 0)); end component; begin rotation_XYN : rotation port map ( clk => clk, reset => reset, quarter_in => delay_1 ); process(clk) begin if rising_edge(clk) then delay_2 <= delay_1; delay_3 <= delay_2; delay_4 <= delay_3; delay_5 <= delay_4; delay_6 <= delay_5; delay_7 <= delay_6; delay_8 <= delay_7; delay_9 <= delay_8; delay_10 <= delay_9; delay_11 <= delay_10; delay_12 <= delay_11; delay_13 <= delay_12; delay_14 <= delay_13; delay_15 <= delay_14; delay_16 <= delay_15; delay_17 <= delay_16; delay_18 <= delay_17; delay_19 <= delay_18; quarter_do <= delay_19; end if; end process; end Behavioral; CODEentity right is port ( clk : in std_logic; reset : in std_logic; x : in std_logic_vector(16 downto 0); y : in std_logic_vector(16 downto 0); quarter : in std_logic_vector (1 downto 0); xo : out std_logic_vector(16 downto 0); yo : out std_logic_vector(16 downto 0)); end right; architecture Behavioral of right is signal xq1 : std_logic_vector(16 downto 0); signal xq2 : std_logic_vector(16 downto 0); signal yq1 : std_logic_vector(16 downto 0); signal yq2 : std_logic_vector(16 downto 0); signal xr : std_logic_vector(16 downto 0); signal yr : std_logic_vector(16 downto 0); begin xq1 <= x + 0; yq1 <= y + 0; xq2 <= 0 - x; yq2 <= 0 - y; process(clk) begin if (rising_edge(clk)) then if (reset = '1') then case (quarter) is when "00" => yr <= yq1; xr <= xq1; when "01" => yr <= yq1; xr <= xq2; when "10" => yr <= yq2; xr <= xq2; when "11" => yr <= yq2; xr <= xq1; when others => xr <= (others => '0'); yr <= (others => '0'); end case; else xr <= (others => '0'); yr <= (others => '0'); end if; end if; end process; xo <= xr; yo <= yr; end Behavioral; Ну и результат
  5. И снова я) В общем написал я вывод синусоиды используя алгоритм, все компилит, моделируется и т.д. Но либо он не берет значения из таблицы, либо просто плохой вывод,, не могу понять в чем причина и как с ней поступать. Была мысль просто убрать тип to_signed и описывать без него, либо как то правильно конвертировать в std_logic_vector. Но видимо не получилось. Вопрос в том, что я не правильно описал и как сделать лучше сейчас и в дальнейшем (совет какой-нибудь был бы кстати). CODElibrary 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;
  6. Цитата(Maverick @ Aug 17 2017, 15:10) может такое для понимания ? или 1 2 Спасибо, топ, ни одной из этих ссылок не видел сам)
  7. Цитата(iosifk @ Aug 17 2017, 14:14) http://kit-e.ru/articles/plis/2011_12_36.php По-моему это не VHDL. Разве нет?
  8. Цитата(AVR @ Aug 17 2017, 14:11) Есть возможность предоставить математическую модель алгоритма с комментариями? только так( 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))и там есть матч часть
  9. Цитата(AVR @ Aug 17 2017, 13:32) Прежде чем делать это в железе, нужна не только теория, но и действующая модель на том, на чем уровень не нулевой. Для кого-то это Матлаб, у меня же в почете Python. Сначала модель, а потом это можно перелохматить в аппаратный код. Модель в студию. И тогда можно будет претворить алгоритм в "дичь". VDHL (фу) обязательно? На Verilog я бы написал из спортивных соображений. И чем не подошли существующие IP-ядра с кордиками от производителя? Они вполне работают, или тут академические цели? 1. Ну напишите на Veriloge (из спортивных соображений). Лишним не будет. 2. существующие взять не проблема, тут как раз таки академическая цель, для разбора написания их самому)
  10. Цитата(Tausinov @ Aug 17 2017, 13:15) А что такое X, Y, Z? И что конкретно вызывает вопросы? Вообще классика генерации гармоники - память со значениями синуса\косинуса и аккумулятор фазы, с помощью которого получается текущий адрес на входе памяти. А дальше уже большой простор для различных вариаций. X Y - это координаты вектора (x0 y0 это начальные координаты.) Z - сдвиг фазы (со знаком) Конкретно вызывает вопросы реализация алгоритма на VHDL. сама мат часть
  11. Всем привет. Всегда было проще разбираться в новом материале с помощью конкретных примеров. Но тут к сожалению пусто (либо я просто не нашел) в плане РАБОЧИХ примеров. По сухой теории сложно заходит. Поэтому пишу сюда в попытке получить помощь. (Сам не совсем новичок в программировании, но в программировании лог. устройств. чуть больше нолика ). Вот частичка того, что нужно, что самому получилось описать. В большей степени проблема в понимании основного куска кода, где и есть тот алгоритм, который двигает собственно вектор наш. CODECODElibrary 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; Вот мне бы с "дичью" разобраться, был бы благодарен