Имитация простого тестового стенда с синтезированным ядром ПЗУ

9

Я совершенно новичок в мире FPGA и думал, что начну с очень простого проекта: 4-битного 7-сегментного декодера. Первая версия, которую я написал исключительно на VHDL (это, по сути, единый комбинаторный режим select, не требующий часов), и, похоже, он работает, но я также хотел бы поэкспериментировать с материалом «IP Cores» в Xilinx ISE.

Поэтому сейчас я использую графический интерфейс ISE Project Explorer и создал новый проект с ядром ROM. Сгенерированный код VHDL:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- synthesis translate_off
LIBRARY XilinxCoreLib;
-- synthesis translate_on
ENTITY SSROM IS
  PORT (
    clka : IN STD_LOGIC;
    addra : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    douta : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
  );
END SSROM;

ARCHITECTURE SSROM_a OF SSROM IS
-- synthesis translate_off
COMPONENT wrapped_SSROM
  PORT (
    clka : IN STD_LOGIC;
    addra : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    douta : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
  );
END COMPONENT;

-- Configuration specification
  FOR ALL : wrapped_SSROM USE ENTITY XilinxCoreLib.blk_mem_gen_v7_2(behavioral)
    GENERIC MAP (
      c_addra_width => 4,
      c_addrb_width => 4,
      c_algorithm => 1,
      c_axi_id_width => 4,
      c_axi_slave_type => 0,
      c_axi_type => 1,
      c_byte_size => 9,
      c_common_clk => 0,
      c_default_data => "0",
      c_disable_warn_bhv_coll => 0,
      c_disable_warn_bhv_range => 0,
      c_enable_32bit_address => 0,
      c_family => "spartan3",
      c_has_axi_id => 0,
      c_has_ena => 0,
      c_has_enb => 0,
      c_has_injecterr => 0,
      c_has_mem_output_regs_a => 0,
      c_has_mem_output_regs_b => 0,
      c_has_mux_output_regs_a => 0,
      c_has_mux_output_regs_b => 0,
      c_has_regcea => 0,
      c_has_regceb => 0,
      c_has_rsta => 0,
      c_has_rstb => 0,
      c_has_softecc_input_regs_a => 0,
      c_has_softecc_output_regs_b => 0,
      c_init_file_name => "SSROM.mif",
      c_inita_val => "0",
      c_initb_val => "0",
      c_interface_type => 0,
      c_load_init_file => 1,
      c_mem_type => 3,
      c_mux_pipeline_stages => 0,
      c_prim_type => 1,
      c_read_depth_a => 16,
      c_read_depth_b => 16,
      c_read_width_a => 7,
      c_read_width_b => 7,
      c_rst_priority_a => "CE",
      c_rst_priority_b => "CE",
      c_rst_type => "SYNC",
      c_rstram_a => 0,
      c_rstram_b => 0,
      c_sim_collision_check => "ALL",
      c_use_byte_wea => 0,
      c_use_byte_web => 0,
      c_use_default_data => 0,
      c_use_ecc => 0,
      c_use_softecc => 0,
      c_wea_width => 1,
      c_web_width => 1,
      c_write_depth_a => 16,
      c_write_depth_b => 16,
      c_write_mode_a => "WRITE_FIRST",
      c_write_mode_b => "WRITE_FIRST",
      c_write_width_a => 7,
      c_write_width_b => 7,
      c_xdevicefamily => "spartan3e"
    );
-- synthesis translate_on
BEGIN
-- synthesis translate_off
U0 : wrapped_SSROM
  PORT MAP (
    clka => clka,
    addra => addra,
    douta => douta
  );
-- synthesis translate_on

END SSROM_a;

Это инициализируется с этим содержанием:

memory_initialization_radix=2;
memory_initialization_vector=
0000001,
1001111,
0010010,
0000110,
1001100,
0100100,
0100000,
0001111,
0000000,
0000100,
0001000,
1100000,
0110001,
1000010,
0110000,
0111000,

Он имеет три контакта: clka,addra и douta. Я также сгенерировал тестовый стенд с графическим интерфейсом, затем немного отредактировал его, чтобы он изменил ввод через 100 нс:

   uut: SSROM PORT MAP (
          clka => clk,
          addra => addra,
          douta => douta
        );

   -- Clock process definitions
   clka_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;  

      addra <= "0101";
      wait for 100 ns;

      wait;
   end process;

Но когда я запускаю симуляцию, значение douta сигнала всегда не определено:

Результат моделирования

Что дает?

Кактус
источник
Нам нужен код SSROM, чтобы помочь вам.
Брайан Карлтон
Что это за файл? .xco?
Кактус
1
.V или .vhd. .xco не читается человеком.
Брайан Карлтон
1
Вы уверены, что скомпилировали библиотеку для своего симулятора? Если я правильно помню, Xilinx предоставляет для этого инструмент «xcomp». Проверьте, не привязан ли ваш ROM к выходным данным симулятора, в конце концов, coregen просто предоставляет набор параметров для библиотеки, а не фактическое ядро, которое можно симулировать ...
BennyBarns
1
Выложенный вами код выглядит так, как будто он должен работать, хотя я не могу его протестировать, поскольку редко использую Xilinx (инструменты IMO Xilinx плохие, я их избегаю). Гораздо лучше и более переносимо выводить ПЗУ, чем использовать макрос. Просто определите массив std_logic_vectors как константу. (то есть двумерный массив битов) Это предложит ПЗУ для любого приличного инструмента синтеза и моделирования.
Джейсон Морган

Ответы:

1

Вы должны посмотреть на сигналы внутри модуля SSROM, используя инструмент моделирования. Иногда просмотр входных данных внутри экземпляра может помочь понять, где находится проблема. Может быть, сигнал, который вы думали, был подключен на самом деле нет.

Еще одна вещь, которую нужно исследовать - это ваш файл .mif. Xilinx использует файл .mif в симуляциях для инициализации содержимого памяти для симуляции. Если вы случайно переместили или удалили файл .mif, вы увидите такие результаты.

user19460
источник