【Verilog练习】3. vector 向量(一)

3.1 标量

在Verilog中,标量(scalar)指的是单个位的信号或者变量,与向量(vector)相对。标量通常只包含一个独立位,表示一个二进制值(0或1)或者一个逻辑状态(比如逻辑值true或false)。

与向量不同,标量没有范围或位宽,一个标量可以是一个寄存器、一个线网、一个参数或一个局部变量。以下是一些示例:

reg clk;//定义一个标量寄存器,表示时钟信号
wire out; //定义一个标量线网,用于输出信号
​
always @(posedge clk)   begin
    out <= ~out; //对输出信号进行取反
end

3.2 向量

vector通常指的是一个多位的信号,它可以是一个寄存器、一个线网、一个参数或一个局部变量。通常,向量由多个连续的位组成,可以表示一个数据字、一个数据、一个地址或者其他多位信息。

在Verilog中,向量可以使用方括号表示其范围。例如,一个8位的向量可以表示为[7:0],其中7是最高有效位(MSB),0是最低有效位(LSB)。例如:

reg [7:0] my_vector;

3.2.1 向量的声明

向量的声明必须为:

type [upper:lower] vector_name;

以下是一些常见和特殊的向量类型的声明例子:

wire [7:0] w;           //8-bit 线网
reg [4:1] x;            //4-bit 寄存器
output reg [0:0] y;     //1-bit 输出端口,y同样是向量
inout wire [3:-2] z;    //6-bit 负数范围也可以
output [3:0] a;         //4-bit 这里没有标准变量类型,默认为“wire”
wire [0:7] b;           //8-bit 其中b[0]是最高有效位

在Verilog中,无论是wire [0:7] b;还是wire [7:0] b;,都是表示一个8位的wire向量,只是索引的方向相反。

  • 对于wire [0:7] b;,索引从0到7,b[0]是最低位,b[7]是最高位。

  • 对于wire [7:0] b;,索引从7到0,b[7]是最高位,b[0]是最低位。

索引的方向只是约定的不同,但不会影响向量的大小或者最高位的位置。

3.2.2 隐式网络

隐式网络(Implicit nets)是在Verilog中未显示声明而自动创建的线网。当使用assign语句或未声明的内容连接到模块端口时,可能会隐式地创建线网。这些线网没有在代码中明确地定义,而是根据上下文自动推导生成的。

隐式线网会导致一些难以发现的错误。例如,如果打算使用一个多位向量,但不小心使用了隐式线网,则可能会导致意外的行为或功能错误:

module ImplicitNrtsExample(
    input a,
    input b,
output y
);
    
    assign y = a & b;   //没有明确声明y的类型,将会隐式创建一个线网
    
endmodule

为避免这种情况,我们可以显式地声明y的类型,例如:

output [7:0] y;     //声明y是一个八位的向量

在Verilog中,提供了default_nettype none指令,可以在代码中禁用隐式线网的创建。通过这个指令,可以强制要求所以线网都必须显式地声明,从而帮助减少潜在的错误。

3.2.3 数组

在向量的声明中,向量索引是在向量名称之前编写的,如果括号写在变量名之后,即表示数组。在Verilog中,数组是一种数据结构,用于存储相同类型的元素。数组可以是一维的、多维的,也可以是packed(打包的)或unpacked(未打包的)。

  • 一维数组:包含一组元素,每个元素都有一个唯一的索引。

  • 多维数组:包含多个维度的元素,每个维度都有一个唯一的索引。

  • 打包数组:将元素打包到一个连续的位块中,通常用于表示数据寄存器或信号

  • 未打包数组:元素不打包到一个连续的位块中,通常用于表示寄存器或多维数组。

"位块"(bit blob)是一种连续的二进制位组合,通常用于打包数组(packed arrays)中。在打包数组中,多个信号或数据元素被连续地存储在一起,形成一个连续的二进制位块。

例如,在一个打包的8位数组中,每个元素都是一个8位的二进制,这8位连续地存储在一起,形成一个位块。这样的位块可以被整体地传递、处理或存储,而不是需要对每个位进行单独的操作。

位块的概念在硬件描述语言中很常见,因为它能够更有效地表示硬件中的数据结构和信号。

例如:

reg [7:0] mem [255:0]; //256个未打包元素,每个元素是一个8位打包的寄存器向量
reg mem2 [28:0];    //29个未打包元素,每个元素是一个1位寄存器
reg [7:0] mem3 [255:0]  //一个8位寄存器向量(reg [7:0]),它被打包在mem3中,形成了一个256个元素的数组。因此,每个数组元素都是一个8位的寄存器向量。

Verilog中的数组允许在硬件描述中方便地组织和访问数据。可以使用数组来表示寄存器、寄存器文件、FIFO队列等。

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯电影配红酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值