不知道從哪本書/哪篇文章摘來的了,先mark一下:數組
1、隨機訪問存儲器(RAM)spa
(1)隨機訪問存儲器(RAM)概述設計
①隨機存儲器能夠隨時從任何一個指定地址中讀出數據,也能夠隨時將數據寫入任何一個指定的存儲單元中,RAM的結構以下:code
②RAM 單元根據地址總線、數據總線以及讀寫控制線的數目能夠分爲單口RAM、雙口RAM 兩大類。blog
·單口RAM 只有一套數據總線、地址總線和讀寫控制線,所以當多個外設須要訪問同一塊單口RAM 時,須要經過仲裁電路來判斷。資源
·雙口RAM 具備兩套徹底獨立的數據線、地址線和讀寫控制線,從而實現了大量數據的高速訪問以及不一樣時鐘域的數據交換。input
(2)隨機存儲器設計基礎同步
①在Verilog HDL 中,若干個相同寬度的向量構成數組,其中reg 型數組變量就表明着存儲器。例如:it
reg [7:0] memory[1023:0];class
該語句定義了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
綜合獲得的電路以下所示:
2、只讀存儲器
①在數字系統中,因爲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
綜合獲得的電路以下所示: