संश्लेषित रोम कोर के साथ एक साधारण परीक्षण बेंच का अनुकरण


9

मैं FPGA की दुनिया के लिए पूरी तरह से नया हूं और सोचा था कि मैं एक बहुत ही सरल परियोजना के साथ शुरू करूंगा: एक 4-बिट 7-खंड डिकोडर। पहला संस्करण जो मैंने विशुद्ध रूप से वीएचडीएल में लिखा था (यह मूल रूप से एक एकल दहनशील select, आवश्यक घड़ियां नहीं है) और यह काम करने लगता है, लेकिन मैं एक्सिलिनक्स आईएसई में "आईपी कोर" सामान के साथ प्रयोग करना चाहूंगा।

तो अब मैं "ISE प्रोजेक्ट एक्सप्लोरर" GUI का उपयोग कर रहा हूं, और मैंने 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। मैंने GUI के साथ एक परीक्षण बेंच भी बनाई है, फिर इसे थोड़ा संपादित किया ताकि यह 100 ns के बाद इनपुट को बदल दे:

   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 उपकरण खराब हैं, मैं उनसे बचता हूं)। यह एक मैक्रो का उपयोग करने के बजाय एक ROM का अनुमान लगाने के लिए बहुत बेहतर और अधिक पोर्टेबल है। बस एक स्थिर होने के लिए std_logic_vectors की एक सरणी को परिभाषित करें। (यानी बिट्स के एक दो आयामी सरणी) जो किसी भी सभ्य संश्लेषण और सिमुलेशन उपकरण के लिए एक ROM का सुझाव देगा।
जेसन मॉर्गन

जवाबों:


1

आपको सिमुलेशन उपकरण का उपयोग करके SSROM मॉड्यूल के अंदर संकेतों को देखना चाहिए। कभी-कभी तात्कालिक के अंदर के इनपुट को देखने से समस्या को दूर करने में मदद मिल सकती है। हो सकता है कि आपके द्वारा सोचा गया संकेत वास्तव में जुड़ा हो।

जांच करने के लिए एक और चीज आपकी .mif फ़ाइल है। सिमुलेशन के लिए मेमोरी सामग्री को इनिशियलाइज़ करने के लिए Xilinx सिमुलेशन में एक .mif फ़ाइल का उपयोग करता है। यदि आपने अनजाने में .mif फ़ाइल को स्थानांतरित या हटा दिया है, तो आपको इस तरह के परिणाम दिखाई देंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.