您的位置 首页 技术

Verilog HDL根底之:其他常用句子

Verilog HDL常用的其他语句有:循环语句、结构说明语句等。

循环句子

在Verilog HDL中存在着4种类型的循环句子,用来操控履行句子的履行次数。

(1)forever:接连的履行句子。

(2)repeat:接连履行一条句子 n 次。

(3)while:履行一条句子直到某个条件不满足。假如一开端条件即不满足(为假),则句子一次也不能被履行。

(4)for经过以下3个进程来决议句子的循环履行。

① 先给操控循环次数的变量赋初值。

② 断定操控循环的表达式的值,如为假则跳出循环句子,如为真则履行指定的句子后,转到进程③。

③ 履行一条赋值句子来批改操控循环变量次数的变量的值,然后回来进程②。

下面将具体地对各种循环句子进行介绍。

1.forever句子

forever句子的格局如下:

forever 句子;

或许:

forever begin

多条句子

end

forever循环句子常用于产生周期性的波形,用来作为仿真测验信号。它与always句子不同之处在于它不能独立写在程序中,而有必要写在initial块中。

2.repeat句子

repeat句子的格局如下:

repeat(表达式) 句子;

或许:

repeat(表达式) begin

多条句子

end

在repeat句子中,其表达式一般为常量表达式。下面的比如中运用repeat循环句子及加法和移位操作来完结一个乘法器。

parameter size=8,longsize=16; //参数声明

reg [size:1] opa, opb; //寄存器声明

reg [longsize:1] result;

begin: mult //为begin_end模块定名模块名

reg [longsize:1] shift_opa, shift_opb; //寄存器声明

shift_opa = opa; //将opa、opb的值赋为shift_opa、shift_opb

shift_opb = opb;

result = 0;

repeat(size) begin //循环次数

if(shift_opb[1])

result = result + shift_opa; //加法操作

shift_opa = shift_opa 1; //左移1位

shift_opb = shift_opb >>1; //右移1位

end

end

3.while句子

while句子的格局如下:

while(表达式) 句子

或许:

while(表达式) begin

多条句子

end

下面举一个while句子的比如,该比如用while循环句子对rega这个8位二进制数中值为1的位进行计数。

begin: count1s

reg[7:0] tempreg;

count=0;

tempreg = rega;

while(tempreg) begin //当tempreg中有不为0的位时,循环履行

if(tempreg[0]) count = count + 1; //低位为1时,计数

tempreg = tempreg>>1; //不然右移1位,此刻高位用0添补

end

end

4.for句子

for句子的一般方式为:

for(表达式1;表达式2;表达式3) 句子

它的履行进程如下。

① 先求解表达式1。

② 求解表达式2,若其值为真(非0),则履行for句子中指定的内嵌句子,然后履行进程③;若为假(0),则完毕循环,转到进程⑤。

③ 若表达式为真,在履行指定的句子后,求解表达式3。

④ 转到进程②持续履行。

⑤ 履行for句子下面的句子。

for句子最简略的运用方式是很易了解的,其方式如下:

for(循环变量赋初值;循环完毕条件;循环变量增值)

履行句子

for循环句子实际上相当于选用while循环句子树立以下的循环结构:

begin

循环变量赋初值;

while(循环完毕条件) begin

履行句子

循环变量增值;

end

end

这样关于需求8条句子才干完结的一个循环操控,for循环句子只需两条即可。

下面别离举两个运用for循环句子的比如。例1用for句子来初始化memory。例2则用for循环句子来完结前面用repeat句子完结的乘法器。

例1:for句子1。

begin: init_mem

reg[7:0] tempi;

for(tempi=0;tempimemsize;tempi=tempi+1) //运用for循环句子初始化存储器

memory[tempi]=0;

end

例2:for句子2。

parameter size = 8, longsize = 16;

reg[size:1] opa, opb;

reg[longsize:1] result;

