sazh 8 1 ноября, 2006 Опубликовано 1 ноября, 2006 · Жалоба Этак меня угораздит еще и на VHDL подсесть. Тестбенч покажите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 1 ноября, 2006 Опубликовано 1 ноября, 2006 · Жалоба library ieee; use ieee.numeric_std.all; use ieee.std_logic_1164.all; entity del_clk_tb is end del_clk_tb; architecture TB_ARCHITECTURE of del_clk_tb is component Verilog2VHDL port( clk : in std_logic; res : in STD_LOGIC; del_clk : in STD_LOGIC_VECTOR (15 downto 0); prog : in STD_LOGIC_VECTOR (15 downto 0); shim : out STD_LOGIC); end component; signal res : std_logic ; signal clk : std_logic ; signal prog : std_logic_vector(15 downto 0) ; signal del_clk : std_logic_vector(15 downto 0) ; signal shim : std_logic; begin UUT : Verilog2VHDL port map ( res => res, shim => shim, clk => clk, prog => prog, del_clk => del_clk ); pClock: process begin clk <= '0'; wait for 10 ns; clk <= '1'; wait for 10 ns; end process; pReset: process begin res <= '1'; prog <= "0000000000000010"; del_clk <= "0000000000000011"; wait until rising_edge(clk); wait until rising_edge(clk); wait until rising_edge(clk); res <= '0'; wait; -- Forever end process; end TB_ARCHITECTURE; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 1 ноября, 2006 Опубликовано 1 ноября, 2006 · Жалоба Если моделировать в модельсиме, то можно обойтись без тестбенчей(так быстрее и удобнее за всем наблюдать, по крайней мере для меня). Я задаю необходимые сигналы через закладку Objects. Сначала res=1 prog=0000000000000010 del_clk=0000000000000011 clk=clock(period 100,duty 50)====>делаем run 300 смотрим меняем res=0=======>делаем run 1000 и смотрим что получилось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 1 ноября, 2006 Опубликовано 1 ноября, 2006 · Жалоба Ну ради меня. Раз 15 кнопочку run нажмите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 1 ноября, 2006 Опубликовано 1 ноября, 2006 · Жалоба А получилось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 1 ноября, 2006 Опубликовано 1 ноября, 2006 · Жалоба Это соответсвует действительности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 1 ноября, 2006 Опубликовано 1 ноября, 2006 · Жалоба Если следовать Вашей блок схеме, можно ввести сигналы set и out. И по другому быть не может. А дальше выбор. Или сдвигающий регистр на 60 тыся отсчетов. И все равно период set должен быть больше периода out. Или как у меня сигналы длительностью в один период клока. И не торопитесь увольнять схемотехника. Ведь он в графике рисует. А это процесс трудоемкий. Поэтому сначало думать приходиться. На этом и заканчиваю. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Verilog2VHDL is Port ( clk : in STD_LOGIC; res : in STD_LOGIC; del_clk : in STD_LOGIC_VECTOR (15 downto 0); prog : in STD_LOGIC_VECTOR (15 downto 0); set : out STD_LOGIC; outt : out STD_LOGIC); end Verilog2VHDL; architecture Behavioral of Verilog2VHDL is signal ct_a : STD_LOGIC_VECTOR (15 downto 0); signal ct_b : STD_LOGIC_VECTOR (15 downto 0); signal enable : STD_LOGIC; begin process(clk) begin if(clk='1' and clk'event) then if (res='1') then ct_a(0 downto 0) <= (others => '1'); elsif (ct_a = 1) then if del_clk = 0 then ct_a(0 downto 0) <= (others => '1'); else ct_a <= del_clk; end if; else ct_a <= ct_a - 1; end if; if (ct_a = 1) then if prog = 0 then ct_a(0 downto 0) <= (others => '1'); else ct_b <= prog; end if; elsif (enable='1') then ct_b <= ct_b - 1; end if; if (ct_a = 1) then enable <= '1'; elsif (ct_b = 1)then enable <= '0'; end if; if (ct_a = 1) then set <= '1'; else set <= '0'; end if; if (ct_b = 1) then outt <= '1'; else outt <= '0'; end if; end if; end process; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 2 ноября, 2006 Опубликовано 2 ноября, 2006 · Жалоба to sazh Проверяли? При res=1 уже на втором тактовом импульсе выскакивает set=1 u enable=1 , а на outt всегда ноль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 2 ноября, 2006 Опубликовано 2 ноября, 2006 · Жалоба Я всегда проверяю. Если запретить считать счетчику, то и сигналы изменяться не будут. А ошибка есть. Когда копированием эксперементировал с этой предовой строчкой ct_b(0 downto 0) <= (others => '1'); По ресету выходные сигналы можно в ноль установить. Только результат тот же будет. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Verilog2VHDL is Port ( clk : in STD_LOGIC; res : in STD_LOGIC; del_clk : in STD_LOGIC_VECTOR (15 downto 0); prog : in STD_LOGIC_VECTOR (15 downto 0); set : out STD_LOGIC; outt : out STD_LOGIC); end Verilog2VHDL; architecture Behavioral of Verilog2VHDL is signal ct_a : STD_LOGIC_VECTOR (15 downto 0); signal ct_b : STD_LOGIC_VECTOR (15 downto 0); signal enable : STD_LOGIC; begin process(clk) begin if(clk='1' and clk'event) then if (res='1') then ct_a(1 downto 1) <= (others => '1'); elsif (ct_a = 1) then if del_clk = 0 then ct_a(0 downto 0) <= (others => '1'); else ct_a <= del_clk; end if; else ct_a <= ct_a - 1; end if; if (ct_a = 1) then if prog = 0 then ct_b(0 downto 0) <= (others => '1'); else ct_b <= prog; end if; elsif (enable='1') then ct_b <= ct_b - 1; end if; if (ct_a = 1) then enable <= '1'; elsif (ct_b = 1)then enable <= '0'; end if; if (ct_a = 1) then set <= '1'; else set <= '0'; end if; if (ct_b = 1) then outt <= '1'; else outt <= '0'; end if; end if; end process; end Behavioral; Все строчки типа ct_a(1 downto 1) <= (others => '1'); надо откатить назад. Бредятина получается. И на этом с VHDL действительно все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 2 ноября, 2006 Опубликовано 2 ноября, 2006 · Жалоба Вот сегодня с утра нашкарябал, работает, синтезатор всё хавает,только про ресурсоёмкость я молчу, сейчас уже не до оптимизации,но есть один баг, сигнал enable выскакивает на отдин такт позже задуманнного, из-за этого получается сдвиг на первом такте выхода счётчика,сейчас пытаюсь вправить этой схемке мозги.Вот рабочий вариант: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity timer_test is Port ( clk : in STD_LOGIC; set_clk : in STD_LOGIC; reset : in STD_LOGIC; prog_divCLK : in STD_LOGIC_VECTOR (15 downto 0); prog_delay : in STD_LOGIC_VECTOR (15 downto 0); out_timer : out STD_LOGIC; out_divCLK : out STD_LOGIC); end timer_test; architecture Behavioral of timer_test is signal st_divCLK : STD_LOGIC_VECTOR (15 downto 0); signal st_timer : STD_LOGIC_VECTOR (15 downto 0); signal start_timer : STD_LOGIC; signal comp_sig : STD_LOGIC; signal divCLK : STD_LOGIC; signal enable : STD_LOGIC; signal timer : STD_LOGIC; begin process(clk) begin if (clk='1' and clk'event) then if reset = '1' then st_divCLK <= "0000000000000001"; start_timer<='0'; elsif set_clk = '1' then if st_divCLK = "0000000000000001" then st_divCLK <= prog_divCLK; else st_divCLK <= st_divCLK - 1; end if; if st_divCLK="0000000000000001" then start_timer<='1'; else start_timer<='0'; end if; end if; end if; end process; divCLK<= (clk and start_timer); out_divCLK<=divCLK; process(clk) begin if (clk='1' and clk'event) then if (start_timer='1') then enable<='1'; elsif (start_timer='0' and comp_sig='1') then enable<='0'; end if; end if; end process; process(clk) begin if (clk='1' and clk'event) then if reset = '1' then st_timer <= "0000000000000001"; comp_sig <='0'; elsif enable='1' then if st_timer = "0000000000000001" then st_timer <= prog_delay; else st_timer <= st_timer - 1; end if; if st_timer = "0000000000000001" then comp_sig <='1'; else comp_sig <='0'; end if; end if; end if; end process; timer<= (clk and comp_sig); out_timer<=timer; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klop 0 2 ноября, 2006 Опубликовано 2 ноября, 2006 (изменено) · Жалоба divCLK<= (clk and start_timer); Вы уверены что это Вам нужно? Помоделируйте все ето после синтеза и P&R(c SDF). Много интересного увидете. :cranky: Изменено 2 ноября, 2006 пользователем klop Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 5 июня, 2007 Опубликовано 5 июня, 2007 (изменено) · Жалоба Да,вот наткнулся на свою старую темку,а тогда вот что получилось process(clk) -- делитель + таймер begin if (clk='1' and clk'event) then if reset_clk = '1' then st_divCLK <= "0000000000000001"; start_timer<='0'; elsif set_clk = '1' then if st_divCLK = "0000000000000001" then st_divCLK <= prog_divCLK; else st_divCLK <= st_divCLK - 1; end if; if st_divCLK="0000000000000001" then start_timer<='1'; else start_timer<='0'; end if; end if; end if; end process; process(start_timer, timer) begin if timer='1' then enable_timer<='0'; elsif start_timer='1' then enable_timer<='1'; end if; end process; process(clk) begin if (clk='1' and clk'event) then if reset_clk = '1' then st_timer<="0000000000000000"; timer<='0'; elsif set_clk = '1' then if enable_timer='1' then if st_timer<prog_delay_sig then st_timer<=st_timer+1; else st_timer<="0000000000000000"; end if; end if; if st_timer<prog_delay_sig then timer<='0'; else timer<='1'; end if; end if; end if; end process; divCLK<= start_timer; out_timer<=timer; правда там были внесены некоторые другие условия по сравнению с исходными,но основная идея та же Изменено 5 июня, 2007 пользователем darkniisiis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться