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
  • 线网数据类型包括wiretri,最常用的就是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