[文档].艾米电子 - 寄存器,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

另见

[与艾米一起学FPGA/SOPC].[逻辑实验文档连载计划]

posted @ 2010-12-09 10:50  _安德鲁  阅读(2107)  评论(0编辑  收藏  举报