文章目录
前言
本次的几道例题重点使用到了for循环和generate&for循环语句,受益匪浅
More Verilog Features
一、Conditional ternary operator
三元条件运算符:((a)?:c:b);?前是条件,条件成立将c给出,条件不成立将b给出。
- RTL代码
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);//
// assign intermediate_result1 = compare? true: false;
wire [7:0]min1;
wire [7:0]min2;
assign min1 = (a<b) ? a:b;
assign min2 = (c<d) ? c:d;
assign min = (min1<min2) ? min1:min2;
endmodule
- 仿真波形图
二、Reduction operators
在一个向量内进行所有位的位操作
- RTL代码
module top_module (
input [7:0] in,
output parity);
assign parity = ^ in[7:0];
endmodule
三、Reduction:Even wider gates
进行100位的数据的所有位操作
- RTL代码
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = & in[99:0];
assign out_or = | in[99:0];
assign out_xor = ^ in[99:0];
endmodule
- 仿真波形图
四、Combinational for-loop:Vector reversal
将输入的100位数据反转并赋给输出
- RTL代码
module top_module(
input [99:0] in,
output [99:0] out
);
integer i;
always @(*)
for(i=0;i<=99;i=i+1)
out[i] = in[99-i];
endmodule
五、Combinational for-loop:255-bit population count
统计255位数据中‘1’(高电平)的个数,并将统计的总数送到out中
- RTL代码
module top_module(
input [254:0] in,
output [7:0] out );
integer i;
always @(*)
begin
out = 1'b0;
for(i=0;i<=254;i=i+1)
begin
if(in[i])
out = out+1;
else
out = out;
end
end
endmodule
- 仿真波形图
六、Generate for-loop:100-bit binary adder
设计一个100位全加器,cin是整体进位,cout[99]是最终进位,使用generate语句
- RTL代码
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:adder
if(i==0)
assign {cout[0] , sum[0]} = a[0] + b[0] + cin;
else
assign {cout[i] , sum[i]} = a[i] + b[i] + cout[i-1];
end
endgenerate
endmodule
- 使用integer和for语句
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
integer i;
always @(*)
for(i=0;i<100;i=i+1)
begin
if(i==0)
{cout[0] , sum[0]} = a[0] + b[0] + cin;
else
{cout[i] , sum[i]} = a[i] + b[i] + cout[i-1];
end
endmodule
七、Generate for-loop:100-digit BCD adder
设计一个BCD码全加器,调用bcd_fadd实例化模块,因always块中不能调用实例化模块,因此不能使用always块和for语句的组合,只能使用generate语句
- RTL代码
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [99:0]cout_t;
genvar i;
generate
for(i=0;i<100;i=i+1)begin:bcd_fadd
if(i==0)
bcd_fadd bcd_fadd_inst(a[3:0],b[3:0],cin,cout_t[0],sum[3:0]);
else
bcd_fadd bcd_fadd_inst(a[4*i+3:4*i],b[4*i+3:4*i],cout_t[i-1],cout_t[i],sum[4*i+3:4*i]);
end
assign cout = cout_t[99];
endgenerate
endmodule