Verilog语言:还真的是人格分裂的语言
的理解不难,不会产生误解。到了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 |
verilog传奇 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)