Thông báo

Collapse
No announcement yet.

Hỏi về cách tạo ROM trong FPGA!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Hỏi về cách tạo ROM trong FPGA!

    Xin chào tất cả các bác.
    Em là thành viên mới của dientuvietnam.net.

    Em mới bắt đầu làm quen với FPGA khoảng 1, 2 tháng; kinh nghiệm chưa có nhiều, rất mong các bác chỉ giáo cho.

    Hiện nay em đang thiết kế một hệ thống trong đó phải sử dụng 2 con ROM và 4 con RAM nội cho các mục đích khác nhau (tất cả ROM và RAM đều nằm trong FPGA). Để tạo ra các con ROM và RAM này em sử dụng tài nguyên BRAM16 của board FPGA (đang dùng con Xilinx Spartan-3E XC3S1200E-4FG320).

    Tuy nhiên khi synthesis trên Xilinx ISE 10.1 thì nó thông báo rằng 2 con ROM chưa được assign và nó remove luôn. Còn RAM thì nó reduce kích thước đi so với thiết kế.

    ================================================== =======================
    * HDL Synthesis *
    ================================================== =======================

    Performing bidirectional port resolution...

    Synthesizing Unit <character_ROM>.
    Related source file is "Test_Top.v".
    WARNING:Xst:647 - Input <read> is never used.
    WARNING:Xst:647 - Input <p_reset> is never used.
    WARNING:Xst:653 - Signal <character> is used but never assigned. Tied to value 00000000.
    Found 8-bit register for signal <dto_tmp>.
    Summary:
    inferred 8 D-type flip-flop(s).
    Unit <character_ROM> synthesized.


    Tài nguyên BRAM16 của board FPGA đủ dùng cho tất cả các bộ nhớ trên. 2 con ROM không được khởi tạo dữ liệu trong đoạn mã Verilog (sau này sẽ dùng DATA2MEM để nạp dữ liệu cho chúng).

    Rất mong các bác chỉ cho em cách khắc phục vấn đề này (do một số nguyên nhân nên tất cả các ROM và RAM đều phải nằm trong FPGA).

    Thanks,

  • #2
    Em quên mất, dưới đây là code Verilog của module nhớ bị mất và giảm kích thước (mã Verilog của ROM và RAM khá giống nhau trừ việc ROM thì không write còn RAM thì có ).

    module character_ROM ( p_reset , m_clock , address , dti , dto , read , write );
    input p_reset, m_clock;
    reg [7:0] dto_tmp;
    reg [7:0] character [0:8191];

    input [12:0] address;
    input [7:0] dti;
    output [7:0] dto;
    input read;
    input write;
    assign dto = dto_tmp;
    always @(posedge m_clock )
    begin
    dto_tmp <= character[address];
    end
    always @(posedge m_clock)
    begin
    if (write )
    character[address] <= dti;
    end
    endmodule


    Mong các bác giúp đỡ!

    Comment


    • #3
      Tớ check thử vẫn đủ 8KB RAM mà. ( ??? )

      PS: ISE 10.1 có một vài lỗi về thuật toán tối ưu mạch khi Synthesize hay Map tuy nhiên với một mạch nhỏ thế này tớ ko nghĩ nó mắc lỗi ở đây.
      Có thể cậu ( hoặc ai đó ) đã chỉnh lại Design Goal and Stratgies của project. Thử vào check lại và tick lại vào mấy cái RAM/ROM Extraction thành YES xem sao

      Comment


      • #4
        Hix. Cám ơn bác NEO.
        Em đã thử mấy lần nhưng vẫn không được

        Đành chuyển sang dùng CoreGen của Xilinx vậy

        Comment


        • #5
          ROM trong FPGA

          Sẵn đây cho em hỏi luôn,em cũng làm đề tài có liên quan tới rom,nhưng khi tạo được rom rồi ,em ko biết làm sao để nạp chương trình vào cho rom.Các bác nào biết xin chỉ em với.thanks!!!

          Comment


          • #6
            Bạn muốn dùng blockRAM (đe làm RAM hay ROM gì cũng được) thì cach nhanh nhất là dùng language template --> Verilog --> FPGA --> device primitive .. copy and paste cai code cua nó ... nhu vậy sẽ không bị mất ...

            Không thôi nếu vẫn muốn xài giống cái code o trên thì phải thêm đoạn
            initialize
            begin
            for I=0; I <= 8192; I++
            character[I] <= I;
            end
            end
            ...
            Xong rồi đề initialize the ROM, bạn tạo file .mem ... roi add vo project ... Mình làm lâu rồi không nhớ rõ chi tiết .. bạn mò mò chắc sẽ ra ... mò mò nó cũng dzui hơn keke

            Comment


            • #7
              Nguyên văn bởi halley Xem bài viết
              Sẵn đây cho em hỏi luôn,em cũng làm đề tài có liên quan tới rom,nhưng khi tạo được rom rồi ,em ko biết làm sao để nạp chương trình vào cho rom.Các bác nào biết xin chỉ em với.thanks!!!
              Neu ban dung ROM thi ROM se duoc tao boi logic va ban khong the thay doi gia tri cua no (Read Only Memory). Con neu ban muon thay doi gia tri thi nen dung block RAM. Cho Async. ROM:

              module rom_test_mgc_rom_3_10_4 (addr, data_out
              );
              input [3:0]addr ;
              output [3:0]data_out ;

              parameter rom_id = 3;
              parameter size = 10;
              parameter width = 4;

              reg [4-1:0] mem [0:10-1];
              wire [4-1:0] data_out_t;
              // pragma attribute mem MEM_INIT_BLOCK rom_init_blk
              always@(addr) begin: rom_init_blk
              mem[0] = 4'b0001;
              mem[1] = 4'b0010;
              mem[2] = 4'b0011;
              mem[3] = 4'b0100;
              mem[4] = 4'b0101;
              mem[5] = 4'b0110;
              mem[6] = 4'b0111;
              mem[7] = 4'b1000;
              mem[8] = 4'b1001;
              mem[9] = 4'b1010;
              end

              assign data_out_t = (addr >= 0 && addr < 10) ? mem[addr] : {(4){1'bX}};
              assign data_out = data_out_t;

              endmodule

              ----
              Con cho Sync ROM:

              module rom_test_mgc_rom_sync_regout_3_10_000000 (addr, data_out, clk, s_rst, a_rst,
              en
              );
              input [3:0]addr ;
              output [3:0]data_out ;
              input [0:0]clk ;
              input [0:0]s_rst ;
              input [0:0]a_rst ;
              input [0:0]en ;

              parameter rom_id = 3;
              parameter size = 10;
              parameter width = 4;
              parameter ph_clk = 1;
              parameter ph_en = 0;
              parameter ph_a_rst = 0;
              parameter ph_s_rst = 1;
              parameter num_input_registers = 0;
              parameter num_output_registers = 1;
              parameter a_rst_used = 0;
              parameter s_rst_used = 0;
              parameter en_used = 0;

              wire [3:0] addr_f;
              wire [3:0] addr_reg [num_input_registers:0];
              genvar i;
              generate if (num_input_registers > 0)
              begin
              for( i=num_input_registers-1; i >= 1; i=i-1)
              begin: addr_reg_stage
              mgc_generic_reg #(4, ph_clk, ph_en, 0, 0, a_rst_used, s_rst_used, en_used)
              i_addr_reg (addr_reg[i-1], clk, en, 1'b1, 1'b1, addr_reg[i]);
              end
              mgc_generic_reg #(4, ph_clk, ph_en, 0, 0, a_rst_used, s_rst_used, en_used) i_addr_reg_init
              (addr, clk, en , 1'b1, 1'b1, addr_reg[0]);
              assign addr_f = addr_reg[num_input_registers-1];
              end
              else
              assign addr_f = addr;
              endgenerate


              reg [4-1:0] mem [0:10-1];
              wire [4-1:0] data_out_t;
              // pragma attribute mem MEM_INIT_BLOCK rom_init_blk
              always@(addr_f) begin: rom_init_blk
              mem[0] = 4'b0001;
              mem[1] = 4'b0010;
              mem[2] = 4'b0011;
              mem[3] = 4'b0100;
              mem[4] = 4'b0101;
              mem[5] = 4'b0110;
              mem[6] = 4'b0111;
              mem[7] = 4'b1000;
              mem[8] = 4'b1001;
              mem[9] = 4'b1010;
              end

              assign data_out_t = (addr_f >= 0 && addr_f < 10) ? mem[addr_f] : {(4){1'bX}};
              wire [3:0] data_out_reg [num_output_registers:0];
              generate if (num_output_registers > 0)
              begin
              for( i=num_output_registers-1; i >= 1; i=i-1)
              begin: data_out_reg_stage
              mgc_generic_reg #(4, ph_clk, ph_en, 0, 0, a_rst_used, s_rst_used, en_used)
              i_data_out_reg (data_out_reg[i-1], clk, en , 1'b1, 1'b1, data_out_reg[i]);
              end
              mgc_generic_reg #(4, ph_clk, ph_en, 0, 0, a_rst_used, s_rst_used, en_used) i_data_out_reg_init
              (data_out_t, clk, en , 1'b1, 1'b1, data_out_reg[0]);
              assign data_out = data_out_reg[num_output_registers-1];
              end
              else
              assign data_out = data_out_t;
              endgenerate

              endmodule
              -----

              Than ai
              Chúc một ngày vui vẻ
              Tony
              email : dientu_vip@yahoo.com

              Comment


              • #8
                Các bạn ơi giúp mình với. minh dang lam hiển thị hình ảnh *.BMP đưa lên vga. minh mới học không biết bắt đầu từ đâu.


                cảm ơn mấy bạn trước.

                Comment

                Về tác giả

                Collapse

                FPGA_newbie Tìm hiểu thêm về FPGA_newbie

                Bài viết mới nhất

                Collapse

                Đang tải...
                X