目录
写在前面
来到了 Verilog 语法的矢量部分,这部分仍然比较简单,所以只给出题目、代码和仿真结果,其他不多赘述。
Vectors
Vector0
构建一个具有一个3位输入的电路,然后输出相同的矢量,并将其拆分为三个单独的1位输出。将输出连接到输入向量的位置 0、位置 1 等。在图表中,旁边带有数字的刻度线表示矢量(或“总线”)的宽度,而不是为矢量中的每个位绘制一条单独的线。
module top_module (
input wire [2:0] vec,
output wire [2:0] outv,
output wire o2,
output wire o1,
output wire o0 ); // Module body starts after module declaration
assign outv = vec;
assign o2 = vec[2];
assign o1 = vec[1];
assign o0 = vec[0];
endmodule
仿真波形
Vector1
向量的字节序(或者非正式地称为“方向”)是最低有效位的索引较低(小端序,例如[3:0])还是较高的索引(大端序,例如[0:3])。在 Verilog 中,一旦以特定的字节序声明向量,就必须始终以相同的方式使用它。例如,在声明时写作是非法的。与字节序保持一致是很好的做法,因为如果分配或一起使用具有不同字节序的向量,则会发生奇怪的错误。
构建一个组合电路,将输入半字(16 位,[15:0])拆分为较低的[7:0]和较高的[15:8]字节
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out_hi = in[15:8];
assign out_lo = in[7:0];
endmodule
仿真波形
Vector2
32 位向量可以被视为包含 4 个字节(位 [31:24]、[23:16] 等)。构建一个电路,该电路将反转 4 字节字的字节顺序。
AaaaaaaaBbbbbbbbCcccccccDddddddd => DdddddddCcccccccBbbbbbbbAaaaaaaa
当一段数据的字节顺序需要交换时,例如在小端 x86 系统和许多 Internet 协议中使用的大端格式之间,通常使用此操作。
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out[31:24] = in[7:0];
assign out[23:16] = in[15:8];
assign out[15:8] = in[23:16];
assign out[7:0] = in[31:24];
endmodule
仿真波形
Vectorgates
构建一个具有两个 3 位输入的电路,该输入计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的反 (NOT)。将 的反函数放在 的上半部分(即位 [5:3]),将 的反函数放在下半部分。
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
assign out_or_bitwise = a | b;
assign out_or_logical = a || b;
assign out_not[5:3] = ~b;
assign out_not[2:0] = ~a;
endmodule
仿真波形
Gates4
构建一个具有四个输入的组合电路,在[3:0]中。
有 3 个输出:
- .out_and:输出4路输入AND门。
- .out_or:4输入OR门的输出。
- .out_xor:输出4路输入异或门。
module top_module(
input [3:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = ∈
assign out_or = |in;
assign out_xor = ^in;
endmodule
波形仿真
Vector3
位拼接符
给定几个输入向量,将它们连接在一起,然后将它们拆分为多个输出向量。
有六个 5 位输入向量:a、b、c、d、e 和 f,总共 30 位输入。有四个 8 位输出向量:w、x、y 和 z,用于 32 位输出。输出应是输入向量的串联,后跟两个1 。
module top_module (
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );
wire [31:0] combine;
assign combine = {a,b,c,d,e,f,{2'b11}};
assign w = combine[31:24];
assign x = combine[23:16];
assign y = combine[15:8];
assign z = combine[7:0];
endmodule
波形仿真
Vectorr
给定一个 8 位输入向量 [7:0],反转其位排序。
module top_module(
input [7:0] in,
output [7:0] out
);
assign out = {in[0],in[1],in[2],in[3],in[4],in[5],in[6],in[7]};
endmodule
仿真波形
Vector4
构建一个对 8 位数字进行签名扩展到 32 位的电路。
这需要将符号位的24个副本(即复制位[7]24次)连接起来,然后是8位数字本身。
module top_module (
input [7:0] in,
output [31:0] out );
assign out = {{24{in[7]}},in};
endmodule
无仿真波形
Vector5
给定五个 1 位信号(a、b、c、d 和 e),计算 25 位输出向量中的所有 25 个成对 1 位比较。如果要比较的两个位相等,则输出应为 1。
out[24] = ~a ^ a; // a == a, so out[24] is always 1.
out[23] = ~a ^ b;
out[22] = ~a ^ c;
...
out[ 1] = ~e ^ d;
out[ 0] = ~e ^ e;
- 顶部向量是每个输入的 5 个重复的串联
- 底部矢量是 5 个输入串联的 5 个重复
module top_module (
input a, b, c, d, e,
output [24:0] out );
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}}};
endmodule
无仿真波形