Моделювання простого тестового стенду із синтезованим ядром ROM


9

Я абсолютно новачок у світі FPGA і подумав, що розпочну з дуже простого проекту: 4-розрядного 7-сегментного декодера. Першу версію я написав виключно у VHDL (це в основному єдиний комбінаторний select, не потрібні годинники) і, здається, працює, але я також хотів би експериментувати з матеріалами "IP Core" в 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 надає для цього інструмент cli 'xcomp'. Перевірте, чи ваш ROM не пов'язаний у виході симулятора, адже Coregen просто доставляє набір параметрів для бібліотеки, а не власне ядро, яке можна імітувати ...
BennyBarns

1
Код, який ви опублікували, схоже, що він повинен працювати, хоча я не можу його перевірити, оскільки я рідко використовую Xilinx (інструменти IMO Xilinx погані, я їх уникаю). Набагато краще і портативніше робити висновок ПЗУ, а не використовувати макрос. Просто визначте масив std_logic_vectors для постійної. (тобто двовимірний масив бітів), який підкаже ПЗУ до будь-якого гідного інструменту синтезу та моделювання.
Джейсон Морган

Відповіді:


1

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

Інша річ, щоб вивчити ваш файл .mif. Xilinx використовує .mif-файл у симуляціях для ініціалізації вмісту пам'яті для моделювання. Якщо ви ненароком перемістили або видалили файл .mif, ви побачите такі результати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.