安德鲁

[文档].艾米电子 - 寄存器,Verilog

0
阅读(2284)

对读者的假设

已经掌握:

内容

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].[逻辑实验文档连载计划]