不知道从哪本书/哪篇文章摘来的了,先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
综合获得的电路以下所示: