2021.7.1
1.继续在HDLbits刷题。
(11)开始学向量的内容。一个8位wire向量等同于把八个独立信号排在一起。可以把它看作数组,要选取其中一位只要通过”[n]”实现即可。
(12)掌握和向量相关的细节。
①向量一定要先声明。//type [upper:lower] vector_name;
声明向量的type一般是wire或者reg,port type一般是input或者output。
以下是一些例子:
output reg [3:0] y; //port type: output; data type: reg; 4-bit
input [3:-2] z; //negative range(负浮动幅度)也是可以的
//没有特别声明的话默认是wire类型的向量
wire [0:7] b; //反过来写也行,不过b[0]就变成最重要的一位了
//但是后面引用或选择该向量的时候,记得方向要一致,不能颠倒
②Implicit Nets(隐式网络)
在Verilog当中,如果在一个assign语句或者一个未被声明的模块当中出现/引用了未知(未声明)的向量,Implicit nets就会被隐性地生成在模块当中。Implicit nets一般都是一位wire变量,如果你要把那个向量作为向量来用,很可能就会报错。用指令default_nettype none可以禁止Implicit nets的生成。下面是个例子:
wire [2:0] a, c ; //a和c是3位长的向量哦
assign a = 3’b101; //a == 101
assign b = a; //b == 1
assign c = b; //c == 001
my_module i1 (d,e); //d和e没声明直接被my_module拿去用了,
//这时候它们就成了implicit net,是一位宽的wire变量.
//如果my_module要d和e是向量就输了
用default_nettypr none禁止生成implicit nets就可以让bug更加明显了。
③unpacked和packed(解压缩数组和压缩数组)
在中文教程里面,直接把这个解释成向量和数组的区别了:放向量前面表示的是向量本身的长度,放向量后面的表示该向量长度向量构成的数组里面总共有几个向量。
在HDLbits里面,向量长度是”packed”()的,数组长度是”unpacked”的。
④访问向量里的元素:部分选择
在访问向量里面的部分元素的时候,有一些情况需要注意(我有一个问题):
x[1] //x向量里面的最低位(最低位不应该是x[0]吗?!)
(13)题目是把一个4bytes的向量中4个byte顺序倒换。
(14)讨论按位运算和逻辑运算的区别,写一个按位或门和一个逻辑或门,和一个结合两个向量然后按位反相的反相器。
(15)把四位输入的向量中的每位拿来作为逻辑门的输入,然后整与门、或门和异或门。
(16)Concatenation: 用符号”{}”可以把两个小向量结合在一起然后变成一个大向量,Concatenation可以用在赋值语句的左边和右边。注意,被结合的小向量一定要先声明好长度。有个例子要注意一下:
input [15:0] in; //in向量只有16位
output [23:0] out; //out有24位呢
assign out = in; //out的后8位变成0了
assign out[15:0] = in; //out的后8位是缺省状态,是高阻态。
(17)把一个8位向量方向反转。
2.有两个待解决的问题,一个在上面的(12)④提到了,还有一个:
我们知道wire [3:0] addrs [7:0]; 表示由8个4位向量组成的数组。那怎么引用这个数组第n个向量的第m位呢?
因为前面我们知道,引用一个a位wire向量【wire [a:1] eg;】的第b位可以直接用【eg[b]】来表示。那不是和数组的引用规则冲突了?
3.考虑把日志发到优快云上,顺便纪念一下。