微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Verilog语言:还真的是人格分裂的语言

Verilog语言:还真的是人格分裂的语言

时间:06-04 来源:互联网 点击:

的理解不难,不会产生误解。到了always这里,一般其后的代码就有很多行了,一不注意就会出错。

2. 条件判断,分枝多多
“用C语言的标准评价Verilog,如同用水果的标准评价蜜饯。”,但是他们的确很多写法有类似,这是很容易误导学习者的地方。

前文书关于“? :”选择操作哪里介绍过,选择与分枝在一般系统中是不可少的。那里介绍的代码方法,显然会产生阅读困难----尤其是在条件比较多的时候。为了改善这一问题,也同时可以更加符合大家以前的习惯,这一讲书老朽给贵客介绍“if”和“case”这两位大家熟悉的陌生人。

先看眼里的代码,条件语句if的形式有如表2中的三种。其中,condition等表示选择的条件,operation等表示对应的操作。请注意,这里的表达式“选择”,目的是和电路对应,不是故意和别人不一样的哗众取宠。

表2条件语句if的格式

无分枝

单级分枝

多级分枝

形式

if (condition )

begin

operations

end

if (condition )

begin

operations_1

end

else

begin

operations_2

end

if (condition_1 )

begin

operations_1

end

else if (condition_2 )

begin

operations_2

end

else if……

……

begin

operations_m

end

对应电路

时序电路

时序电路

组合电路

时序电路

组合电路

表.2中“对应电路”一行也请施主们注意,if语句中条件的所有路径覆盖不全面,可能会产生时序电路的。对于reg类型的变量,需要满足“条件不满足的时候,保持原值”;同时,组合电路不可“自赋值”(也就是类似“a = a”的形式)。当需要“保持”的时候,纯组合电路是无法满足的。所以,综合器会引入“锁存器”。不是综合器自作主张,这是代码的要求。“天作孽犹可恕,自作孽不可活”,只能怪你自己了,哭吧!这个对应的器件是锁存器,不是这里的重点,会在以后介绍。这里要说的是:要产生组合逻辑,if的条件路径必须全覆盖。

if语句中条件的所有路径覆盖不全面,可能会产生时序电路的。这个对应的器件是锁存器,不是这里的重点,以后介绍。这里要说的是:要产生组合逻辑,if的条件路径必须全覆盖。

例3是一个单级条件语句if应用的例子,其功能是求有符号数绝对值。其中,输入为8比特有符号数,编码方式为补码;输出是输入数值的绝对值。具体算法是:

绝对值运算模块
module abs
(
input[7:0] signed_value,
output reg[6:0] result
);

//Definition for Variables in the module

//Load other module(s)

//Logical
always @(signed_value)
begin
if ( signed_value[7])
//Negative number input
begin
result = (~signed_value[6:0]) + 7h01;
end
else
//Positive number or zero input
begin
result = signed_value[6:0];
end
end

endmodule

3. 多种情况,并列判决
在条件很多的时候,用if语句来写还是很麻烦的,搞不好就是是一个条件路径覆盖不完全。这个时候,可以选择case套餐。case语句是一种多分支选择语句, Verilog语言提供的case语句直接处理多分支选择。多分支的case有三种形式,如表3所示。

表3条件语句case的形式

case

casex

casez

比较方式

敏感表达式与各项值之间的比较,是一种全等比较

如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。

casez会把z/?匹配成任意,也会把任意匹配成z/?

在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z或x,那么这些位的比较就不予考虑。

casex会把z/?x匹配成任意,也会把任意匹配成z/?/x,即直接忽略z/?/x

形式

case (variable)

costant_1:

begin

operations_1

end

costant_2:

begin

operations_2

end

……

default:

begin

operations_m

end

endcase

case (variable)

costant_1:

begin

operations_1

end

costant_2:

begin

operations_2

end

……

default:

begin

operations_m

end

endcase

case (variable)

costant_1:

begin

operations_1

end

costant_2:

begin

operations_2

end

……

default:

begin

operations_m

end

endcase

constant项

各个constant项为确定宽度的常数值,不包含x和z;

可以用“?”表示不关心该位数值

各个constant项为确定宽度的常数值,可包含x但不能包含z

各个constant项为确定宽度的常数值,可包含z但不能包含z

constant例子

3’b000:3比特宽度全0;

3’b0?0:3比特宽度第二比特不关心,其他比特为0

3’b

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top