XADC-тестирование моделирования вивадо - проблемы с аналоговым сигналом - PullRequest
0 голосов
/ 20 января 2019

Я закончил свой проект, который передает данные из XADC в другие компоненты, когда для UART_RXD_PIN установлено значение «1». Я использую плату BASYS3 для этого проекта. И теперь пришло время создать тестовый стенд, который имитирует сигнал ANALOG и передает его на 4 разных вывода xadc.

Я пробовал несколько примеров (в Интернете), однако они используют VERILOG вместо VHDL, и XADC не используется в качестве компонента, как в моем проекте. Я создал "supermain.vhdl", в котором top_main является компонентом, поэтому vivado может имитировать XADC для себя, однако это не работает.

Вот мой код:

entity top_main is
    Port (
        CLK              : IN  STD_LOGIC;   
        UART_TXD_pin     : IN  STD_LOGIC;
        UART_RXD_pin     : OUT STD_LOGIC
    );  
end top_main;

architecture Behavioral of top_main is

    -- COMPONENTS --
-- XADC --
COMPONENT XADC_block_input
PORT (
    di_in               : IN  STD_LOGIC_VECTOR(15 DOWNTO 0);
    daddr_in            : IN  STD_LOGIC_VECTOR(6 DOWNTO 0);
    den_in              : IN  STD_LOGIC;
    dwe_in              : IN  STD_LOGIC;
    drdy_out            : OUT STD_LOGIC;
    do_out              : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
    dclk_in             : IN  STD_LOGIC;
    vp_in               : IN  STD_LOGIC;
    vn_in               : IN  STD_LOGIC;
    reset_in            : IN  STD_LOGIC;
    ------------------------------------    
    vauxp6              : IN  STD_LOGIC;
    vauxn6              : IN  STD_LOGIC;
    vauxp7              : IN  STD_LOGIC;
    vauxn7              : IN  STD_LOGIC;
    vauxp14             : IN  STD_LOGIC;
    vauxn14             : IN  STD_LOGIC;
    vauxp15             : IN  STD_LOGIC;
    vauxn15             : IN  STD_LOGIC;
    ------------------------------------    
    channel_out         : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
    eoc_out             : OUT STD_LOGIC;
    alarm_out           : OUT STD_LOGIC;
    eos_out             : OUT STD_LOGIC;
    busy_out            : OUT STD_LOGIC
);
END COMPONENT;








type    pmod_addresses is array (0 to 3) of std_logic_vector(6 downto 0); 
constant adress_pmod        : pmod_addresses :=("0010110","0010111","0011110","0011111");   -- 6/7/14/15 -> PORTS XADC --
signal  DataValid           : STD_LOGIC;                                                    -- DATA IN VALID
signal  DataReady           : STD_LOGIC;                                                    -- DATA READY (FOR FFT)
signal  index               : INTEGER := 0;                                                 -- INDEX FOR ADC
signal  DataOut             : STD_LOGIC_VECTOR(15 DOWNTO 0);                                -- DATA ADC OUT
signal  nr_adc              : STD_LOGIC_VECTOR(6 downto 0) := adress_pmod(0);   

    -- PORT MAPS --
-- ADC --
XADC_PORT_MAP: XADC_block_input
PORT MAP (
    di_in       => X"0000",
    daddr_in    => nr_adc,
    den_in      => DataValid,
    dwe_in      => '0',
    drdy_out    => DataReady,
    do_out      => DataOut,
    dclk_in     => CLK_128MHz,
    vp_in       => '0',
    vn_in       => '0',
    reset_in    => MASTER_RESET, 
    ------------------------------------    
    vauxp6      => ADC_6P_J3,
    vauxn6      => ADC_6N_K3,
    vauxp7      => ADC_7P_M2,
    vauxn7      => ADC_7N_M1,
    vauxp14     => ADC_14P_L3,
    vauxn14     => ADC_14N_M3,
    vauxp15     => ADC_15P_N2,
    vauxn15     => ADC_15N_N1,
    ------------------------------------    
    channel_out => open,
    eoc_out     => DataValid,
    alarm_out   => open,
    eos_out     => open,
    busy_out    => open
);

