Conditional ternary opertor(条件运算符)
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);//
wire [7:0]abmax,cdmax;
assign abmax = a<b? a: b;
assign cdmax = c<d? c: d;
assign min = abmax<cdmax? abmax: cdmax;
endmodule
Reduction opertors(归约运算符)
module top_module (
input [7:0] in,
output parity);
assign parity= ^in;
endmodule
Reduction :even wider gates
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
Combinition for loop:vector reversal 2(for循环组合:向量反转2)
module top_module(
input [99:0] in,
output [99:0] out
);
integer i;
always@(*)
begin
for(i=0;i<100;i=i+1'b1)
begin
out[99-i]=in[i];
end
end
endmodule
Combinition for loop:255 bit population count(for循环组合:255位人口计数器)
module top_module(
input [254:0] in,
output [7:0] out );
integer i;
always@(*)
begin
out=8'b0000_0000;
for(i=0;i<255;i=i+1'b1)
begin
if(in[i]==1'b1)
out=out+1'b1;
else
out=out;
end
end
endmodule
Generate for loop:100 bit binary adder 2( generate for循环组合:100位二进制加法器)
generate功能块主要用于循环,相对于for循环,generate for循环能够例化模块等。
主要注意有:(1)循环变量需要用genvar定义,只能在generate功能块中使用
(2)for后必须有begin....end,begin:名字(类似于模块名)
(3)里面语句需要加关键字如:assign,xor...
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'b1)
begin: aaa
if(i==0)
assign {cout[i],sum[i]}=a[i]+b[i]+cin;
else
assign {cout[i],sum[i]}=a[i]+b[i]+cout[i-1];
end
endgenerate
endmodule
Generate for loop:100-digit BCD adder(for循环组合:100位二进制加法器)
小技巧:寄存器部分选择可以通过最低位 +:(选择位数)方式
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [99:0]jinwei;
genvar i;
generate
for(i=0;i<100;i=i+1'b1)
begin: aaa
if(i==0)
bcd_fadd b1(.a(a[i*4+:4]),.b(b[i*4+:4]),.cin(cin),.cout(jinwei[i]),.sum(sum[i*4+:4]) );
else
bcd_fadd b2(.a(a[i*4+:4]),.b(b[i*4+:4]),.cin(jinwei[i-1]),.cout(jinwei[i]),.sum(sum[i*4+:4]) );
end
endgenerate
assign cout=jinwei[99];
endmodule