HDLBits刷题合集—3 Vectors

HDLBits刷题合集—3 Vectors

HDLBits-11 Vector0
Problem Statement
建立一个电路,有一个3位输入,然后输出相同的向量,并把它分成三个独立的1位输出。将输出o0连接到输入向量的位置0,o1连接到位置1,o2连接到位置2。
在下图中,带有数字的标记表示向量(或“总线”)的宽度,而不是向量中的每个位绘制单独的线。

HDLBits刷题合集—3 Vectors_第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 o0 = vec[0];
    assign o1 = vec[1];
    assign o2 = vec[2];
    
endmodule

HDLBits-12 Vector1
Problem Statement
建立一个组合电路,将一个输入的半个字(即一个32位的字,取16位,[15:0]),分成[7:0]和[15:8]两个字节。

代码如下:

`default_nettype none     // Disable implicit nets. Reduces some types of bugs.
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

HDLBits-13 Vector2
Problem Statement
32位向量可以看作包含4个字节(分别是[31:24]、[23:16]、[15:8]和[7:0]等)。建立一个电路,将4字节字的顺序方向。如下所示:
AaaaaaaaBbbbbbbbCcccccccDddddddd=>DdddddddCcccccccBbbbbbbbAaaaaaaa
当需要交换一段数据的顺序时,通常会使用这种操作。

代码如下:

module top_module( 
    input [31:0] in,
    output [31:0] out );//
    
    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

HDLBits-13 Vectorgates
Problem Statement
构建一个有两个3位输入的电路,它可以计算两个向量的按位或、两个向量的逻辑或和两个向量的非。将b的非在out_not的高半部分,a的非在out_not的低半部分。

HDLBits刷题合集—3 Vectors_第2张图片
代码如下:

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

HDLBits-14 Gates4
Problem Statement
在建立一个有四个输入的组合电路。有3个输出:
out_and: 四输入与门的输出。
out_or: 四输入或门的输出。
out_xor: 四输入异或门的输出。

代码如下:

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

HDLBits-14 Vector3
Problem Statement
给定几个输入向量,将它们连接在一起,然后将它们分成几个输出向量。有六个5位的输入向量:a、b、c、d、e和f,总共有30位的输入。对于32位的输出,有4个8位的输出向量:w、x、y和z。输出应该包括两个输入的1位向量。

HDLBits刷题合集—3 Vectors_第3张图片
代码如下:

module top_module (
    input [4:0] a, b, c, d, e, f,
    output [7:0] w, x, y, z );//
    
    assign {w,x,y,z} = {a,b,c,d,e,f,2'b11};
  
endmodule

HDLBits-15 Vectorr
Problem Statement
给定一个8位输入向量[7:0],将它的顺序按位颠倒。

代码如下:

module top_module( 
    input [7:0] in,
    output [7:0] out
);
	//下面一行是简便方法
	//assign {out[0],out[1],out[2],out[3],out[4],out[5],out[6],out[7]} = in;
	assign out[7] = in[0];
    assign out[6] = in[1];
    assign out[5] = in[2];
    assign out[4] = in[3];
    assign out[3] = in[4];
    assign out[2] = in[5];
    assign out[1] = in[6];
    assign out[0] = in[7];
    
endmodule

HDLBits-15 Vector4
Problem Statement
建立一个能将8位数字扩展到32位的电路。这需要24个符号位(即复制第[7]位24次),然后复制8位数字本身。

代码如下:

module top_module (
    input [7:0] in,
    output [31:0] out );//
    
    assign out = {{24{in[7]}},in};
    
endmodule

HDLBits-16 Vector5
Problem Statement
给定5个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;

HDLBits刷题合集—3 Vectors_第4张图片
如图所示,使用复制和拼接操作符可以更容易地做到这一点。
前部分的向量是每个输入重复5次的拼接;
后部分的向量是5个输入序列的重复5次。

代码如下:

module top_module (
	input a, b, c, d, e,
	output [24:0] out
);

	wire [24:0] top, bottom;
	assign top    = { {5{a}}, {5{b}}, {5{c}}, {5{d}}, {5{e}} };
	assign bottom = {5{a,b,c,d,e}};
	assign out = top ~^ bottom;	

	// This could be done on one line:
	// assign out = { {5{a}}, {5{b}}, {5{c}}, {5{d}}, {5{e}} } ~^ {5{a,b,c,d,e}};
	
endmodule

Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!

你可能感兴趣的:(HDLBits刷题合集—3 Vectors)