您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > Verilog实验三原理3:寄存器组原理-(1)
寄存器组工作原理一、电路基本原理寄存器的外部电路接口如下图所示,各接口功能如下:•Clk:时钟信号;•Rst:复位信号,可将所有的寄存器值复位为0.与寄存器写操作相关的信号有下面3个:•L_S:控制信号,仅当L_S值为1时,才能对寄存器进行写操作。•Wt_addr(4:0):写寄存器地址。由于Wt_addr有5位,因此共有寄存器32个。若Wt_addr(4:0)=0011,则要写入的寄存器为:register[3].•Wt_data(31:0):写入到寄存器中的数据。由于Wt_data有32位,因此寄存器数据为32位。举例:若L_S=1,Wt_addr(4:0)=0011,Wt_data(31:0)=0x12345678,则表示要将32位数据0x12345678写入到寄存器register[3]中。与寄存器读操作相关的信号有下面4个:•R_addr_A(4:0):读寄存器地址信号,指定要读取的寄存器。•rdata_A(31:0):读数据输出端口,将R_addr_A(4:0)指定的寄存器中数值读出后送至rdata_A(31:0)。•R_addr_B(4:0):读寄存器地址信号,指定要读取的寄存器。•rdata_B(31:0):读数据输出端口,将R_addr_B(4:0)指定的寄存器中数值读出后送至rdata_B(31:0)。举例:若R_addr_A(4:0)=0011,则表示读出寄存器register[3]中的32位数据,并将读出的数据输出至rdata_A(31:0)中。若register[3]中存放的数据是0x12345678,则端口rdata_A(31:0)中的值将为0x12345678。二、寄存器组Verilog编程实现(蓝色部分为verilog代码,黑色部分为注释)moduleRegs(inputclk,inputrst,//置位信号input[4:0]R_addr_A,//寄存器A读地址选择input[4:0]R_addr_B,//寄存器B读地址选择input[4:0]Wt_addr,//写地址选择input[31:0]Wt_data,//写入数据inputL_S,//载入信号output[31:0]rdata_A,//寄存器A读出数据output[31:0]rdata_B//寄存器B读出数据);//下面为verilog变量定义操作reg[31:0]register[1:31];//定义寄存器数组:数组类型为reg[31:0],也即寄存器为32位的寄存器。register[1:31]为定义的寄存器变量,总共定义了31个寄存器,分别为register[1]、register[2]、……、register[31]。integeri;//定义verilog整形i//下面为寄存器读操作assignrdata_A=(R_addr_A==0)?0:register[R_addr_A];assignrdata_B=(R_addr_B==0)?0:register[R_addr_B];//当要读取的寄存器地址为0时,直接返回数值0,因为register[0]为特殊寄存器,其数值预留为0.否则,读取对应寄存器register[R_addr_A]中的数值,并将此数值返回给数值rdata_A.//下面为寄存器复位与写操作(寄存器0为特殊寄存器,数值为0,不能被写修改)always@(posedgeclkorposedgerst)//不断询问是否写入、复位beginif(rst==1)begin//如果复位信号为1,则将register[1]、register[2]、……、register[31]全部置为0.for(i=1;i32;i=i+1)register[i]=0;//符号“=”表示将数值0输入到register中endelsebeginif((Wt_addr!=0)&&(L_S==1))//寄存器写操作,为1才可写入register[Wt_addr]=Wt_data;//将数值Wt_data写入到指定寄存器register[Wt_addr]中endendendmodule
本文标题:Verilog实验三原理3:寄存器组原理-(1)
链接地址:https://www.777doc.com/doc-5720726 .html