begin: mult

integer bindex;

result=0;

for( bindex=1; bindex=size; bindex=bindex+1 )//运用for循环句子完结前面的乘法器

if(opb[bindex])

result = result + (opa(bindex-1)); //加法并移位

end

在for句子中,循环变量增值表达式能够不必是一般的惯例加法或减法表达式。下面是对rega这个8位二进制数中值为1的位进行计数的另一种方法,如下所示:

begin: count1s

reg[7:0] tempreg;

count=0;

for( tempreg=rega; tempreg; tempreg=tempreg>>1 )//循环变量增值表达式运用右移操作

if(tempreg[0])

count=count+1;

end

结构阐明句子

Verilog语言中的任何进程模块都从归于以下4种结构的阐明句子。

(1)initial阐明句子。

(2)always阐明句子。

(3)task阐明句子。

(4)function阐明句子。

initial和always阐明句子在仿真的一开端即开端履行。initial句子只履行一次,always句子则是不断地重复履行,直到仿真进程完毕。在一个模块中,运用initial和always句子的次数是不受约束的。task和function句子能够在程序模块中的一处或多处调用,其具体运用方法在第4章中具体介绍。这儿只对initial和always句子加以介绍。

1.initial句子

initial句子的格局如下:

initial begin

句子1;

句子2;

……

句子n;

end

举例阐明。

例3:initial句子1。

initial begin

areg=0; //初始化寄存器areg

for(index=0; indexsize; index=index+1)

memory[index]=0; //初始化一个memory

end

在这个比如顶用initial句子在仿真开端时对各变量进行初始化。

例4:initial句子2。

initial begin

inputs = b000000; //初始时刻为0

#10 inputs = b011001; //赋值时刻为10

#10 inputs = b011011; //赋值时刻为20

#10 inputs = b011000; //赋值时刻为30

#10 inputs = b001000; //赋值时刻为40

end

从这个比如中,咱们能够看到initial句子的另一个用处,即用initial句子来生成鼓励波形作为电路的测验仿真信号。一个模块中能够有多个initial块,它们都是并行运转的。initial块常用于测验文件和虚拟模块的编写,用来产生仿真测验信号和设置信号记载等仿真环境。

2.always句子

always句子在仿真进程中是不断重复履行的,其声明格局如下:

always 时序操控> 句子>

always句子因为其不断重复履行的特性,只要和必定的时序操控结合在一起才有用。假如一个always句子没有时序操控,则这个always句子将会发成一个仿真死锁,例如:

always areg = ~areg;

这个always句子将会生成一个0推迟的无限循环跳变进程,这时会产生仿真死锁。假如加上时序操控,则这个always句子将变为一条十分有用的描绘句子,例如:

always #half_period areg = ~areg;

这个比如生成了一个周期为period(2×half_period) 的无限连续的信号波形,常用这种方法来描绘时钟信号,作为鼓励信号来测验所规划的电路。

reg[7:0] counter;

reg tick;

always @(posedge areg) begin

tick = ~tick; //tick反相

counter = counter + 1; //计数器递加

end

这个比如中,每逢areg信号的上升沿出现时,把tick信号反相,而且把counter添加1。这种时刻操控是always句子最常用的。

always 的时刻操控能够是沿触发也能够是电平触发的,能够单个信号也能够多个信号,中心需求用关键字 or 衔接,如:

always @(posedge clock or posedge reset) begin //由两个沿触发的always块

end

always @( a or b or c ) begin //由多个电平触发的always块

end

沿触发的always块常常描绘时序逻辑,假如契合,可归纳风格要求,用归纳东西主动转换为表明时序逻辑的寄存器组和门级逻辑。电平触发的always块常常用来描绘组合逻辑和带锁存器的组合逻辑,假如契合,可归纳风格要求,转换为表明组合逻辑的门级逻辑或带锁存器的组合逻辑。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/194368.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部