是基础理解以及个人 的练习答案,如有错欢迎大家指出。
第一题:Vector0:
Vector即向量,用于声明变量名称,以便电路设计操作。一般形式为:
wire [99:0] my_vector; // 声明一个包含100个元素的向量
assign out = my_vector[10]; // 选择向量中的一部分
该题只需要声明图中的变量即可。正确答案:
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[2:0] =vec[2:0];
assign o2 = vec[2];
assign o1 = vec[1];
assign o0 = vec[0];
endmodule
第二题:Vector1:
该题需要我们把in[15:0]分成上下两部分分给out_hi和out_lo;
正确答案:
`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[7:0] = in[15:8];
assign out_lo[7:0] = in[7:0];
endmodule
vector的数据类型通常是wire或reg类型。如果要声明输入或输出端口,则类型还可以包括端口类型(例如,input或output)。
向量的第二个作用:可用名称来分组相关的信号,使其更便于操作。例如,wire [7:0] w;声明一个名为w的8位向量,相当于有8条独立的线。
Tips:在verilog语言中,我们需要用到特定的端序声明向量,比如a[3:0]。当我们使用[3:0]来声明这个向量的端序时,就不要使用其他任何端序来表示这个向量,如[0:3]\[7:5]...我们必须严格按照开始设定的端序去写,这样就能保证你的代码不会出现奇怪的bug。
这里还有很多关于向量的笔记和可注意的点,不一一总结,大家可以打开有道翻译,认真理解是可以掌握的。
第三题:Vector2:
本题要求是需要反转一个32字节的向量,注释也提示可直接使用assign语句声明,并且看题意也不需要完全翻转,所以我们可直接逐段表示:
正确答案:
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];
// assign out[31:24] = ...;
endmodule
第四题:Vectorgates:
构建一个具有两个3位输入的电路,用于计算两个向量的位或、两个向量的逻辑或和两个向量的逆(NOT)。将b的倒数放在out_not的上半部分(即bits[5:3]),将a的倒数放在下半部分。
位或:|
逻辑或:||
逆:~
正确答案:
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[2:0] = a[2:0]|b[2:0];
assign out_or_logical = a||b;
assign out_not[2:0] = ~a[2:0];
assign out_not[5:3] = ~b[2:0];
endmodule
第五题:gatess4:
该题要求为:建立一个有四输入的电路,有三个输出:
out_and: 4输入与门的输出。
out_or:四输入或门输出。
out_xor:四输入异或门输出。
Tips:与逻辑:&
位或:|
异或:^
正确答案:
module top_module(
input [3:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = in[0]&in[1]&in[2]&in[3];
assign out_or = in[0]|in[1]|in[2]|in[3];
assign out_xor = in[0]^in[1]^in[2]^in[3];
endmodule
第六题:Vector3:
本题意在让我们使用一些位数(a,b,c,d,e,f,11)代入w,x,y,z中去,前面的说明是让我们更好理解、教我们使用相关语法来完成这些题目的,大家可以自行打开翻译进行理解:
正确答案
module top_module (
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );//
// assign { ... } = { ... };
assign {w,x,y,z} = {a,b,c,d,e,f,2'b11};
endmodule
第七题:Vectorr:
给定一个8位输入向量[7:0],反转它的位顺序。
需要了解到一些逻辑思路,我们可以单纯地将每一位数反转地使用assign表示出来,但未免有些太繁琐:
直接表示:
module top_module(
input [7:0] in,
output [7:0] out
);
assign out[7:0] = {in[0],in[1],in[2],in[3],in[4],in[5],in[6],in[7],};
endmodule
使用逻辑语言:很好理解
module top_module(
input [7:0] in,
output [7:0] out
);
integer i;
always@(*)begin
for(i=0;i<8;i=i+1)begin
out[i]=in[7-i];
end
end
endmodule
第八题:Vector4:
使用复制操作符将向量连接在一起。题目有提及相关语法。
本题要求为:
建立一个电路,将8位数字的符号扩展到32位。这需要将符号位复制24次(即复制bit[7] 24次),然后是8位数字本身。
正确答案:
module top_module (
input [7:0] in,
output [31:0] out );//
// assign out = { replicate-sign-bit , the-input };
assign out[31:0]={{24{in[7]}},in};
endmodule
第九题:Vector5:
表示上部分和下部分的24位值,如果上下两位相等,那么输出为1。使用异或逻辑将comparism完成:
正确答案:
module top_module (
input a, b, c, d, e,
output [24:0] out );//
// The output is XNOR of two vectors created by
// concatenating and replicating the five inputs.
// assign out = ~{ ... } ^ { ... };
wire [24:0]out1;
wire [24:0]out2;
assign out1 = {5{a,b,c,d,e}};
assign out2 = {{5{a}},{5{b}},{5{c}},{5{d}},{5{e}}};
assign out = ~(out1^out2);
endmodule