2017-01-17 8 views
0

Я пишу TDC на основе метода Vernier в Vivado. Моя плата VC707 с ядром virtex 7. После того, как я закончил писать свой код vhdl, я начал симуляцию. К сожалению, я все еще изучаю fpga и vhdl, поэтому я столкнулся с одной проблемой.Имитация кода vhdl в vivado - Неинициализированный вывод

Сначала я хотел проверить свою схему ввода, поэтому я пишу простой тестовый стенд для имитации. Я генерирую короткий интервал времени, чтобы проверить эту часть TDC. После того, как я начну симуляцию, два моих выхода неинициализированы, а другие выходы не имеют смысла (должны быть высокие края, но симуляция показывает нули на выходе).

На выходных выходах должны располагаться передние кромки. Эта схема предназначена для формирования сигналов для моих кольцевых генераторов.

Мой VHDL рисунки:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity Uklad_WE is 
Port (Start : in STD_LOGIC; 
     Stop : in STD_LOGIC; 
     Reset : in STD_LOGIC; 
     Pulse_st : out STD_LOGIC; 
     Pulse_sp : out STD_LOGIC; 
     Encnt_st : out STD_LOGIC; 
     Encnt_sp : out STD_LOGIC); 
end Uklad_WE; 

architecture Behavioral of Uklad_WE is 

signal dst1_out : std_logic; 
signal dst2_out : std_logic; 
signal dsp1_out : std_logic; 
signal dsp2_out : std_logic; 
signal INV_chain_13_o : std_logic; 
signal INV_chain_15_o : std_logic; 
signal gate_cnt1_o : std_logic; 
signal gate_cnt2_o : std_logic; 
signal dcnt1_out : std_logic; 
signal dcnt2_out : std_logic; 


component ffd 
    port(
     D,CLK,R : in STD_LOGIC; 
     Q: out STD_LOGIC 
    ); 
end component; 

component ffd_set 
    port(
     D,S,CLK : in STD_LOGIC; 
     Q : out STD_LOGIC 
     ); 
    end component; 

    component INV_chain_15 
    port(
     input : in STD_LOGIC; 
     output : out STD_LOGIC; 
     cnt_sig : inout std_logic 
    ); 
    end component; 

    component INV_chain_13 
    port(
     input : in STD_LOGIC; 
     output : out STD_LOGIC; 
     cnt_sig : inout std_logic 
    ); 
    end component; 


begin 


DST1: ffd port map(
     D => '1', 
     CLK => Start, 
     R => Reset, 
     Q => dst1_out); 

DST2 : ffd_set port map(
     D => '0', 
     CLK => dst1_out, 
     S => INV_chain_13_o, 
     Q => dst2_out); 

DSP1 : ffd port map(
     D => dst1_out, 
     CLK => Stop, 
     R => Reset, 
     Q => dsp1_out); 

DSP2 : ffd_set port map(
     D => '0', 
     CLK => dsp1_out, 
     S => INV_chain_15_o, 
     Q => dsp2_out); 

DCNT1 : ffd port map(
     D => '1', 
     CLK => gate_cnt1_o, 
     R => Reset, 
     Q => dcnt1_out); 

DCNT2 : ffd port map(
     D => '1', 
     CLK => gate_cnt2_o, 
     R => Reset, 
     Q => dcnt2_out); 

INV_chain_st : INV_chain_13 port map(
     input => dst2_out, 
     output => INV_chain_13_o, 
     cnt_sig => gate_cnt1_o); 

INV_chain_sp : INV_chain_15 port map(
     input => dsp2_out, 
     output => INV_chain_15_o, 
     cnt_sig => gate_cnt2_o); 

Pulse_st <= dst2_out; 
Pulse_sp <= dsp2_out; 
Encnt_st <= dcnt1_out; 
Encnt_sp <= dcnt2_out; 


end Behavioral; 

Мой испытательный стенд:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_unsigned.ALL; 

entity symulacja_tdc_vo is 

end symulacja_tdc_vo; 

architecture Behavioral of symulacja_tdc_vo is 

component Uklad_WE 
    Port(
     Start : in STD_LOGIC; 
     Stop : in STD_LOGIC; 
     Reset : in STD_LOGIC; 
     Pulse_st : out STD_LOGIC; 
     Pulse_sp : out STD_LOGIC; 
     Encnt_st : out STD_LOGIC; 
     Encnt_sp : out STD_LOGIC); 
end component; 

--inputs 

signal Start : STD_LOGIC := '0'; 
signal Stop : STD_LOGIC := '0'; 
signal Reset : STD_LOGIC := '0'; 

--outputs 

signal Pulse_st : STD_LOGIC; 
signal Pulse_sp : STD_LOGIC; 
signal Encnt_st : STD_LOGIC; 
signal Encnt_sp : STD_LOGIC; 

begin 
    --uut 
    uut: Uklad_WE port map(

     Start => Start, 
     Stop => Stop, 
     Reset => Reset, 
     Pulse_st => Pulse_st, 
     Pulse_sp => Pulse_sp, 
     Encnt_st => Encnt_st, 
     Encnt_sp => Encnt_sp); 
    -- stimuluis process 

    stim_proc1: process 
     begin 
      Start <= not Start after 5 ps; 
      wait for 500 ps; 
    end process; 


    stim_proc2: process 
     begin 
      Stop <= not Stop after 50 ps; 
      wait for 500 ps; 
    end process; 


    stim_proc3: process 
     begin 
      wait for 250 ps; 
      Reset <= not Reset; 
      wait for 500 ps; 
    end process; 

