[文档].艾米电子 - 寄存器,Verilog
对读者的假设
已经掌握:
内容
1 寄存器
寄存器是一组D触发器的集合,由同一时钟和复位信号控制。和D-FF一样,寄存器有可选择的异步复位信号和同步使能信号。代码也和D-FF一样,但是需要申明数组数据类型的输入和输出信号。
代码1 8位带异步复位的寄存器
module reg_asyn_rst ( // global clock and asyn reset input clk, input rst_n, // I/O interface input [7:0] d, output reg [7:0] q ); // body always@(posedge clk, negedge rst_n) if(!rst_n) q <= 0; else q <= d; endmodule
2 寄存器文件
寄存器文件是一组寄存器集合,有一个输入端口和一个或几个输出端口。写地址信号,w_addr,指定在哪里存数据;读地址信号,r_addr,指定在哪里收回数据。寄存器文件一般用于快速的、临时的数据存储。代码2所示为一个参数化的寄存器文件,其数据线宽度为B,地址线宽度为W。定义了两个参数:W指定地址线的宽度,暗示此文件中有 2^W 个字;B指定每一个字里面有多少位。
代码2 参数化的寄存器文件
module reg_file #( parameter B = 8, // width of the data bus parameter W = 2 // width of the address bus ) ( // global clock input clk, // register file interface input wr_en, input [W-1:0] w_addr, input [W-1:0] r_addr, input [B-1:0] w_data, output [B-1:0] r_data ); // signal declaration reg [B-1:0] array_reg [2**W-1:0]; // body // write operation always@(posedge clk) if(wr_en) array_reg[w_addr] <= w_data; // read operation assign r_data = array_reg[r_addr]; endmodule
第18行,我们注意到一个新的数据类型,二维的数组数据类型。此处的**,表示乘方。
reg [B-1:0] array_reg [2**W-1:0];
首先,它表示array_reg这个变量有[2**W-1:0]个元素,每个元素的数据类型为reg [B-1:0]。其次,该变量需要一个索引来访问数组中的元素,如reg_array[w_addr]。
3 FPGA芯片的存储模块
在Cyclone II FPGA中,每个LE都包括一个带异步复位和同步使能的D-FF,但是同时也带有一个4输入的LUT。如果单纯使用LE来做大量的存储工作的话,将会浪费很多LE。此时可以考虑使用内置的RAM块,比方说Cycloen II里面的M4K,或者更高级的芯片内的M9K。今后会讨论相关的问题。
参考
1 Pong P. Chu.FPGA Prototyping By Verilog Examples: Xilinx Spartan-3 Version.Wiley