2011-10-03 34 views
17

Mã nào tốt hơn khi viết RAM?Cách mã hóa RAM tốt hơn trong Verilog

  1. gán data_out bên always khối:

    module memory(
        output reg [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
         data_out <= memory[address]; 
        end 
    
    endmodule 
    
  2. gán data_out sử dụng assign tuyên bố:

    module memory(
        output [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
        end 
    
        assign data_out = memory[address]; 
    
    endmodule 
    

Bất kỳ đề xuất?

+4

Bạn không cần 16 bit địa chỉ để truy cập 256 vị trí bộ nhớ. Bạn nên sử dụng địa chỉ 'đầu vào [7: 0];'. – toolic

Trả lời

8

Tùy thuộc vào yêu cầu của bạn.

  1. Điều này đăng ký đầu ra bộ nhớ của bạn. Nếu bạn đang tổng hợp này để cửa, bạn sẽ có thêm 16 flip-flops hơn trong trường hợp 2. Điều đó có nghĩa là bạn sử dụng một khu vực nhiều hơn một chút. Nó cũng có nghĩa là đầu ra của bạn sẽ có độ trễ truyền ít hơn so với đồng hồ so với trường hợp 2. Hơn nữa, dữ liệu đầu ra sẽ không có sẵn cho đến chu kỳ đồng hồ tiếp theo.

  2. Dữ liệu đầu ra của bạn sẽ có sẵn trong cùng chu kỳ đồng hồ như được viết, mặc dù độ trễ truyền dài hơn so với đồng hồ.

Bạn cần quyết định sử dụng dựa trên yêu cầu của mình.

Tùy chọn thứ ba là sử dụng RAM được tạo, đây là một macro khó. Điều này sẽ có lợi thế về diện tích, công suất và có thể là thời gian trên cả trường hợp 1 và 2.

5

để thêm vào câu trả lời của công cụ - nếu bạn sử dụng phương pháp đọc không đồng bộ (trường hợp 2), nó sẽ không ánh xạ tới khối RAM trong FPGA, như các khối RAM trong tất cả các kiến ​​trúc chính mà tôi biết có một đọc đồng bộ.

-1

Trong chương trình thứ hai, sẽ có lỗi biên dịch vì chúng tôi không thể 'Chỉ định' giá trị cho 'Reg'. Nó sẽ cung cấp cho một lỗi nói rằng: 'Đăng ký là bất hợp pháp ở phía bên trái của nhiệm vụ liên tục'

1

Cả hai biểu mẫu đều hợp lệ, tùy thuộc vào loại đường ống bạn muốn. Tôi luôn khuyên bạn nên làm theo hướng dẫn mã hóa RAM Xilinx - đó là một cách tốt để đảm bảo rằng mã tổng hợp thành các cấu trúc FGPA thích hợp. Ví dụ, ví dụ 1 của bạn sẽ tổng hợp thành Xilinx BRAM (nghĩa là khối Ram chuyên dụng), vì nó được đọc đồng bộ, và ví dụ 2 của bạn sẽ tổng hợp thành Ram phân phối Xilinx (vì nó không đồng bộ đọc). Ví dụ:

Xem nguyên tắc mã hóa trong tài liệu Xilinx UG901 (Hướng dẫn sử dụng Suite Vivado Design), trong phần Kỹ thuật mã hóa HDL RAM. Nó cũng có một mô tả tốt về sự khác biệt giữa đọc đồng bộ và không đồng bộ cho RAM.

Các vấn đề liên quan