Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Đăng ký
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
wafer.jpg

Hướng dẫn Thiết kế bộ RAM dùng verilog

Email In PDF.
[​IMG]1.Khái niệm
¤RAM viết tắt của cụm từ Random Access Memory, bộ nhớ truy cập ngẫu nhiên. ¤Thời gian đọc và ghi với các ô nhớ là như nhau, dù đang ở bất kỳ vị trí nào trên bộ nhớ, mỗi ô nhớ của RAM đều có một địa chỉ. ¤Thông thường mỗi ô nhớ là một Byte. ¤RAM có cơ chế đọc ghi dữ liệu hoàn toàn khác với băng, đĩa có cơ chế đọc ghi tuần tự. ¤RAM khác với ROM là bộ nhớ chỉ đọc.
2, Phân loại.
- Single port RAM là RAM chỉ có một kênh đọc và ghi, một đường vào địa chỉ, các
động tác đọc ghi trên kênh này chỉ có thể thực hiện lần lượt.
- Dual-port RAM là RAM có hai kênh đọc ghi riêng biệt tương ứng hai kênh địa chỉ, các kênh đọc ghi này có thể dùng chung xung nhịp đồng bộ cũng có thể không dung chung. Đối với Dual-port RAM có thể đọc và ghi đồng thời trên hai kênh.
- Synchronous RAM - RAM đồng bộ là RAM thực hiện thao tác đọc hoặc ghi đồng bộ.
- Asynchronous RAM- RAM không đồng bộ là RAM thực hiện thao tác đọc hoặc ghi
không đồng bộ, thời gian kể từ khi có các tín hiệu yêu cầu đọc ghi cho tới khi thao tác thực hiện xong thuần túy là trễ tổ hợp.
[​IMG]
-- Khối RAM có 2 thành phần chính là khối giải mã địa chỉ và dãy các thanh ghi, khối giải mã địa chỉ sẽ đọc địa chỉ và quyết định sẽ truy cập tới vị trí thanh ghi nào để thực hiện thao tác đọc hoặc ghi. Kích thước của khối RAM thường được ký hiệu là Mx N-bit trong đó M là số lượng thanh ghi, N là số bit trên 1 thanh ghi. Ví dụ 128 x 8 bit là khối RAM gồm 128 thanh ghi, mỗi thanh ghi 8 bit. Số bit cần thiết cho kênh địa chỉ là ADDR_WIDTH = [log2 M], nếu M = 128 nên số ADDR_WIDTH = 7. (COPY SÁCH ^_^ ) .
Single Port RAM Synchronous Read/Write
MÃ:
module ram_sp_sr_sw (    clk         , // Clock Input   address     , // Address Input   data        , // Data bi-directional   cs          , // tín hiệu điều khiển cho phép đọc và ghi   we          , // Write Enable/Read Enable   oe            // Output Enable   );   parameter DATA_WIDTH = 8 ;   parameter ADDR_WIDTH = 8 ;   parameter RAM_DEPTH = 1 << ADDR_WIDTH;   //--------------Input Ports-----------------------   input                  clk         ;   input [ADDR_WIDTH-1:0] address     ;   input                  cs          ;   input                  we          ;   input                  oe          ;    //--------------Inout Ports-----------------------   inout [DATA_WIDTH-1:0]  data       ;    //--------------Internal variables----------------   reg [DATA_WIDTH-1:0] data_out ;   reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];     //--------------Code Starts Here------------------    // Tri-State Buffer control   // output : When we = 0, oe = 1, cs = 1 assign data = (cs && oe &&  ! we) ? data_out : 8'bz;    // Memory Write Block   // Write Operation : When we = 1, cs = 1   always @ (posedge clk) begin : MEM_WRITE     if ( cs && we ) begin          mem[address] = data;      end   end    // Memory Read Block   // Read Operation : When we = 0, oe = 1, cs = 1   always @ (posedge clk)   begin : MEM_READ     if (cs &&  ! we && oe) begin       data_out = mem[address];     end else ;   end   endmodule 
Dual Port RAM Synchronous Read/Write
MÃ:
module ram_dp_sr_sw (    clk       , // Clock Input    address_0 , // address_0 Input   data_0    , // data_0 bi-directional   cs_0      , // Chip Select   we_0      , // Write Enable/Read Enable   oe_0      , // Output Enable address_1 , // address_1 Input   data_1    , // data_1 bi-directional   cs_1      , // Chip Select   we_1      , // Write Enable/Read Enable   oe_1        // Output Enable   );   parameter data_0_WIDTH = 8 ;   parameter ADDR_WIDTH = 8 ;   parameter RAM_DEPTH = 1 << ADDR_WIDTH;    //--------------Input Ports-----------------------   input [ADDR_WIDTH-1:0] address_0 ;   input cs_0 ;   input we_0 ;   input oe_0 ;   input [ADDR_WIDTH-1:0] address_1 ;   input cs_1 ;   input we_1 ;   input oe_1 ;    //--------------Inout Ports-----------------------   inout [data_0_WIDTH-1:0] data_0 ;   inout [data_0_WIDTH-1:0] data_1 ;    //--------------Internal variables----------------   reg [data_0_WIDTH-1:0] data_0_out ;   reg [data_0_WIDTH-1:0] data_1_out ;   reg [data_0_WIDTH-1:0] mem [0:RAM_DEPTH-1];   //--------------Code Starts Here------------------   // Memory Write Block   // Write Operation : When we_0 = 1, cs_0 = 1   always @ (posedge clk)   begin : MEM_WRITE     if ( cs_0 && we_0 ) begin        mem[address_0] <= data_0;     end else if (cs_1 && we_1) begin        mem[address_1] <= data_1;     end   end    // Tri-State Buffer control   // output : When we_0 = 0, oe_0 = 1, cs_0 = 1   assign data_0 = (cs_0 && oe_0 &&  ! we_0) ? data_0_out : 8'bz;    // Memory Read Block   // Read Operation : When we_0 = 0, oe_0 = 1, cs_0 = 1   always @ (posedge clk)   begin : MEM_READ_0     if (cs_0 &&  ! we_0 && oe_0) begin      data_0_out <= mem[address_0];     end else begin       data_0_out <= 0;     end    end    //Second Port of RAM   // Tri-State Buffer control   // output : When we_0 = 0, oe_0 = 1, cs_0 = 1   assign data_1 = (cs_1 && oe_1 &&  ! we_1) ? data_1_out : 8'bz;   // Memory Read Block 1   // Read Operation : When we_1 = 0, oe_1 = 1, cs_1 = 1   always @ (posedge clk)   begin : MEM_READ_1     if (cs_1 &&  ! we_1 && oe_1) begin       data_1_out <= mem[address_1];     end else begin       data_1_out <= 0;     end end   endmodule


-- Các tín hiệu điều khiển thao tác đối với RAM bao gồm CS – chip select, với mọi
thao tác thì đều yêu cầu CS phải ở mức cao. WE – write enable bằng 1 nếu cần ghi dữ liệu vào RAM. Tín hiệu OE – output enable bằng 1 nếu là đọc dữ liệu từ RAM, với thiết kế như vậy thì WE và OE không bao giờ đồng thời bằng 1.
3,Một số ví dụ khác.
128 x 8-bit synchronous single-port RAM with common read and write addresses:
MÃ:
module ram_single(q, a, d, we, clk);     output[7:0] q;    input [7:0] d;    input [6:0] a;    input we, clk;    reg [7:0] mem [127:0];     always @(posedge clk) begin         if (we)             mem[a] <= d;         q <= mem[a];    end endmodule
Simple dual-port RAM:
MÃ:
module bram_tdp #( parameter DATA = 72, parameter ADDR = 10 ) ( // Port A input  wire  a_clk, input  wire  a_wr, input  wire  [ADDR-1:0]  a_addr, input  wire  [DATA-1:0]  a_din, output  reg  [DATA-1:0]  a_dout, // Port B input  wire  b_clk, input  wire  b_wr, input  wire  [ADDR-1:0]  b_addr, input  wire  [DATA-1:0]  b_din, output  reg  [DATA-1:0]  b_dout );  // Shared memory reg [DATA-1:0] mem [(2**ADDR)-1:0];  // Port A always @(posedge a_clk) begin a_dout  <= mem[a_addr]; if(a_wr) begin a_dout  <= a_din; mem[a_addr] <= a_din; end end  // Port B
always @(posedge b_clk) begin
 
    Bạn có đam mê ngành thiết kế vi mạch 

      Liên hệ đăng ký tham gia Hội Thảo & Khóa Học Thiết Kế Vi Mạch

                                      HotLine: 0972 800 931 Ms Duyên
 

Related Articles

Chat Zalo