存儲器的設計/建模


不知道從哪本書/哪篇文章摘來的了,先mark一下:

一、隨機訪問存儲器(RAM

1)隨機訪問存儲器(RAM)概述

  ①隨機存儲器可以隨時從任何一個指定地址出數據,也可以隨時將數據寫入任何一個指定的存儲單元中,RAM的結構如下:

                                                                          

 

  ②RAM 單元根據地址總線、數據總線以及讀寫控制線的數目可以分為單口RAM、雙口RAM 兩大類。

  ·單口RAM 只有一套數據總線、地址總線和讀寫控制線,因此當多個外設需要訪問同一塊單口RAM 時,需要通過仲裁電路來判斷。

  ·雙口RAM 具有兩套完全獨立的數據線、地址線和讀寫控制線,從而實現了大量數據的高速訪問以及不同時鍾域的數據交換。

 

(2)隨機存儲器設計基礎

  ①在Verilog HDL 中,若干個相同寬度的向量構成數組,其中reg 型數組變量就代表着存儲器。例如:

        reg [7:0]  memory[1023:0];

該語句定義了1024 個字的存儲器變量memory,每個字的字長為8 位,(說白了,就是有1024個8bit寬的寄存器)經過定義后的memory 型變量可以用下面的語句對存儲器單元賦值:

        memory [7] = 90; //存儲器memory 的第7 個字被賦值為90

  ②存儲器單元中的數據也可以讀出,因此存儲器型變量相當於一個RAM。由於存儲器由邏輯資源產生,因此存儲容量越大,所需要的邏輯資源就越多。

 

(3)單口RAM 單元的實現

  ①單口RAM,只有一套地址總線,讀和寫是分開(至少不能在同一個周期內完成)。8× 8 位RAM 的設計舉例實現如下:

  ②部分信號說明:

·addm 為3 比特地址線,可以實現8 個存儲單元的尋址;

·cs_n 為片選信號,低有效,當cs_n 為低時,存儲器處於工作狀態(可以讀或寫);當cs_n 為高時,存儲器處於禁止狀態(強制輸出0)。

·we_n 為寫使能信號,低有效,當we_n為高時,存儲器處於讀狀態,否則處於寫狀態。

·dout 為存儲器的輸出端口,din 為存儲器的輸入端口。

 1 module ram_single(
 2         input clk,
 3         input [2:0] addm,
 4         input cs_n,
 5         input we_n,
 6         input [7:0] din,
 7         output reg [7:0] dout
 8 );
 9 reg [7:0] ram1[7:0];
10 always @(posedge clk) begin
11     if(cs_n)
12         dout <= 8'b0000_0000;
13     else
14         if(we_n)
15             dout <= ram1[addm];
16         else
17             ram1[addm] <= din;
18 end
19 
20 endmodule 

 

 綜合得到的電路如下所示:

 

 

4)雙口同步RAM 單元

①雙口同步RAM 具有兩套地址總線,一套用於讀數據,一套用於寫數據,二者可分別獨立操作。128× 8 位雙口RAM 的實現舉例:

②代碼如下所示:

 1 module rom_test(
 2     output reg [7:0] q,
 3     input [7:0] d,
 4     input [6:0] addr_in,
 5     input [6:0] addr_out,
 6     input we, clk1, clk2
 7 );
 8 reg [6:0] addr_out_reg;
 9 reg [7:0] mem[127:0];
10 always @(posedge clk1)begin
11     if (we)
12         mem[addr_in] <= d;
13 end
14 
15 always @(posedge clk2) begin
16     q <= mem[addr_out_reg];
17     addr_out_reg <= addr_out;
18 end
19 
20 endmodule 

 

 

 

綜合得到的電路如下所示:

 

 

二、只讀存儲器

①在數字系統中,由於ROM 掉電后數據不會丟失,對於容量不大的ROM,在Verilog HDL 中可以通過case 語句來實現。

②在應用中,case 語句中的數值可以根據實際需要修改,其中addm 為地址輸入信號,cs_n為片選信號,8× 8 位的ROM 模塊的實現:

 1 module rom_test(
 2         input clk,
 3         input [2:0] addm,
 4         input cs_n,
 5         output reg [7:0] dout
 6 );
 7 
 8 always @(posedge clk) begin
 9 if(cs_n)
10     dout <= 8'b0000_0000;
11 else
12     case(addm)
13         3'b000: dout <= 1;
14         3'b001: dout <= 2;
15         3'b010: dout <= 4;
16         3'b011: dout <= 8;
17         3'b100: dout <= 16;
18         3'b101: dout <= 32;
19         3'b110: dout <= 64;
20         3'b111: dout <= 128;
21     endcase
22 end

 

綜合得到的電路如下所示:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM