HDLBits练习汇总-02-Verilog语言--向量部分(一)

简介: HDLBits练习汇总-02-Verilog语言--向量部分

Vector0


向量用于使用一个名称对相关信号进行分组,以使其更易于操作。例如,电线[7:0] w; 声明一个名为w的8位向量,该向量在功能上等同于具有8条独立的导线。

请注意,向量的声明将维放置在向量名称之前,这与C语法相比并不常见。然而,部分选择了尺寸后,如你所期望的矢量名称。

wire [99:0] my_vector;      // Declare a 100-element vector
assign out = my_vector[10]; // Part-select one bit out of the vector

构建一个具有一个3位输入的电路,然后输出相同的矢量,并将其分成三个单独的1位输出。将输出连接o0到输入向量的位置0,o1位置1等。

在图中,旁边带有数字的刻度线表示向量(或“总线”)的宽度,而不是为向量中的每一位绘制单独的线。

image.png

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


向量用于使用一个名称对相关信号进行分组,以使其更易于操作。例如,wire [7:0] w;

声明一个名为w的8位向量,该向量等效于具有8条独立的导线。

声明向量


向量必须声明:

输入      [upper:lower] vector_name;

type指定向量的数据类型。通常是wire或reg。如果要声明输入或输出端口,则该类型还可以另外包括端口类型(例如,input或output)。一些例子:

wire [7:0] w;         // 8-bit wire
reg  [4:1] x;         // 4-bit reg
output reg [0:0] y;   // 1-bit reg that is also an output port (this is still a vector)
input wire [3:-2] z;  // 6-bit wire input (negative ranges are allowed)
output [3:0] a;       // 4-bit output wire. Type is 'wire' unless specified otherwise.
wire [0:7] b;         // 8-bit wire where b[0] is the most-significant bit.

向量的字节顺序(或非正式地称为“方向”)是指最低有效位是具有较低的索引(较小的字节序,例如[3:0])还是具有较高的索引(较大的字节序,例如[[ 0:3])。在Verilog中,一旦以特定的字节序声明了向量,就必须始终以相同的方式使用它。例如,声明vec[0:3]时写是非法的。与字节序一致是一种好习惯,因为如果将不同字节序的向量一起分配或使用,则会发生奇怪的错误。

隐网


隐式网络通常是难以发现的错误的来源。在Verilog中,可以通过assign语句或通过将未声明的内容附加到模块端口来隐式创建网络类型信号。隐式网络始终是一位电线,如果您打算使用矢量,则会导致错误。可以使用`default_nettype none指令来禁止创建隐式网络。

wire [2:0] a, c;   // Two vectors
assign a = 3'b101;  // a = 101
assign b = a;       // b =   1  implicitly-created wire
assign c = b;       // c = 001  <-- bug
my_module i1 (d,e); // d and e are implicitly one-bit wide if not declared.
                    // This could be a bug if the port was intended to be a vector.

添加`default_nettype none将使第二行代码出错,从而使该错误更明显。

未包装与包装阵列


您可能已经注意到,在声明中,向量索引写在向量名称之前。这声明了数组的“打包”维,其中位被“打包”到了一个Blob中(这在模拟器中相关,但在硬件中不相关)。将解压后的尺寸宣布后的名称。它们通常用于声明内存数组。

reg [7:0] mem [255:0];   // 256 unpacked elements, each of which is a 8-bit packed vector of reg.
reg mem2 [28:0];         // 29 unpacked elements, each of which is a 1-bit reg.

访问向量元素:部分选择


使用向量名称可以访问整个向量。例如:

assign w = a;

取整个4位向量a并将其分配给整个8位向量w(从上面获取声明)。如果左右边的长度不匹配,则将其适当地零扩展或截断。部分选择运算符可用于访问向量的一部分:

w[3:0]      // Only the lower 4 bits of w
x[1]        // The lowest bit of x
x[1:1]      // ...also the lowest bit of x
z[-1:-2]    // Two lowest bits of z
b[3:0]      // Illegal. Vector part-select must match the direction of the declaration.
b[0:3]      // The *upper* 4 bits of b.
assign w[3:0] = b[0:3];    // Assign upper 4 bits of b to lower 4 bits of w. w[3]=b[0], w[2]=b[1], etc.

A Bit of Practice


建立一个组合电路,将输入半字(16位,[15:0])分成低[7:0]和高[15:8]个字节。

Module Declaration
`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 );
`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(部分选择)


可以将32位向量视为包含4个字节(位[31:24],[23:16]等)。建立一个电路,该电路将反转4字节字的字节顺序。

AaaaaaaaBbbbbbbbCcccccccDddddddd => DdddddddCcccccccBbbbbbbbAaaaaaaa

当需要交换数据的字节序时,例如在小字节序x86系统和许多Internet协议中使用的大字节序格式之间交换数据时,通常使用此操作。

`default_nettype none
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

按位运算符


构建一个具有两个3位输入的电路,该输入可计算两个向量的按位或,两个向量的逻辑或以及两个向量的反(NOT)。将的反数b放在out_not(的[5:3]位)的上半部分,并将其的倒数a放在下半部分。

按位与逻辑运算符


之前,我们提到了各种布尔运算符的按位和逻辑版本(例如norgate)。使用向量时,两种运算符类型之间的区别变得很重要。两个N位向量之间的按位运算会复制该向量的每个位的运算并产生N位输出,而逻辑运算会将整个向量视为布尔值(真=非零,假=零),并且产生1位输出。

查看仿真波形,了解按位或与逻辑或的不同之处。

image.png

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

tips


verilog中,“!”表示逻辑求反,“~”表示按位求反。当对位宽为1的变量进行操作时,这两个操作符的作用是一样的,都是求反。当对位宽为2的变量value[1:0]进行操作时,这两个操作符的作用就不一样了.

Gates4


构建一个具有四个输入in [3:0]的组合电路。

有3个输出:

out_and:4输入与门的输出。

out_or:4输入或门的输出。

out_xor:4输入XOR门的输出。

要查看AND,OR和XOR运算符,请参见and gate,nor gate和xnor gate。

module top_module( 
    input [3:0] in,
    output out_and,
    output out_or,
    output out_xor
);
    assign  out_and = & in;
  assign  out_or = | in;
    assign  out_xor= ^ in;
endmodule


目录
相关文章
|
2月前
|
网络协议 网络安全 API
C# 与三菱FX5U PLC通讯交互指南
C# 与三菱FX5U PLC通讯交互指南
1102 121
|
26天前
|
人工智能 供应链 监控
2025年供应链金融公司排名与推荐:深度解读头部企业的赋能路径
在产业链重塑与数字化转型背景下,供应链金融正成为提升产业效率的核心。本文基于资金实力、科技能力、风控体系等维度,系统分析2025年行业格局,深度剖析居首企业海尔金融保理。其依托“海创云链”平台,融合大数据、AI与区块链技术,构建覆盖全国的生态化服务体系,聚焦中小企业融资痛点,服务超560亿元。文章揭示“科技+生态”一体化趋势,为企业选型提供权威参考。
273 0
|
5月前
|
API Python
VIN码查询API的实战指南:获取二手车信息以Python为例
随着机动车保有量上升,中国二手车市场迎来发展机遇。本文介绍如何通过VIN码查询API获取车辆详细信息,提升交易透明度与安全性。
165 1
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
464 5
stm32f407探索者开发板(十三)——JLINK在线调试_软件调试_方法与技巧
stm32f407探索者开发板(十三)——JLINK在线调试_软件调试_方法与技巧
947 0
|
机器人 大数据 异构计算
在实用化人形机器人研发流程中深入应用FPGA技术的流程图(基于工信部《人形机器人创新发展指导意见》)(版本A)
这个流程图将人形机器人视为一个多入多出的反馈控制系统,针对实现工信部《人形机器人创新发展指导意见》所要求的以应对真实场景下的复杂环境与任务、应对突发情况为特征的实用化人形机器人功能需求,在基于CPU+软件体系结构的人形机器人控制系统之中涉及多通道并行处理且需精准协同、强实时性(低延迟量+低延迟抖动量)、大运算量、大数据传输量且构成实时性性能瓶颈的环节中导入FPGA。
444 0
|
存储 安全 程序员
C/C++中的整数乘法运算与汇编指令MUL和IMUL
C/C++中的整数乘法运算与汇编指令MUL和IMUL
507 0
|
缓存 Linux 芯片
Cache(一):VIVT、VIPT、PIPT等概要
Cache(一):VIVT、VIPT、PIPT等概要
1161 0
HDLBits练习汇总-03-Verilog语言--模块层次结构(二)
HDLBits练习汇总-03-Verilog语言--模块层次结构
573 0
HDLBits练习汇总-03-Verilog语言--模块层次结构(二)
HDLBits练习汇总-04-Verilog语言--程序部分(一)
HDLBits练习汇总-04-Verilog语言--程序部分
254 0
HDLBits练习汇总-04-Verilog语言--程序部分(一)