-- ADC DATA FORWARDING --
p_XADC_PORT_ADDRESING: process(CLK_128MHz)
begin
    if(rising_edge(CLK_128MHz)) then
        if(DataReady = '1') then       
            case nr_adc is
                when adress_pmod(0) =>   
                    XADC_1_FIR_1 <= DataOut ;
                when adress_pmod(1) =>   
                    XADC_2_FIR_2 <= DataOut ;
                when adress_pmod(2) =>   
                    XADC_3_FIR_3 <= DataOut ;
                when adress_pmod(3) =>   
                    XADC_4_FIR_4 <= DataOut ;
                when others =>
                    XADC_1_FIR_1 <= (others=>'0'); 
                    XADC_2_FIR_2 <= (others=>'0'); 
                    XADC_3_FIR_3 <= (others=>'0'); 
                    XADC_4_FIR_4 <= (others=>'0'); 
                end case;
            if index = 0 then
                index <= 1;
            else 
                index <= 0;
            end if;
            nr_adc  <= adress_pmod(index);
        end if;
    end if;
end process p_XADC_PORT_ADDRESING;

А вот супермашина с кодом сущности и тестового стенда.

entity supermain is
     Port (
    CLK              : IN  STD_LOGIC;    
    UART_TXD_pin     : IN  STD_LOGIC;
    UART_RXD_pin     : OUT STD_LOGIC
);

end supermain;

architecture Behavioral of supermain is

component top_main
    Port (
        CLK              : IN  STD_LOGIC;   
        UART_TXD_pin     : IN  STD_LOGIC;
        UART_RXD_pin     : OUT STD_LOGIC
    );  
end component;

begin

symulacja : top_main
  PORT MAP (
    CLK                 => CLK,
    UART_TXD_pin        => UART_TXD_pin,
    UART_RXD_pin        => UART_RXD_pin
    );  



    end Behavioral;


    entity supermain_tb is
end;

architecture bench of supermain_tb is

  component supermain
       Port (
      CLK              : IN  STD_LOGIC;    
      UART_TXD_pin     : IN  STD_LOGIC;
      UART_RXD_pin     : OUT STD_LOGIC
  );
  end component;

  signal CLK: STD_LOGIC;
  signal UART_TXD_pin: STD_LOGIC;
  signal UART_RXD_pin: STD_LOGIC ;

  constant clock_period: time := 1 ms;
  signal stop_the_clock: boolean;


begin

  uut: supermain port map ( CLK          => CLK,
                            UART_TXD_pin => UART_TXD_pin,
                            UART_RXD_pin => UART_RXD_pin );

  stimulus: process
  begin
   UART_TXD_pin <= '1' after 100 ns, '0' after 100 ns;
    -- Put initialisation code here


    -- Put test bench stimulus code here
    wait;
  end process;

  clocking: process
  begin
    while not stop_the_clock loop
      CLK <= '0', '1' after clock_period / 2;
      wait for clock_period;
    end loop;
    wait;
  end process;

end;

Не могли бы вы рассказать, как имитировать сигнал ANALOG в тестовом стенде? Потому что сейчас это даже не

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Для имитации аналогового входа вам необходимо использовать файл Analog Stimulus.

В UG480 http://www.xilinx.com/support/documentation/user_guides/ug480_7Series_XADC.pdf есть пример, включающий файл Stimulus и testbench.

SIM_MONITOR_FILE => "design.txt" - имя файла данных аналогового моделирования

Вы также можете увидеть пример файла стимула в языковых шаблонах Vivado Языковой шаблон Vivado

0 голосов
/ 20 января 2019

Вы можете не подключить аналоговый сигнал к этой модели.

Не имеет значения, что вы не знаете, как генерировать аналоговый сигнал, потому что даже если вы можете сгенерировать аналоговый сигнал, модель не сможет его принять.

Например, для имитации аналогового сигнала вы можете использовать сигнал типа real.
Но тогда, чтобы принять такой аналоговый сигнал, модели потребуются входные порты типа real.

Я подозреваю, что был выбран тип порта STD_LOGIC, потому что порт типа 'real' не был бы принят инструментом синтеза.Таким образом, в этом аспекте модель имеет недостатки.Решением было бы иметь две модели: одну для моделирования и одну для синтеза.

...