end Behavioral; 

Компоненты Код:

FFD - Ffd со сбросом

library ieee; 
use ieee.std_logic_1164.all; 

entity ffd is 
port (
    D, CLK, R : in std_logic; 
    Q : out std_logic); 
end ffd; 

architecture Bech of ffd is 
begin 

process(CLK, R) 
    begin 
     if R = '0' then 
      Q <= '0'; 
     elsif rising_edge(CLK) then 
      Q <= D; 
     end if; 
    end process; 
end Bech; 

ffd_set - FFd с множеством

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity ffd_set is 
port ( 
    D, CLK, S : in std_logic; 
    Q : out std_logic); 
end ffd_set; 

architecture Bech of ffd_set is 
begin 

process(CLK, S) 
    begin 
     if S = '0' then 
      Q <= '1'; 
     elsif rising_edge(CLK) then 
      Q <= D; 
     end if; 
    end process; 
end Bech; 

INV_chain_13 - инверторы цепь

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity INV_chain_13 is 
Port (input : in STD_LOGIC; 
     output : out STD_LOGIC; 
     cnt_sig : inout STD_LOGIC); 
end INV_chain_13; 

architecture Behavioral of INV_chain_13 is 

    signal gate_o : std_logic_vector(12 downto 0); 
begin 

gate_o(0) <= input; 

inv_g_chain : for i in 1 to gate_o'high generate 
    gate_o(i) <= not gate_o(i-1); 
end generate; 

gate_o(1) <= cnt_sig; 
output <= gate_o(12); 

end Behavioral; 

INV_chain_15 - также инверторы цепью, только количеством и является diffrent

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity INV_chain_15 is 
Port (input : in STD_LOGIC; 
     output : out STD_LOGIC; 
     cnt_sig : inout STD_LOGIC); 
end INV_chain_15; 

architecture Behavioral of INV_chain_15 is 

    signal gate_o : std_logic_vector(14 downto 0); 
begin 

gate_o(0) <= input; 

inv_g_chain : for i in 1 to gate_o'high generate 
    gate_o(i) <= not gate_o(i-1); 
end generate; 

gate_o(1) <= cnt_sig; 
output <= gate_o(14); 

end Behavioral; 

RTL Анализ

Это схема моей конструкции

RTL form Vivado screenshot

Моделирование

И главная проблема:

Simulation screenshot

Возможно, это проблема с кодом VHDL, я еще не знаю каждое правило программирования VHDL, надеюсь, что кто-то с лучшим опытом может мне помочь.

Я думаю, что есть проблема с установкой и сбросом в ffd. Я пробую много вариантов, но ничего не помогло.

+1

Как вы моделируете задержки в цепях инвертора, необходимые для работы кольцевых генераторов? –

+0

Эти цепи не нужны, но они полезны. Их задача - сформировать длительность импульса для осцилляторов. Конечно, цепь STOP должна быть более длинной, чтобы обеспечить правильный порядок запуска генераторов. Я не знаю точно, если эта длина правильная, потому что я еще не делал измерения. Это первый прототип. – Arkady

+0

«Моделирование задержек в VHDL» может быть полезным поисковым термином –

ответ

0

Прежде всего: вы изучаете VHDL, и у вас есть Virtex-7 ??? Я программирую VHDL уже 15 лет, но часто работаю только со спартанцами ... Virtex просто слишком дорогой. Restectp.

Но так или иначе

inv_g_chain : for i in 1 to gate_o'high generate 
    gate_o(i) <= not gate_o(i-1); 
end generate; 

Что вы пытаетесь сделать здесь? Я ожидаю, что вы захотите использовать инверторы, чтобы получить некоторую задержку? Только в VHDL одновременное назначение выполняется мгновенно, поэтому оно не работает. Вы должны добавить задержку вручную. Например .:

gate_o(i) <= not gate_o(i-1) after 10 ns; 

, кстати, вы знаете, что вы могли бы использовать generics, more links иметь переменную задержки преобразователя длины цепи? Затем вы можете объединить INV_chain_13 и INV_chain_15 в одно сущность.

Тогда у вас есть несколько драйверов для одного сигнала:

gate_o(1) <= not gate_o(0); 

и

gate_o(1) <= cnt_sig; 

несколько драйверов не работает должным образом. И что случилось с cnt_sig от типа inout? <= - не двунаправленное назначение. VHDL не подходит для двунаправленных заданий, поэтому попробуйте другой подход.

Вы пытаетесь построить асинхронную систему. Это возможно, но довольно сложно. Сначала подумайте о том, чтобы сделать что-то синхронное, чтобы получить некоторый опыт ... Теперь вы пытаетесь сделать F1 на своем первом уроке вождения.

+0

Спасибо за ответ !.Это не мой совет, который я изучаю в своем университете, и у них есть ресурсы, чтобы купить его;) С тех пор я просто запускаю моделирование после внедрения и его работу, конечно, я тоже изменил код, но спасибо за вашу помощь. Я не видел таких несколько драйверов раньше. К сожалению, моя тема тезисов требовала асинхронного проектирования, поэтому мне приходится иметь дело с этим. – Arkady