e-works数字化企业网  »  文章频道  »  产品创新数字化(PLM)  »  EDA

2011产品创新数字化峰会征文:基于Quartu和Verilog Hdl的四位通用移位寄存器设计与仿真

2011/11/22    来源:e-works    作者:刘涛      
关键字:Verilog HDL  四位通用移位寄存器  真值表  
本文首先介绍了移位寄存器的概念特征及输入、输出工作方式,随后介绍了Verilog HDL建模的相关知识,进而给出了四位通用移位寄存器的真值表,在此基础上设计了控制程序,最后使用Quartus软件对系统进行了仿真并验证了程序的正确性,并对使用Verilog HDL进行数字系统设计进行了总结。

1 前言

    移位寄存器是指所存的代码能在移位脉冲的作用下依次位移的寄存器,它是一种可以用二进制形式保存数据的双稳器件。即能左移又能右移的寄存器称为双向移位寄存器。

    从逻辑结构上看,移位寄存器有以下两个显著特征:

    (1)移位寄存器是由相同的寄存单元所组成。一般说来,寄存单元的个数就是移位寄存器的位数。为了完成不同的移位功能,每个寄存单元的输出与其相邻的下一个寄存单元的输入之间的连接方式也不同。

    (2)所有寄存单元共用一个时钟。在公共时钟的作用下,各个寄存单元的工作是同步的。每输入一个时钟脉冲,寄存器的数据就顺序向左或向右移动一位。

    通常可按数据传输方式的不同对移位寄存器进行分类。移位寄存器的数据输入方式有串行输入和并行输入之分。串行输入就是在时钟脉冲作用下,把要输入的数据从一个输入端依次一位一位地送入寄存器;并行输入就是把输入的数据从几个输入端同时送入寄存器。在移位寄存器中,有的品种只具有串行或并行中的一种输入方式,但也有些品种同时兼有串行和并行两种输入方式。移位寄存器的输出也有串行和并行之分。串行输出就是在时钟脉冲作用下,寄存器最后一位输出端依次一位一位地输出寄存器的数据;并行输出则是寄存器的每个寄存单元均有输出。

2 通用移位寄存器Verilog建模

    2.1 Verilog建模基础

    硬件描述语言Verilog HDL类似于高级程序设计语言(如C语言等),它是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示更复杂的数字逻辑系统所完成的逻辑功能。人们还可以用HDL编写设计说明文档,这种文档易于存储和修改,适用于不同的设计人员之间进行技术交流,还能被计算机识别和处理,计算机对于HDL的处理包括两个方面:逻辑仿真和逻辑综合。

    逻辑仿真是指用计算机仿真软件对数字逻辑电路的结构和行为进行预测,仿真器对HDL描述进行解释,以文本形式或时序波形图形式给出电路的输出。在电路在实现之前,设计人员可以根据仿真结果初步判断电路的逻辑功能是否正确。在仿真期间,如果发现设计中存在错误,可以对HDL文件进行修改,直至满足设计要求为止。

    在Verilog中,行为级描述主要使用由关键词initial或always定义的两种结构类型的语句。一个模块的内部可以包括多个initial或always语句,仿真时这些语句同时并行执行,即与他们在的模块内部排列无关,都从仿真的0时刻开始。

    本设计采用always语句对4位通用移位寄存器进行行为级功能描述。Always本身是一个无限循环语句,即不停地循环执行其内部的过程语句,直到仿真过程结束。但用它来描述硬件电路的逻辑功能时,通常在always后面紧跟着循环控制条件,所以always语句的一般用法如下:

always@(事件控制表达式)

begin

块内局部变量的定义;

过程赋值语句;

