【HDLBits刷题笔记】02 Vectors
Vector0
向量赋值。
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
注意使用未声明的接口会隐式地生成一个1bit的wire变量,加一个`default_nettype none可以不隐式声明,从而找到一些隐藏的bug。
`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
Vector2
大端和小端的转换。
module top_module( input [31:0] in, output [31:0] out );// assign out ={in[7:0],in[15:8],in[23:16],in[31:24]}; endmodule
Vectorgates
按位或,逻辑或。
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 = {~b,~a}; endmodule
Gates4
按位计算。
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
拼接运算符。
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
Vectorr
将输入反转。注意assign out[7:0] = in[0:7];是错的,因为verilog不允许in[0:7]这样的写法
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
注意赋值的时候外面也要加{},如{24{in[7]}}不能写成24{in[7]}。
module top_module ( input [7:0] in, output [31:0] out );// assign out = { {24{in[7]}} , in }; endmodule
Vector5
这题稍微有点意思,通过复制运算符可以将五个信号的全部按位同或计算出来。
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 = ~{ {5{a}},{5{b}},{5{c}},{5{d}},{5{e}} } ^ { 5{a,b,c,d,e}}; endmodule
今天的题整体也比较简单,不过网站上有一些知识点也是很有用的。