一个目录
也是一个记录
前言
HDLBits刷题大纲:
(1)Verilog Language:1.1 Basics、1.2 Vectors、1.3 Modules Hierarchy、1.4 Procedures、1.5 More Verilog Features
(2)Circuits:2.1 Combinational Logic、2.2 Sequential Logic。
(A. Combinational Logic:2.1.1 Basic Gates、2.1.2 Multiplexers、2.1.3 Arithmetic Circuits、2.1.4 Karnaugh Map to Circuit)
(B. Sequential Logic:2.2.1 Latches and Flip-Flops、2.2.2 Counters、2.2.3 Shift Registers、2.2.4 More Circuits、2.2.5 Finite State Machines)
(3)Verification: Reading Simulations:3.1 Finding bugs in code、3.2 Build a circuit from a simulation waveform
(4)Verification: Writing Testbenches
1.1 Basics Part
分为8个小的部分:1.1.1 Simple wire 1.1.2 Four wires 1.1.3 Inverter 1.1.4 AND 1.1.5 NOR 1.1.6 XNOR 1.1.7 Declaring wires 1.1.8 7458 chip
1.1.1 Simple Wire简单线网
单入单出 :
assign out = in;
1.1.2 Four wires四个线网
三入四出:
assign w = a;
assign x =b;
assign y = b;
assign z = c;
1.1.3 Inverter非
NOT门:逻辑非!按位非~
assign out = ~in;
1.1.4 AND与
与门:逻辑与&&;按位与&
assign out = a&b;
1.1.5 NOR或非
或:逻辑或||;按位或|
或非:~( | )
assign out = ~(a|b);
1.1.6 XNOR同或
同或XNOR~^ 异或XOR^
assign out = ~(a^b);
1.1.7 Declaring wires线网声明
对wire类型信号声明
1.1.8 7458 chip
按照门内部进行连接即可
附:
1.2 Vectors
分为9个小的部分:1.2.1 Vectors 1.2.2 Vectors in more detail 1.2.3 Vector part select 1.2.4 Bitwise operators 1.2.5 Four-input gates 1.2.6 Vector concatenation operator 1.2.7 Vector reversal 1 1.2.8 Replication operator 1.2.9 More replication
1.2.1 Vector0
向量(多位宽数据)声明,以及[]取用对应位
wire [99:0] my_vector; // Declare a 100-element vector
assign out = my_vector[10]; // Part-select one bit out of the vector
1.2.2 Vector1:Part-Select Vector Elements:向量部分位选择
针对变量的reg型和memory型:
assign out_hi = in[15:8];
assign out_lo = in[7:0];
1.2.3 Vector part select
字节顺序的转换:AaaaaaaaBbbbbbbbCcccccccDddddddd => DdddddddCcccccccBbbbbbbbAaaaaaaa
assign out = {in[7:0], in[15:8], in[23:16], in[31:24]};
1.2.4 Bitwise operators按位运算
逐位按位操作
assign out_or_bitwise = a | b;
assign out_or_logical = a || b;
assign out_not[5:3] = ~b;
assign out_not[2:0] = ~a;
1.2.5 Four-input gates四输入门电路
向量内部的各位操作:
构建一个具有四个输入的组合电路,在[3:0]中。
有 3 个输出:
.out_and:输出4路输入AND门。
.out_or:4输入OR门的输出。
.out_xor:输出4路输入异或门。
assign out_and = ∈
assign out_or = |in;
assign out_xor = ^in;
1.2.6 Vector concatenation operator向量拼接
拼接需要指定位宽,常数也是
// assign { ... } = { ... };
// assign {w[7:0], x[7:0], y[7:0], z[7:0]} = {a[4:0], b[4:0], c[4:0], d[4:0], e[4:0], f[4:0], 2'b11};
assign {w, x, y, z} = {a, b, c, d, e, f, 2'b11};
1.2.7 Vector reversal向量翻转倒序输出
Given an 8-bit input vector [7:0], reverse its bit ordering.
// common method
assign out = {in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]};
// for形式
always@(*)begin
for (int i=0;i<$bits(out);i++)
out[i] = in[$bits[(out)-i-1];
end
//$bits(out)表示out这个数据位宽有多少
1.2.8 Replication operator
sign-extend符号位扩展
For example, sign-extending 4’b0101 (5) to 8 bits results in 8’b00000101 (5), while sign-extending 4’b1101 (-3) to 8 bits results in 8’b11111101 (-3).
assign out = {{24{in[7]}},in[7:0]};
1.2.9 More replication
assign out = {{~{5{a}}^{a,b,c,d,e}},{~{5{b}}^{a,b,c,d,e}},{~{5{c}}^{a,b,c,d,e}},{~{5{d}}^{a,b,c,d,e}},{~{5{e}}^{a,b,c,d,e}}};