0
点赞
收藏
分享

微信扫一扫

Verilog数字设计基础(3)

Java旺 2022-05-01 阅读 63

文章目录


《Verilog数字系统设计教程》第4版——夏宇闻


一、条件语句

- if_else语句
条件语句必须在过程块语句中使用,所谓过程块语句是指由initial和always语句引导的执行语句集合,除这两种块语句引导的begin end块中可以编写条件语句外,模块中的其他地方都不能编写。
- case语句
case语句是一种多分支选择语句,Verilog HDL针对电路的特性提供了case语句的其他两种形式,即casez和casex,这可用来处理比较过程中的不必多虑的情况。其中casez用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。

使用条件语句不当在设计中会生成原本没想到有的锁存器,为避免这一现象发生,如果用到if语句,最好写上else项,如果用case语句,最好写上default项,遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时增加了verilog程序的可读性。

使用case语句实现四选一多路选择器:

module mux4_to_1(out,i0,i1,i2,i3,s1,s0);
output out;
input i0,i1,i2,i3;
input s1,s0;
reg out;
always @(s1 or s0 or i0 or i1 or i2 or i3)
begin
	case({s1,s0})
		2'b00:out = i0;
		2'b01:out = i1;
		2'b10:out = i2;
		2'b11:out = i3;
	default:out = 1'bx;
end
endmodule

二、循环语句

- forever语句
连续的执行语句,forever循环语句常用于产生周期性的波形,用来作为仿真测试信号,它与always语句不同之处在于不能独立写在程序块中,而必须写在initial块中。
- repeat语句
连续执行一条语句n次,使用repeat循环语句及加法和移位操作来实现一个乘法器代码如下:

parameter size = 8,longsize = 16;
reg[size:1] opa,opb;
reg[longsize:1] result;
	begin:mult
		reg[longsize:1] shift_opa,shift_opb;
		shift_opa = opa;
		shift_opb = opb;
		result = 0;
		repeat(size)
			begin
				if(shift_opb[1])
					result = result + shift_opa;
				shift_opa = shift_opa<<1;
				shift_opb = shift_opb>>1;
			end
		end

- while语句
执行一条语句直到某个条件不满足,如果一开始条件即不满足,则语句一次也不能被执行。使用while循环语句对rega这个八位二进制数中值为1的位进行计数,代码如下:

begin: countls
	reg[7:0] tempreg;
	count = 0;
	tempreg = rega;
	while(tempreg)
		begin
			if(tempreg[0]) count = count+1;
			tempreg = tempreg>>1;
		end
end

- for语句
用for循环语句实现repeat语句的乘法器

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)
			if(opb[bindex])
				result = result + (opa<<(bindex - 1));
end

三、顺序块和并行块

块语句的作用是将多条语句合并成一组,使它们像一条语句那样。块语句包括两种类型:顺序块和并行块。
- 顺序块(过程块)
关键字begin_end用于将多条语句组成顺序块,顺序块具有以下特点:
(1)顺序块中的语句是一条接一条按顺序执行的,只有前面的语句执行完成之后才能执行后面的语句(除了带有内嵌延迟控制的非阻塞赋值语句)。
(2)如果语句包括延迟或事件控制,那么延迟总是相对前面那条语句执行完成的仿真时间的。
- 并行块
并行块由关键字fork_join声明,并行块具有以下特点:
(1)并行块内的语句并发执行;
(2)语句执行的顺序是由各自语句内延迟或事件控制决定的;
(3)语句中的延迟或事件控制是相对于块语句开始执行的时刻而言的。

块语句有三个特点:嵌套块、命名块、命名块的禁用。块可以嵌套使用,顺序块和并行块能够混合在一起使用;块可以具有自己的名字,称为命名块;verilog通过关键字disable提供了一种中止命名块执行的方法,disable可以用来从循环中退出、处理错误条件以及根据控制信号来控制某些代码段是否被执行。

四、生成块

生成语句可以动态地生成verilog代码,这一声明语句方便了参数化模块的生成。生成语句能够控制变量的声明、任务或函数的调用,还能对实例引用进行全面的控制。编写代码时必须在模块声明中说明生成的实例范围,关键字generate_endgenerate用来指定该范围。
生成实例可以是以下的一个或多种类型:
(1)模块;
(2)用户定义原语;
(3)门级原语;
(4)连续赋值语句;
(5)initial和always块。
对两个N位总线变量进行按位异或,代码如下:

module bitwise_xor(out,i0,i1);
parameter N = 32;
output[N-1:0] out;
input[N-1:0] i0,i1;
genvar j;
generate
	for(j=0;j<N;j=j+1)
		begin:xor_loop
			xor g1(out[j],i0[j],i1[j]);
		end
endgenerate
endmodule

五、举例

- 四选一多路选择器

module mux4_to_1(out,i0,i1,i2,i3,s1,s0);
output out;
input i0,i1,i2,i3;
input s1,s0;
reg out;
always @(s1 or s0 or i0 or i1 or i2 or i3)
begin
	case({s1,s0})
	2'b00:out = i0;
	2'b01:out = i1;
	2'b10:out = i2;
	2'b11:out = i3;
	default: out = 1'bx;
	endcase
end
endmodule

- 四位计数器

module counter(Q,clock,clear);
output[3:0] Q;
input clock,clear;
reg[3:0] Q;
always @(posedge clear or negedge clock)
begin
	if(clear)
		Q <= 4'd0;
	else
		Q <= Q + 1;
end
endmodule

举报

相关推荐

0 条评论