end

    这里,“事件控制表达式”也称敏感事件表,即等待确定的事件发生或某一特定的条件变为“真”,它是执行后面过程赋值语句的条件。“过程赋值语句”左边的变量必须被定义成寄存器数据类型,右边变量可以是任意数据类型。begin和end将多条过程赋值语句包围起来,组成一个顺序执行语句块,块内的语句按照排列顺序依次执行,最后一条语句执行完后,执行挂起,然后always语句处于等待状态,等待下一个事件的发生。注意,begin和end之间只有一条语句,且没有定义局部变量时,则关键词begin和end可以被省略。

    在Verilog中,将逻辑电路的敏感事件分为两种类型:电平敏感事件和边沿触发事件。在组合电路中,输入信号的变化直接会导致输出信号的变化。时序电路中的锁存器输出在使能信号为高电平时未亦随输入电平变化,这种对输入信号电平变化的响应称为电平敏感事件。而触发器状态的变化仅仅发生在时钟脉冲的上升沿或下降沿。Verilog中分别用关键词posedge(上升沿)和negedge(下降沿)进行说明,这就是边沿敏感事件。

    2.2 通用寄存器Verilog 描述

    表1为本系统的真值表,本设计通过行为级描述语句always描述了一个4位通用移位寄存器,它有两个选择输入端、两个串行数据输入端、4个并行数据输入端和4个并行数据输出端4。它有5种功能:异步置零、同步置数、左移、右移和保持状态不变。当清零信号CR跳变到低电平时,寄存器的输出被异步置零;否则,当CLR=1时,与时钟信号有关的4种功能由case语句中的两个选择输入信号S1和S0决定。

    module  Shift_Register(CLK,CLR,S1,S0,LIN,RIN,D,C,B,A,QD,QC,QB,QA);

    input   CLK,CLR;

    input   S1,S0;

    input   LIN,RIN;

    input   D,C,B,A;

    output  QD,QC,QB,QA;

    reg  QD,QC,QB,QA;

    always@(posedge CLK)

    begin

    if(CLR = = 1'b0)

    {QA,QB,QC,QD} <= 4'b0;

    else

    begin

    case({S1,S0})

    2'b00   :  {QA,QB,QC,QD} <= {QA,QB,QC,QD};  

    2'b01   :  {QA,QB,QC,QD} <= {RIN,QA,QB,QC};

    2'b10   :  {QA,QB,QC,QD} <= {QB,QC,QD,LIN};

    2'b11   :  {QA,QB,QC,QD} <= {A,B,C,D};

    default  :  {QA,QB,QC,QD} <= {QA,QB,QC,QD};

    endcase

    end

    end

    endmodule

    表1 系统真值表图

系统真值表图

    在程序中定义了一个模块Shift_Register(module),在QuartusII中新建工程文件时,定义的顶层模块名需要与工程名保持一致,否则在编译时会出现错误。模块前端为基本输入输出口的设置。使用了行为级描述语言always,后跟if……else……判断语句,在循环执行过程中来根据输入信号判断做出相应的动作。其中if(CLR = = 1'b0)  {QA,QB,QC,QD} <= 4'b0;表示当CLR信号为低电平时,将四位二进制数b0000赋给QA、QB、QC、QD,即实现移位寄存器的异步清零。Case语句类似于C语言中的case语句,同样根据判断条件来选择要执行的分支语句。在case中将S1和S0拼接为2位矢量,来共同决定判断结果。

3 程序仿真

    在QuartuaII中建立shift工程,添加Verilog文件,编写源代码后,进行全编译。编译成功后,即可对定义的模块进行功能仿真。仿真步骤查看相关QuartusII书籍。本设计中,将所有定义的引脚添加入仿真环境中,对输入数据进行强制设定,运行后观察输出波形。

(S1,S0)=(0,0)时的仿真波形

    图1 (S1,S0)=(0,0)时的仿真波形

    图1为(S1,S0)=(0,0)时的仿真波形,当(S1,S0)=(0,0)时通用移位寄存器的功能为保持,在CLK0-5ns周期内,(QA,QB,QC,QD)的值为(0,0,0,0),在接下来的上升沿之后,(QA,QB,QC,QD)的值仍为(0,0,0,0),可见通用移位寄存器此时为保持功能。

    图2为(S1,S0)=(0,1)时的仿真波形,在CLK50ns-60ns周期内,(QA,QB,QC,QD)的值为(1,1,0,0),在接下来的上升沿之后,(QA,QB,QC,QD)的值仍为(0,1,1,0),可见通用移位寄存器此时为右移功能,与(S1,S0)=(0,1)时通用移位寄存器的功能为右移的设计目的相吻合。

(S1,S0)=(0,1)时的仿真波形

    图2 (S1,S0)=(0,1)时的仿真波形

(S1,S0)=(1,0)时的仿真波形

    图3 (S1,S0)=(1,0)时的仿真波形

    图3为(S1,S0)=(0,1)时的仿真波形,在CLK30ns-35ns周期内,(QA,QB,QC,QD)的值为(0,0,0,0),在接下来的上升沿之后,(QA,QB,QC,QD)的值仍为(0,0,0,1),可见通用移位寄存器此时为左移功能,与(S1,S0)=(1,0)时通用移位寄存器的功能为左移的设计目的相吻合。

(S1,S0)=(1,1)时的仿真波形

    图4 (S1,S0)=(1,1)时的仿真波形

    图4为(S1,S0)=(1,1)时的仿真波形,在CLK45ns-50ns周期内,(A,B,C,D)的值为(1,1,0,0),在接下来的上升沿之后,(QA,QB,QC,QD)的值为(1,0,0,1),可见通用移位寄存器此时为送数功能,与(S1,S0)=(1,0)时通用移位寄存器的功能为送数的设计目的相吻合。

4 结论

    通过仿真结果可知,本系统设计的基于Verilog HDL的四位通用移位寄存器程序设计目的与功能实现效果一致。采用电路原理图输入法进行设计,具有设计周期长、需要专门的设计工具、需要手工布线等缺陷,而采用Verilog输入法时,由于Verilog HDL的标准化,可以很容易地把完成得设计移植到不同厂家的不同芯片中去,并在不同规模应用时可以较容易地作修改。因为Verilog HDL所完成的设计,它的信号位数是很容易改变的,可以很容易地对它进行修改,来适应不同规模的应用。在本文逻辑设计的基础上,通过扩展I/O口可方便实现N位通用寄存器的Verilog HDL设计。

责任编辑:程玥
本文为e-works原创投稿文章,未经e-works书面许可,任何人不得复制、转载、摘编等任何方式进行使用。如已是e-works授权合作伙伴,应在授权范围内使用。e-works内容合作伙伴申请热线:editor@e-works.net.cn tel:027-87592219/20/21。
相关资料
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