More
1.
三目运算符的运算方式
条件表达式 ? 表达式1 : 表达式2
例:
(0 ? 3 : 5) // 输出为5因为0为假
(sel ? b : a) //由sel的值决定选择b或a
always @(posedge clk) // T触发器
q <= toggle ? ~q : q;
((sel[1:0] == 2'h0 ) ? a : (sel[1:0] == 2'h1) ? b : c)//由sel值三选一电路
多个混用时结合顺序为从右向左
例:
(a>b)?(b>c)?1:0:2 //先运算(b>c) ? 1 : 0再运算(a>b) ? X : 2
((sel[1:0] == 2'h0 ) ? a : (sel[1:0] == 2'h1) ? b : c)//先运算(sel[1:0] == 2'h1) ? b : c再运算((sel[1:0] == 2'h0 ) ? a : X )
例1:
给了四个数,选出其中最小的那一个。
解:
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);//
wire [7:0]bet0;
wire [7:0]bet1;
assign bet0 = a>b ? b : a;
assign bet1 = d>c ? c : d;
assign min = bet0>bet1 ? bet1 : bet0;
endmodule
2.
归约运算符可以对向量的每一位进行AND,OR,XOR(异或)
归约运算符的运算方式
& 向量
| 向量
^ 向量
例:
& a[7:0] //等效于 a[7]&a[6]&a[5]&a[4]a[3]&a[2]&a[1]&a[0];
| b[4:0] //等效于 b[4]|b[3]|b[2]|b[1]|b[0];
input[3:0] in
^ in //等效于 in[3]^in[2]^in[1]^in[0]
例1:
输入一个8位二进制数,要求输出奇偶校验码
奇偶校验码简单来说是指对给出二进制数添加一位校验位在最后 将原来“1”的数量变为奇数就是奇校验,变为偶数就是偶校验
例:
10010101101
100101011011//奇校验
100101011010//偶校验
module top_module(
input [7:0] in,
output parity
);
assign parity = ^in;//1数量为奇数时全部异或值为0
endmodule
3.
例1:
实现100为的全部与或非,和上题完全一样
解:
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_or = |in;
assign out_xor = ^in;
endmodule
4.
例1:
翻转长度为100的向量
解:
module top_module(
input [99:0] in,
output [99:0] out
);
integer i;
always@(*)
begin//注意always格式
for(i=0;i<100;i++)//使用for循环
begin
out[i]=in[99-i];
end
end
endmodule
5.
例1:
判断一个255位的二进制数中有多少个1
解:
module top_module(
input [254:0] in,
output [7:0] out );
integer i;
always@(*)
begin
out = 8'b00000000;
for(i=0;i<255;i++)
begin //每一个新对应条件就需要一个begin
if(in[i] == 1'b1)
out = out + 1'b1;
else
out = out + 1'b0;
end
end
endmodule
6.
-for语句的运算方式:
循环变量
for(for循环条件)
begin:for循环名称
赋值语句
end
例:
module test(bin,gray);
output [7:0] bin;
input [7:0] gray;
genvar i;
generate
for(i=0;i<SIZE;i=i+1)
begin:bit //为调用的模块命名
assign bin[i]=^gray[7:i];
end
endgenerate
endmodule
中的内容等效于
assign bin[0]=^gray[7:0];
assign bin[1]=^gray[7:1];
assign bin[2]=^gray[7:2];
assign bin[3]=^gray[7:3];
assign bin[4]=^gray[7:4];
assign bin[5]=^gray[7:5];
assign bin[6]=^gray[7:6];
assign bin[7]=^gray[7:7];
例1:
实例化100个全加器来实现一个100比特的二进制加法器,该加法器有两个100比特的输入和进位cin,输出为sum输出进位为cout
解:
用到上面提到的语句
//Adder100i
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum
);
addr add1(a[0], b[0],cin, cout[0],sum[0]);
genvar i;
generate
for(i = 0;i<99;i++)
begin: addr
addr add_i(a[i+1],b[i+1],cout[i],cout[i+1],sum[i+1]);
end
endgenerate
endmodule
module addr(
input a,b,
input cin,
output cout,
output sum
);
assign sum = a^b^cin;
assign cout = (a&b)|(b&cin)|(cin&a);
endmodule
问题
不太理解的使用模块的例化以及调用 7.
例1:
本题已经提供了名为的一位BCD加法器,该加法器包括两个BCD码以及一个进位cin的输入,和sum的输出以及进位cout的输出
要求实例化100个来实现100位的BCD进位加法器,该模块有两个100位BCD码以及一个进位cin的输入,和sum的输出以及cout的输出
解:
同样用到
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [399:0] cout_temp;
genvar i;
bcd_fadd u1(
.a(a[3:0]),
.b(b[3:0]),
.cin(cin),
.cout(cout_temp[0]),
.sum(sum[3:0])
);
generate
for(i=4;i<400;i=i+4)
begin:bcd
bcd_fadd ut(
.a(a[i+3:i]),
.b(b[i+3:i]),
.cin(cout_temp[i-4]),
.cout(cout_temp[i]),
.sum(sum[i+3:i])
);
end
endgenerate
assign cout = cout_temp[396];
endmodule
8.问题
评论(0)