การจำลองม้านั่งทดสอบอย่างง่ายด้วยแกน ROM สังเคราะห์


9

ฉันใหม่กับโลกของ FPGA อย่างสมบูรณ์และคิดว่าฉันจะเริ่มต้นด้วยโครงการที่ง่ายมาก: ตัวถอดรหัส 7 บิตแบบ 4 บิต รุ่นแรกที่ฉันเขียนอย่างหมดจดใน VHDL (โดยทั่วไปเป็น combinatorial เดียวselectไม่จำเป็นต้องใช้นาฬิกา) และดูเหมือนว่าจะทำงานได้ แต่ฉันก็อยากจะทดลองกับ "IP Cores" ใน Xilinx ISE

ดังนั้นตอนนี้ฉันใช้ GUI "ISE Project Explorer" และฉันสร้างโครงการใหม่ด้วย ROM core รหัส 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 เพื่อช่วยคุณ
Brian Carlton

ไฟล์ประเภทใด .xco?
กระบองเพชร

1
. v หรือ. vhd .xco ไม่ใช่มนุษย์ที่อ่านได้
Brian Carlton

1
คุณแน่ใจหรือว่าคุณรวบรวมไลบรารีสำหรับโปรแกรมจำลองของคุณ ถ้าฉันจำได้อย่างถูกต้อง Xilinx ให้เครื่องมือ cli 'xcomp' สำหรับสิ่งนั้น ตรวจสอบว่ารอมของคุณคือไม่ได้ผูกไว้ในการส่งออกจำลองหลังจากทั้งหมด coregen เพียงแค่มอบชุดของพารามิเตอร์สำหรับห้องสมุดไม่ได้เป็นหลักที่เกิดขึ้นจริงซึ่งสามารถจำลอง ...
BennyBarns

1
รหัสที่คุณโพสต์ดูเหมือนจะใช้ได้แม้ว่าฉันจะไม่สามารถทดสอบให้คุณได้เพราะฉันไม่ค่อยได้ใช้ Xilinx (เครื่องมือ IMO Xilinx แย่มากฉันหลีกเลี่ยงพวกมัน) เป็นการดีกว่าและพกพาได้มากกว่าในการอนุมาน ROM แทนที่จะใช้แมโคร เพียงแค่กำหนดอาร์เรย์ของ std_logic_vectors ให้เป็นค่าคงที่ (เช่นอาร์เรย์สองมิติของบิต) ซึ่งจะแนะนำ ROM ให้กับเครื่องมือการสังเคราะห์และการจำลองที่เหมาะสม
เจสันมอร์แกน

คำตอบ:


1

คุณควรดูสัญญาณภายในโมดูล SSROM โดยใช้เครื่องมือจำลอง บางครั้งการดูอินพุตภายในอินสแตนซ์สามารถช่วยให้แสงสว่างในที่ที่เกิดปัญหาได้ บางทีสัญญาณที่คุณคิดว่าเชื่อมต่อจริง ๆ แล้วไม่ใช่

สิ่งที่จะตรวจสอบก็คือไฟล์. mif ของคุณ Xilinx ใช้ไฟล์. mif ในแบบจำลองเพื่อเริ่มต้นเนื้อหาหน่วยความจำสำหรับการจำลอง หากคุณย้ายหรือลบไฟล์. mif โดยไม่ตั้งใจคุณจะเห็นผลลัพธ์เช่นนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.