1. base
- 逻辑0:表示低电平,也就是我们电路GND
- 逻辑1:表示高电平,也就是我们电路的vcc
- 逻辑x: 表示未知,有可能是高电平也可能是低电平
- 逻辑z: 表示高阻态,外部没有激励信号,是一个悬空的状态
1.1 进制表示
- 默认尾款是32位,进制是10进制
- b表示二进制如4’b0101
- d表示十进制如4’d2
- h表示16进制如4’ha
### 1.2 标识符
- 标识符用于定义模块、端口、信号等
- 标识符可以是任意的一组字母、数字、$、_组合的符号
- 标识符是区分大小写的
- 标识符必须是字母或者_开头这和绝大多数的编程语言是一样的
## 2. 数据类型
- 寄存器–>映射到数字电路
- 网线–>映射到数字电路
- 参数
2.1 寄存器
- 寄存器表示一个抽象的数据存储单元,关键字
reg
,初始值为不定值x reg [31:0] delay_cnt;
:表示一个32位的寄存器reg key_reg
:默认位宽为1- reg类型的数据只能在
always
语句和initial语句中被赋值 - 在时序逻辑中寄存器变量对应为触发器,在组合逻辑中寄存器对应为硬件连线
2.2 线网
- 线网表示机构实体间的物理连线
- 线网类型的变量不能存储值,它的值由驱动它的元件所决定的
- 可以驱动线网类型的变量的元件有:门、连续赋值语句、assign等
- 如果没有驱动元件链接到线网则该变量是高阻的即为z
- 线网数据类型包括
wire
和tri
,最常用的就是wire
wire key_flag
:表示位宽为1的一个线网
2.3. 参数类型
- 参数其实就是常量,使用关键字
parameter
- 如:
parameter H_SYNC = 11'd21
定义一个11位的参数 - 参数的右边必须是一个常数
- 参数常用语定义状态机的状态、数据位宽和延迟大小等
- 比如:
parameter WIRE_WITH = 12'd3;
和wire [WIRE_WITH:0] key_flags;
配合起来使用 - 在模块调用时,可以通过参数传递来改变被调用模块中的参数
3. 运算符
- 位拼接运算符{},
c={a,b[3:0]}
将a和b拼接起来 - 位移动运算:
<<
和>>
,左移时位宽增加,右移时位宽不变,都是用0补齐
4. 赋值
- 阻塞赋值(=):如
b=a
,用于组合逻辑 - 非阻塞赋值(<=): 如
b<=a
,用于时序逻辑 - 在同一个always中不能同时存在两种赋值方式,在不同的always中不能对同一个变量赋值
5. case 语句
- case语句所有表达式的位宽必须相等
- casez比较时,不考虑表达式中的高阻值
- casex不考虑搞阻值z和不定值x
always @ (posedeg clk or negedge rst_n ) begin
if (!rst_n)
seg_led <= 8'b0;
else begin
case (num)
4'h0 : seg_led <= 8'b1100_000;
4'h1 : seg_led <= 8'b1100_000;
4'h2 : seg_led <= 8'b1100_000;
4'h3 : seg_led <= 8'b1100_000;
4'h4 : seg_led <= 8'b1100_000;
4'h5 : seg_led <= 8'b1100_000;
4'h6 : seg_led <= 8'b1100_000;
4'h7 : seg_led <= 8'b1100_000;
4'h8 : seg_led <= 8'b1100_000;
4'h9 : seg_led <= 8'b1100_000;
4'ha : seg_led <= 8'b1100_000;
4'hb : seg_led <= 8'b1100_000;
4'hc : seg_led <= 8'b1100_000;
4'hd : seg_led <= 8'b1100_000;
4'he : seg_led <= 8'b1100_000;
4'hf : seg_led <= 8'b1100_000;
default: seg_led <= 8'b1100_000;
enndcase
end
end