Verilog HDL高级程序设计举例.ppt
(2)ROM的VerilogHDL描述ROM即只读存储器,是一种只能读出事先存储的数据的存储器,其特性是存入数据无法改变,也就是说这种存储器只能读不能写。由于ROM在断电之后数据不会丢失,所以通常用在不需经常变更资料的电子或电脑系统中,资料并不会因为电源关闭而消失。modulerom(dout,clk,addm,cs_n);inputclk,cs_n;input[2:0]addm; output[7:0]dout;reg[7:0]dout;reg[7:0]rom[7:0];initialbegin rom[0]=8b0000_0000;rom[1]=8b0000_0001;rom[2]=8b0000_0010;rom[3]=8b0000_0011;rom[4]=8b0000_0100;rom[5]=8b0000_0101; rom[6]=8b0000_0110; rom[7]=8b0000_0111; endalways@(posedgeclk)begin if(cs_n) dout=8bzzzz_zzzz;else dout=rom[addm];endendmodulemodulerom_tb;regclk,cs_n;reg[2:0]addm;wire[7:0]dout;romU1(.dout(dout),.clk(clk),.addm(addm),.cs_n(cs_n));initialbeginclk=0;addm=0;cs_n=0;endalways#10clk=~clk;initialbegin repeat(7) #20addm=addm+1;endendmodule6.2.6FIFO设计FIFO(FirstInFirstOut)是一种先进先出的数据缓存器,通常用于接口电路的数据缓存。与普通存储器的区别是没有外部读写地址线,可以使用两个时钟分别进行写和读操作。FIFO只能顺序写入数据和顺序读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。FIFO由存储器块和对数据进出FIFO的通道进行管理的控制器构成,每次只对一个寄存器提供存取操作,而不是对整个寄存器阵列进行。FIFO有两个地址指针,一个用于将数据写入下一个可用的存储单元,一个用于读取下一个未读存储单元的操作。读写数据必须一次进行。其读写过程如下图所示:当一个堆栈为空时(图A),读数据指针和写数据指针都指向第一个存储单元,如所示;当写入一个数据时(图B)写数据指针将指向下个存储单元;经过七次写数据操作后(图C)写指针将指向最后一个数据单元;当经过连续八次写操作之后写指针将回到首单元并且显示堆栈状态为满(图D)。数据的读操作和写操作相似,当读出一个数据时,读数据指针将移向下一个存储单元,直到读出全部的数据,此时读指针回到首单元,堆栈状态显示为空。一个FIFO的组成一般包括两个部分:地址控制部分和存储数据的RAM部分。如下图所示。地址控制部分可以根据读写指令生成RAM地址。RAM用于存储堆栈数据,并根据控制部分生成的地址信号进行数据的存储和读取操作。这里的RAM采用的是前面提到的双口RAM。例:用VerilogHDL设计深度为8,位宽为8的FIFO//顶层模块:moduleFIFO_buffer(clk,rst,write_to_stack,read_from_stack,Data_in,Data_out);inputclk,rst;inputwrite_to_stack,read_from_stack;input[7:0]Data_in;output[7:0]Data_out;wire[7:0]Data_out;wirestack_full,stack_empty;wire[2:0]addr_in,addr_out;FIFO_controlU1(.stack_full(stack_full),.stack_empty(stack_empty),.write_to_stack(write_to_stack),.write_ptr(addr_in