Mô phỏng một băng ghế thử nghiệm đơn giản với lõi ROM tổng hợp


9

Tôi hoàn toàn mới đối với thế giới của FPGA và nghĩ rằng tôi sẽ bắt đầu với một dự án rất đơn giản: bộ giải mã 4 đoạn 4 bit. Phiên bản đầu tiên tôi đã viết hoàn toàn bằng VHDL (về cơ bản là một tổ hợp duy nhất select, không cần đồng hồ) và nó dường như hoạt động, nhưng tôi cũng muốn thử nghiệm các công cụ "Lõi IP" trong Xilinx ISE.

Vì vậy, hiện tại tôi đang sử dụng GUI "ISE Project Explorer" và tôi đã tạo một dự án mới với lõi ROM. Mã VHDL được tạo là:

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;

Nó được khởi tạo với những nội dung sau:

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

Nó có ba chân: clka, addradouta. Tôi cũng đã tạo một băng ghế thử nghiệm với GUI, sau đó chỉnh sửa nó một chút để nó thay đổi đầu vào sau 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;

Nhưng khi tôi chạy mô phỏng, giá trị của doutatín hiệu luôn không được xác định:

Kết quả mô phỏng

Đưa cái gì?


Chúng tôi cần mã SSROM để giúp bạn.
Brian Carlton

Đó là tập tin nào? Cái .xcogì?
Xương rồng

1
.V hoặc .vhd. .xco không phải là con người có thể đọc được.
Brian Carlton

1
Bạn có chắc chắn rằng bạn đã biên dịch thư viện cho trình giả lập của mình không? Nếu tôi nhớ chính xác, Xilinx cung cấp một công cụ cli 'xcomp' cho điều đó. Kiểm tra xem ROM của bạn có bị ràng buộc trong đầu ra giả lập hay không, coregen chỉ đơn giản cung cấp một bộ tham số cho thư viện, chứ không phải lõi thực sự có thể được mô phỏng ...
BennyBarns

1
Mã bạn đã đăng có vẻ như nó sẽ hoạt động, mặc dù tôi không thể kiểm tra nó cho bạn vì tôi hiếm khi sử dụng Xilinx (công cụ IMO Xilinx rất tệ, tôi tránh chúng). Nó tốt hơn và dễ mang theo hơn để suy ra ROM, thay vì sử dụng macro. Chỉ cần định nghĩa một mảng std_logic_vector là một hằng số. (tức là một mảng hai chiều của bit) Điều đó sẽ gợi ý ROM cho bất kỳ công cụ mô phỏng và tổng hợp hợp lý nào.
Jason Morgan

Câu trả lời:


1

Bạn nên xem các tín hiệu bên trong mô-đun SSROM bằng công cụ mô phỏng. Đôi khi nhìn vào các đầu vào bên trong khởi tạo có thể giúp chiếu sáng nơi xảy ra sự cố. Có thể một tín hiệu bạn nghĩ đã được kết nối thực sự là không.

Một điều khác để điều tra là tập tin .mif của bạn. Xilinx sử dụng tệp .mif trong mô phỏng để khởi tạo nội dung bộ nhớ để mô phỏng. Nếu bạn vô tình di chuyển hoặc xóa tệp .mif, bạn sẽ thấy kết quả như thế này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.