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

lyzifer

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о lyzifer

  • Звание
    Участник
    Участник

Посетители профиля

632 просмотра профиля
  1. ооо,вот тут помогло: process (clk_20) begin if rising_edge(clk_20) then case state_q is when TRANSFER => CLKuWire <= (CLKuWire_q(CLK_DIV - 1)); when others => null; end case; end if; end process; в тестбенче CLKuWire теперь выдаёт результаты. а вот список чувствительности в принципе ничего не дал process(state_q, start_interface, CLKuWire_q, ctr_q, data_q, DATAuWire_q, get_data_q, data_2write) begin только как мне теперь добиться,чтобы на DATAuWire выдавались данные со всех регистров, а не только с 2х ?
  2. ну по началу было так: process (clk_20) begin if rising_edge(clk_20) then case state_q is when TRANSFER => spi_clk <= (spi_clk_q(CLK_DIV - 1)); end case; end if; end process; но Вивада ругается на такое представление...
  3. Есть у меня описание работы синтезатора,состоящего из 3-x модулей. RTL-анализ проходит успешно,а вот тестбенч не выдаёт ничего путного. А я в свою очередь не могу понять,в чём проблема, то ли просто тестбенч косячно написал,то ли в описании устройства ошибся. Вот его описание на VHDL: 1)ОСНОВНОЙ МОДУЛЬ library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity TOP is Port ( clk : in STD_LOGIC; reset: in STD_LOGIC; DATAuWire : out STD_LOGIC; CLKuWire : out STD_LOGIC; LEuWire : out STD_LOGIC ); end TOP; architecture Behavioral of TOP is component spi_interface Generic(CLK_DIV: integer := 2); Port ( clk_20: in STD_LOGIC; -- System clk = 20 MHz reset_n : in STD_LOGIC; -- Reset signal start_interface : in STD_LOGIC; -- Send data via SPI interface data_2write : in STD_LOGIC_VECTOR(31 downto 0); -- CDCE62005 register content get_data : inout STD_LOGIC; -- Transmit complete, get a new data to interface DATAuWire : out STD_LOGIC; -- Serial Clock CLKuWire : out STD_LOGIC; -- SPI master output signal --spi_miso : in STD_LOGIC; -- SPI input signal LEuWire : out STD_LOGIC); -- Latch enable end component; component programming_sequence Port ( clk_20 : in STD_LOGIC; -- System clk = 20 MHz reset_n : in STD_LOGIC; -- Reset signal get_data : in STD_LOGIC; -- Change register content start_interface : out STD_LOGIC; -- Send data via SPI interface data_2write : out STD_LOGIC_VECTOR (31 downto 0); -- CDCE62005 register content sync : out STD_LOGIC; -- CDCE62005 SYNC# power_down : out STD_LOGIC); -- CDCE62005 Power Down# end component; signal si : std_logic; signal dw : STD_LOGIC_VECTOR(31 downto 0); signal gd : std_logic; begin dd1:component programming_sequence port map (clk_20=>clk,reset_n=>reset,get_data=>gd,start_interface=>si,data_2write=>dw); dd2:component spi_interface port map (clk_20=>clk,reset_n=>reset,start_interface=>si,data_2write=>dw,get_data=>gd,CLKuWire=>CLKuWire,LEuWire=>LEuWire,DATAuWire=>DATAuWire); end Behavioral; 2)programming_sequence (МОДУЛЬ УПРАВЛЕНИЯ И ПАМЯТИ) library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity programming_sequence is Port ( clk_20 : in STD_LOGIC; -- System clk = 20 MHz reset_n : in STD_LOGIC; -- Reset signal get_data : in STD_LOGIC; -- Change register content start_interface : out STD_LOGIC; -- Send data via SPI interface data_2write : out STD_LOGIC_VECTOR (31 downto 0); -- CDCE62005 register content sync : out STD_LOGIC; -- CDCE62005 SYNC# power_down : out STD_LOGIC); -- CDCE62005 Power Down# end programming_sequence; architecture Behavioral of programming_sequence is type statetype is (START, R0, R1, R2, R3, R4, R5, R6, R7, R8, FINISH); signal state, nextstate: statetype; signal change_state_d, change_state_q: std_logic; -- Change state trigger begin power_down <= '1'; --State register process (clk_20, reset_n) begin if reset_n = '1' then state <= START; change_state_q <= '0'; elsif rising_edge(clk_20) then state <= nextstate; change_state_q <= change_state_d; end if; end process; start_interface <= '0' when state = START else ((change_state_d xor change_state_q) and '1'); -- Next state logic process (state, get_data) begin case state is when START => -- Idle state nextstate <= R0; when R0 => -- Write Register 0 if get_data = '1' then nextstate <= R1; else nextstate <= R0; end if; when R1 => -- Write Register 1 if get_data = '1' then nextstate <= R2; else nextstate <= R1; end if; when R2 => -- Write Register 2 if get_data = '1' then nextstate <= R3; else nextstate <= R2; end if; when R3 => -- Write Register 3 if get_data = '1' then nextstate <= R4; else nextstate <= R3; end if; when R4 => -- Write Register 4 if get_data = '1' then nextstate <= R5; else nextstate <= R4; end if; when R5 => -- Write Register 5 if get_data = '1' then nextstate <= R6; else nextstate <= R5; end if; when R6 => -- Write Register 6 if get_data = '1' then nextstate <= R7; else nextstate <= R6; end if; when R7 => -- Write Register 7 if get_data = '1' then nextstate <= R8; else nextstate <= R7; end if; when R8 => -- Write Register 8 if get_data = '1' then nextstate <= FINISH; else nextstate <= R8; end if; when FINISH => -- End config nextstate <= FINISH; when others => nextstate <= START; end case; end process; -- Registered output logic process (clk_20, state) begin sync <= '0'; change_state_d <= '0'; case state is when START => data_2write <= "11111100000000000000000000000010"; change_state_d <= '0'; when R0 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '1'; when R1 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '0'; when R2 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '1'; when R3 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '0'; when R4 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '1'; when R5 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '0'; when R6 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '1'; when R7 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '0'; when R8 => data_2write <= "00000000000000000000000000000000"; change_state_d <= '1'; when FINISH => data_2write <= "00000000000000000000000000000000"; --change_state_d <= '1'; sync <= '1'; when others => data_2write <= "00000000000000000000000000000000"; change_state_d <= '0'; end case; end process; end Behavioral; 3)spi_interface (ПЕРЕДАЮЩИЙ МОДУЛЬ) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity spi_interface is Generic(CLK_DIV: integer := 2); Port ( clk_20: in STD_LOGIC; -- System clk = 20 MHz reset_n : in STD_LOGIC; -- Reset signal start_interface : in STD_LOGIC; -- Send data via SPI interface data_2write : in STD_LOGIC_VECTOR(31 downto 0); -- CDCE62005 register content get_data : out STD_LOGIC; -- Transmit complete, get a new data to interface DATAuWire : out STD_LOGIC; -- Serial Clock CLKuWire : out STD_LOGIC; -- SPI master output signal --spi_miso : in STD_LOGIC; -- SPI input signal LEuWire : out STD_LOGIC); -- Latch enable end spi_interface; architecture Behavioral of spi_interface is type statetype is (IDLE, WAIT_HALF, TRANSFER); signal state_d, state_q: statetype; signal data_d, data_q: STD_LOGIC_VECTOR(31 downto 0); -- Input data register signal CLKuWire_d, CLKuWire_q: STD_LOGIC_VECTOR(CLK_DIV - 1 downto 0); signal DATAuWire_d, DATAuWire_q: STD_LOGIC; -- Shift Out SPI data signal ctr_d, ctr_q: STD_LOGIC_VECTOR(4 downto 0); -- Bit Counter signal get_data_d, get_data_q: STD_LOGIC; -- Transmit complete begin -- Output signal assigment DATAuWire <= DATAuWire_q; LEuWire <= '1' when state_q = IDLE else '0'; get_data <= get_data_q; -- State register, and memory system process(clk_20, reset_n) begin if reset_n = '1' then state_q <= IDLE; data_q <= "11111100000000000000000000000010"; CLKuWire_q <= "00"; DATAuWire_q <= '0'; ctr_q <= "00000"; get_data_q <= '0'; elsif rising_edge(clk_20) then state_q <= state_d; data_q <= data_d; CLKuWire_q <= CLKuWire_d; DATAuWire_q <= DATAuWire_d; ctr_q <= ctr_d; get_data_q <= get_data_d; end if; end process; --Next state logic process(state_q, start_interface, CLKuWire_q, ctr_q) begin state_d <= state_q; data_d <= data_q; CLKuWire_d <= CLKuWire_q; DATAuWire_d <= DATAuWire_q; ctr_d <= ctr_q; get_data_d <= get_data_q; case state_q is when IDLE => CLKuWire_d <= "00"; -- Reset Clock counter ctr_d <= "00000"; -- Reset Bit counter if start_interface = '1' then -- If Start signal is active data_d <= data_2write; -- Load data to register state_d <= WAIT_HALF; -- Change state on next else state_d <= IDLE; -- Else stay in current state end if; when WAIT_HALF => CLKuWire_d <= CLKuWire_q + 1; -- Increment clock counter if (CLKuWire_q = "01") then -- If clock counter if half_full (about to fall) CLKuWire_d <= "00"; -- Reset to 0 state_d <= TRANSFER; -- Change state else state_d <= WAIT_HALF; -- Else stay in current state end if; when TRANSFER => CLKuWire_d <= CLKuWire_q + 1; -- Increment clock counter if (CLKuWire_q = "00") then -- If Clock counter is o DATAuWire_d <= data_q(31); -- Shift out MSB data elsif (CLKuWire_q = "01") then -- Else if it's half full(about to fall) data_d <= (data_q(30 downto 0) & '0'); -- Shift in zero elsif (CLKuWire_q = "11") then -- Else if it's full(about to rise) ctr_d <= ctr_q + 1; -- Increment bit counter if (ctr_q = "11111") then -- If we are on the last bit state_d <= IDLE; get_data_d <= '1'; else state_d <= TRANSFER; -- Else stay in current state end if; end if; when others => state_d <= IDLE; end case; end process; process (clk_20) begin if rising_edge(clk_20) then case state_q is when others => CLKuWire <= '0'; end case; end if; end process; end Behavioral; RTL ВОТ ТАКИЕ СИГНАЛЫ Я ДОЛЖЕН ПОЛУЧИТЬ А ВОТ И МОЙ ТЕСТБЕНЧ library IEEE; use IEEE.Std_logic_1164.all; use IEEE.Numeric_Std.all; entity TOP_tb is end; architecture bench of TOP_tb is component TOP Port ( clk : in STD_LOGIC; reset: in STD_LOGIC; DATAuWire : out STD_LOGIC; CLKuWire : out STD_LOGIC; LEuWire : out STD_LOGIC ); end component; signal clk: STD_LOGIC; signal reset: STD_LOGIC; signal DATAuWire: STD_LOGIC; signal CLKuWire: STD_LOGIC; signal LEuWire: STD_LOGIC; constant PERIOD : TIME := 100 ns; constant DUTY_CYCLE : real := 0.5; constant OFFSET : time := 1 ns; begin uut: TOP port map ( clk => clk, reset => reset, DATAuWire => DATAuWire, CLKuWire => CLKuWire, LEuWire => LEuWire ); clk_gen: PROCESS BEGIN WAIT for OFFSET; CLOCK_LOOP : LOOP CLK <= '0'; WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE)); CLK <= '1'; WAIT FOR (PERIOD * DUTY_CYCLE); END LOOP CLOCK_LOOP; END PROCESS; reset<='0'; -- rst_gen: PROCESS -- BEGIN -- WAIT for OFFSET; -- reset <='1'; -- wait for period * DUTY_CYCLE *2; -- reset <='0'; -- wait; -- END PROCESS; end;
  4. Кто-нибудь работал с таким. Буду благодарен, если у кого есть VHDL описание такого устройства, ибо сам пока не разобрался, как его описывать.
  5. Компонент антидребезга добавил.Промоделировал.Но один небольшой косяк: смещение сигнала на светодиодах на 1 период (т.е. когда отпускаю кнопку, одна лампочка успевает промигнуть (( :laughing: ОСНОВНАЯ СБОРКА library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity led_blink is port ( clk : in std_logic; -- синхросигнал btn : in std_logic; --кнопка led : out std_logic_vector(3 downto 0) --выход на светодиоды ); end led_blink; architecture rtl of led_blink is component debounce Port ( CLOCK : IN STD_LOGIC; BATON : IN STD_LOGIC; VIHOD : OUT STD_LOGIC); end component; signal ONN_OFF : std_logic := '1'; signal state : std_logic_vector(3 downto 0) := "0001"; signal divider : unsigned(23 downto 0) := (others => '0'); --делитель частоты signal btn_stable: std_logic; begin main_p : process(clk) begin if (rising_edge(clk)) then if (divider < 5000000) then ---если меньше 5 млн. тактов, то счётчик наращивает 1 divider <= divider + 1; else divider <= (others => '0');--если больше,то счётчик сбрасывается в 0 if (btn_stable = '1') then --если нажата кнопка ONN_OFF <= not(ONN_OFF);--светодиоды загораются if (ONN_OFF = '1') then state <= state(2 downto 0) & state(3); led <= state; else --если НЕ нажата led <= (others => '0');--сигнал на выход светодиодов не идёт end if; else ONN_OFF <= '1'; led <= (others => '0'); end if; end if; end if; end process; dd1: component debounce port map (CLOCK=>clk, BATON=>btn, VIHOD=>btn_stable); --подключение антидребезга end rtl; АНТИДРЕБЕЗГ LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY debounce IS GENERIC( counter_size : INTEGER := 23); --РАЗРЯДНОСТЬ СЧЁТЧИКА PORT( CLOCK : IN STD_LOGIC; BATON : IN STD_LOGIC; VIHOD : OUT STD_LOGIC); END debounce; ARCHITECTURE logic OF debounce IS SIGNAL flipflops : STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL counter_set : STD_LOGIC; --сброс синхронизации SIGNAL counter_out : STD_LOGIC_VECTOR(counter_size DOWNTO 0) := (OTHERS => '0'); --счётчик BEGIN counter_set <= flipflops(0) xor flipflops(1); --запуск или сброс счётчика PROCESS(CLOCK) BEGIN IF(CLOCK'EVENT and CLOCK = '1') THEN flipflops(0) <= BATON; flipflops(1) <= flipflops(0); If(counter_set = '1') THEN counter_out <= (OTHERS => '0'); ELSIF(counter_out(counter_size) = '0') THEN counter_out <= counter_out + 1; ELSE VIHOD <= flipflops(1); END IF; END IF; END PROCESS; END logic; ВРЕМЯНКА
  6. Возникла проблема.Есть устройство,на выходе которого 4 светодиода (led).Они поочерёдно загораются и тухнут с частотой 1Гц . К устройству подключена кнопка (btn). Когда она нажата, сигнал должен идти на светодиоды (как показано на диаграмме). Так вот, при нажатии возникает дребезг, диоды горят хаотично, при чём даже могут гореть, когда кнопка отпущена. Код вроде простой.но никак не могу правильно этот антидребезг добавить. Заранее благодарен. ВЕРХНИЙ ФАЙЛ library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity led_blink is port ( clk : in std_logic; -- синхросигнал btn : in std_logic; --кнопка led : out std_logic_vector(3 downto 0) --выход на светодиоды ); end led_blink; architecture rtl of led_blink is signal ONN_OFF : std_logic := '1'; signal state : std_logic_vector(3 downto 0) := "0001"; signal divider : unsigned(23 downto 0) := (others => '0'); --делитель частоты begin main_p : process(clk) begin if (rising_edge(clk)) then if (divider < 5000000) then ---если меньше 5 млн. тактов, то счётчик наращивает 1 divider <= divider + 1; else divider <= (others => '0');--если больше,то счётчик сбрасывается в 0 if (btn = '1') then --если нажата кнопка ONN_OFF <= not(ONN_OFF);--светодиоды загораются if (ONN_OFF = '1') then state <= state(2 downto 0) & state(3); led <= state; else --если НЕ нажата led <= (others => '0');--сигнал на выход светодиодов не идёт end if; else ONN_OFF <= '1'; led <= (others => '0'); end if; end if; end if; end process; end rtl; АНТИДРЕБЕЗГ (КОРЯВЫЙ) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Debouncer is Port ( clk : in std_logic; btn : in std_logic; led : out std_logic_vector(3 downto 0)); end Debouncer; architecture Behavioral of Debouncer is signal led : std_logic_vector (3 downto 0); signal btn_cl : std_logic; begin process (clk) begin if rising_edge(clk) then if clk /= btn_cl then btn_cl <= clk; led <= (others => '0'); elsif led = "1111" then btn <= btn_cl; else led <= led + 1; end if; end if; end process; end Behavioral; Временная диаграмма работы устройства. При загрузке в устройсво, кнопка конечно же без антидребега так идеально не работает (((
  7. ага, для меня Верилог это вообще набор иероглифов
  8. Спасибо,конечно))но принципиально важно реализовать этот проект на VHDL. (так от меня требуют)
  9. т.е если я буду инициализировать регистр в 0, то ,по идее, система должна заработать как надо?
  10. Я ПОНИМАЮ,ВЫГЛЯДИТ ОЧЕНЬ ТУПО. прост,я хочу этот проект,так сказать, модифицировать.Я VHDL изучаю всего месяц от силы. но троллинга тут нет НИКАКОГО.просто я действительно до такой степень тупой (надеюсь это временно)
  11. Блин,я наверное,уже задолбал, (( :crying: но походу "замораживать фазу" не лучшая идея,т.к моделирование показывает вообще не тот результат. ПРИ ТАКИХ ПАРАМЕТРАХ: sw <= '0' after 0 ms, '1' after 3000 ms, '0' after 6000 ms, '1'after 10000 ms; а вот так должна выглядеть времянка. т.е. до 3 сек. кнопка не нажата и светодиоды не мигают. на 3 секунде я нажал кнопку и светодиодымигают до 6 сек. потом я опять нажал кнопку и светодиоды потухли. И Т.Д.
  12. Видимо,я пока слишком туп(( library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity test_led is generic ( p_TD : time := 1 ns; p_CNT_LIM : integer := 5000000-1 ); port ( clk : in std_logic; --btn : in std_logic; --кнопка led : out std_logic_vector(7 downto 0) ); end test_led; architecture rtl of test_led is signal div_cnt_u : unsigned(22 downto 0) := (others => '0'); signal phase : std_logic := '1'; signal btn_ce : std_logic := '0'; --сигнал при нажатии кнопки signal led_reg : std_logic_vector(7 downto 0) := (0 => '1', others => '0'); begin counter_control_p: process(clk) begin if (rising_edge(clk)) then if (div_cnt_u < p_CNT_LIM) then div_cnt_u <= div_cnt_u + 1 after p_TD; else div_cnt_u <= (others => '0'); end if; else NULL; end if; end process; phase_control_p: process(clk) begin if (rising_edge(clk)) then if (div_cnt_u = p_CNT_LIM) then phase <= not(phase) after p_TD; else NULL; end if; else NULL; end if; end process; --phase_control_p led_reg_control_p: process(clk) begin if (rising_edge(clk)) then if (div_cnt_u = p_CNT_LIM) then if (phase = '1') then led_reg <= led_reg(6 downto 0) & led_reg(7) after p_TD; NULL; end if; else NULL; end if; else NULL; end if; end process; --led_reg_control_p btn_control: process(clk) -- нажатия кнопки begin if (btn_ce = '1') then btn_ce <= not(btn_ce) phase <= (others => '0'); else phase <= '1'; end if; end process; out_form_logic_p: process(phase) begin if (phase = '0') then led <= (others => '0'); else led <= led_reg; end if; end process; --out_form_logic_p end rtl;
  13. хм...по-моему,это очень хорошая идея))сейчас попробую))позже отпишусь)) :rolleyes:
×
×
  • Создать...