Sentezlenmiş bir ROM çekirdeği ile basit bir test tezgahı simülasyonu


9

FPGA dünyasında tamamen yeniyim ve çok basit bir projeyle başlayacağımı düşündüm: 4 bit 7 segmentli bir kod çözücü. Tamamen VHDL'de yazdığım ilk sürüm (temelde tek bir kombinasyonel select, saat gerekli değil) ve işe yarıyor gibi görünüyor, ama aynı zamanda Xilinx ISE'deki "IP Cores" şeylerini denemek istiyorum.

Şimdilik "ISE Project Explorer" GUI'sini kullanıyorum ve ROM çekirdekli yeni bir proje oluşturdum. Oluşturulan VHDL kodu:

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;

Şu içeriklerle başlatıldı:

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

Bu üç pin var: clka, addrave douta. Ayrıca GUI ile bir test tezgahı oluşturdum, sonra 100 ns'den sonra girişi değiştirecek şekilde biraz düzenledim:

   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;

Ama simülasyonu çalıştırdığımda, doutasinyalin değeri her zaman tanımsızdır:

Simülasyon sonucu

Ne oluyor?


Size yardımcı olması için SSROM koduna ihtiyacımız var.
Brian Carlton

Hangi dosya bu? .xco?
Kaktüs

1
.V veya .vhd. .xco okunabilir değil.
Brian Carlton

1
Simülatörünüz için kütüphaneyi derlediğinizden emin misiniz? Doğru hatırlıyorsam, Xilinx bunun için bir klips aracı 'xcomp' sağlar. ROM'unuzun simülatör çıkışında bağlı olup olmadığını kontrol edin, sonuçta, coregen basitçe simüle edilebilecek gerçek bir çekirdek değil, bir kütüphane için bir dizi parametre sunar ...
BennyBarns

1
Gönderdiğiniz kod, nadiren Xilinx'i kullandığım için sizin için test edemesem de işe yarayacak gibi görünüyor (IMO Xilinx araçları kötü, onlardan kaçıyorum). Bir makro kullanmak yerine bir ROM çıkarmak için çok daha iyi ve daha taşınabilir. Bir sabit olarak std_logic_vectors dizisini tanımlamanız yeterlidir. (yani iki boyutlu bir bit dizisi) Bu, iyi bir sentez ve simülasyon aracına bir ROM önerecektir.
Jason Morgan

Yanıtlar:


1

Simülasyon aracını kullanarak SSROM modülünün içindeki sinyallere bakmalısınız. Bazen somutlaştırılmış örneklerin içindeki girişlere bakmak, sorunun bulunduğu yeri aydınlatmaya yardımcı olabilir. Belki bağlı olduğunu düşündüğünüz bir sinyal aslında değildir.

Araştırılacak başka bir şey .mif dosyanızdır. Xilinx, simülasyon için bellek içeriğini başlatmak üzere simülasyonlarda bir .mif dosyası kullanır. .Mif dosyasını yanlışlıkla taşıdıysanız veya sildiyseniz, bunun gibi sonuçlar görürsünüz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.