【HDLBits 刷题 2】Verilog Language(2)Vectors 部分

发布于:2023-02-18 ⋅ 阅读:(483) ⋅ 点赞:(0)

目录

写在前面

Vectors

Vector0

Vector1

Vector2

Vectorgates

Gates4

Vector3

Vectorr

 Vector4

Vector5


写在前面

来到了 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

无仿真波形

本文含有隐藏内容,请 开通VIP 后查看