HDLbits day4
5、More Verilog Features
5.1、conditional ternary operator
给定四个无符号数,求最小值。无符号数可以与标准比较运算符(a < b)进行比较。使用条件运算符制作两路最小电路,然后将其中的一些组成一个四路最小电路。您可能需要一些线向量作为中间结果。
module top_module ( input [7:0] a, b, c, d, output [7:0] min);// // assign intermediate_result1 = compare? true: false; wire [7:0] w1,w2; assign w1=(a<b)?a:b; assign w2=(c<d)?c:d; assign min=(w1<w2)?w1:w2; endmodule
5.2、Reduction operators
创建一个电路,计算 8 位字节的奇偶校验位(这将向字节添加第 9 位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有 8 个数据位的 XOR。
归约运算符可以对向量的位进行 AND、OR 和 XOR,产生一位输出:
& a[3:0] // 与:a[3]&a[2]&a[1]&a[0] | b[3:0] // 或:b[3]|b[2]|b[1]|b[0] ^ c[2:0] // 异或:c[2]^c[1]^c[0]
module top_module ( input [7:0] in, output parity); assign parity = ^in[7:0]; endmodule
5.3、Reduction :Even wider gates
Build a combinational circuit with 100 inputs, in[99:0].
There are 3 outputs:
- out_and: output of a 100-input AND gate.
- out_or: output of a 100-input OR gate.
- out_xor: output of a 100-input XOR gate.
module top_module( input [99:0] in, output [99:0] out ); genvar i; generate for(i=0;i<=99;i=i+1) begin:invert100 assign out[i]=in[99-i]; end endgenerate endmodule
5.4、Combinational for-loop:Vector reversal2
给定一个 100 位输入向量 [99:0],反转其位顺序。
module top_module( input [99:0] in, output [99:0] out ); //这里用的是genegrate_for语法 genvar i; generate for(i=0;i<=99;i=i+1) begin:invert100 assign out[i]=in[99-i]; end endgenerate endmodule
module top_module( input [99:0] in, output [99:0] out ); //这里用的是for语法 integer i; always@(*) for(i=0;i<=99;i=i+1) begin out[i]=in[99-i]; end endmodule
5.5、Combinational for-loop:255-bit population count
“人口计数”电路计算输入向量中“1”的数量。为 255 位输入向量构建人口计数电路。
module top_module( input [254:0] in, output [7:0] out ); integer i; always@(*) begin out=8'b0000_0000; //out必须赋初值 for(i=0;i<255;i=i+1) if(in[i]==1'b1) out=out+8'b0000_0001; else out=out+8'b0000_0000; end endmodule
5.6、Generate for-loop:100-bit binary adder 2
通过实例化 100 个全加器来创建一个 100 位二进制波纹进位加法器。加法器将两个 100 位数字和一个进位相加,产生一个 100 位和并执行。为了鼓励您实际实例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[99] 是最后一个全加器的最终进位,也是您通常看到的进位。
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<=99;i=i+1) begin:add100 if(i==1'b0) 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
5.7、Generate for-loop:100-digit BCD adder
为您提供了一个名为bcd_fadd的 BCD 一位加法器,该加法器将两个 BCD 数字和进位相加,并产生一个和和进位。实例化 100 个bcd_fadd副本以创建一个 100 位 BCD 波纹进位加法器。您的加法器应将两个 100 位 BCD 数字(打包成 400 位向量)和一个进位相加,以产生一个 100 位和并执行。
module top_module( input [399:0] a, b, input cin, output cout, output [399:0] sum ); wire w[99:0]; //这是一个很好的例子,这里的w可以定义成一个100位宽的变量,这是一个向量;也可以定义成100个一位宽的变量,这是一维数组 genvar i; generate for(i=0;i<100;i=i+1) begin:bcd_add if(i==1'b0) bcd_fadd U0(a[3:0],b[3:0],cin,w[0],sum[3:0]); else bcd_fadd Ui(a[3+4*i:4*i],b[3+4*i:4*i],w[i-1],w[i],sum[3+4*i:4*i]); end endgenerate assign cout = w[99]; endmodule