系列文章目录
第一章 Procedures
第二章 More Verilog Features
文章目录
前言
本文章介绍了Verilog语言的一些其他特性。
一、条件三元操作符
1.理论
Verilog有一个三元条件运算符(?: ),与C语言类似
者可根据条件选择两个值之一,而无需在组合always块中使用if-then。
2.练习
给定四个无符号数,找出最小值。
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);//
// assign intermediate_result1 = compare? true: false;
wire[7:0] x,y;
assign x=(a<b)?a:b;
assign y=(c<d)?c:d;
assign min=(x<y)?x:y;
endmodule
二、减少操作符
1.理论
对于两个值之间的按位运算我们很熟悉,如果我们想要对一个向量的所有位进行操作时,编写代码很麻烦。
解决办法是使用减少操作符,
& a[3:0] // AND: a[3]&a[2]&a[1]&a[0]. Equivalent to (a[3:0] == 4'hf)
| b[3:0] // OR: b[3]|b[2]|b[1]|b[0]. Equivalent to (b[3:0] != 4'h0)
^ c[2:0] // XOR: c[2]^c[1]^c[0]
结果是产生一个输出比特,这是一个一元操作符。
2.练习
创建一个计算八位字节的奇偶校验位电路,使用偶校验。
module top_module (
input [7:0] in,
output parity);
assign parity=^in;//减少操作符
endmodule
三、更宽的门
创建一个计算100位输入的组合电路,有三个输出:
- out_and
- out_or
- out_xor
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and=∈
assign out_or=|in;
assign out_xor=^in;
endmodule
四、组合for循环:反转
给一个100位的输入向量,反转它的位顺序。
module top_module(
input [99:0] in,
output [99:0] out
);
always @(*) begin
for(integer i=0;i<100;i=i+1) begin
out[i]=in[99-i];
end
end
endmodule
五、组合for循环:计算数量
一个population count电路统计1的数量,创建一个255位输入的统计1数量的电路。
module top_module(
input [254:0] in,
output [7:0] out );
always @(*) begin
out=0;
for(integer i=0;i<255;i=i+1) begin
if(in[i]==1'b1) out=out+1;
end
end
endmodule
六、for循环:100位二进制加法器
实例化100个全加器来创建一个100位二进制串行进位加法器,加法器将两个100位数字和一个进位相加,产生一个100位和 和 进位输出。
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
genvar i;
generate
for(i=0;i<100;i=i+1) begin:fadd
if(i==0)
adder(a[0],b[0],cin,cout[0],sum[0]);
else
adder(a[i],b[i],cout[i-1],cout[i],sum[i]);
end
endgenerate
endmodule
module adder(input a,input b,input cin,output cout,output sum);
assign sum=a^b^cin;
assign cout=a*b+cin*(a+b);
endmodule
七、for循环:100数的BCD加法器
已经有一个名为bcd_fadd的BCD一位加法器,该加法器将两个BCD数字和进位相加,并产生一个和和进位。
该加法器如下所示:
module bcd_fadd {
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );
下面请实例化100个bcd_fadd模块以创建一个100位BCD串行进位加法器,您的加法器应将两个100位BCD数字和一个进位相加,产生一个100位的BCD数字和和进位结果。
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire[99:0] tempcout;
genvar i;
generate
for(i=0;i<100;i=i+1) begin :BCD_FADD
if(i==0)begin
bcd_fadd (a[3:0],b[3:0],cin,tempcout[0],sum[3:0]);
end
else
bcd_fadd (a[3+4*i:4*i],b[3+4*i:4*i],tempcout[i-1],tempcout[i],sum[3+4*i:4*i]);
end
endgenerate
assign cout=tempcout[99];
endmodule
注意:for循环在过程语句外面用作创建实例化模块,要用generate语句包括起来。
总结
以上就是Verilog的一些其他特性。
- 条件三元操作符
- 减少操作符(及其应用)
- 组合过程语句中的for循环
- 用for循环循环实例化多个模块
实例化多个模块这部分比较重要。