FPGA学习笔记02——Verilog HDL基础知识

参考内容:Verilog硬件描述语言 西安电子科技大学 蔡觉平等主讲 https://www.bilibili.com/video/BV1zb411s7bY?p=21

王建飞《你好FPGA一本可以听的书》

蔡觉平《Verilog HDL数字集成电路设计原理与应用》

正点原子《开拓者FPGA开发指南》

硬件描述语言(HDL)及其发展

发展过程

FPGA学习笔记02——Verilog HDL基础知识_第1张图片

国际标准

FPGA学习笔记02——Verilog HDL基础知识_第2张图片

语言要素

1、空白符:空格符(\b)、制表符(\t)、换行符和换页符

2、注释符:同C语言

3、标识符:被用来命名信号名、模块名、参数名等。可以由一组字母、数字、$符号、_(下划线)符号的组合。注意:标识符的字母区分大小写、第一个字符必须是字母或下划线。

4、关键字

5、数值:Verilog HDL共有四种逻辑数值状态。

状态 含义
0 低电平、逻辑0或“假”
1 高电平、逻辑1或“真”
x或X 不确定或未知的逻辑状态
z或Z 高阻态

FPGA学习笔记02——Verilog HDL基础知识_第3张图片

整数的表示形式: +/-'

例如:16'b1100_1100_0010_0000  8'hbx 8'b1001zzzz  用下划线区分增加可读性  没有数字说明位宽默认为32位

数据类型

1、连线型:表示逻辑单元的物理连接,对应电路中的物理信号连线。最常用的是wire(连线)和tri(三态线)。

2、寄存器类型:reg是最常见的寄存器型数据类型,reg型是数据存储单元的抽象类型,其对应的硬件电路元件具有状态保持作用,能够存储数据,如触发器、锁存器等。reg型变量常用于行为级描述,由过程赋值语句对其进行赋值。

3、参数型(parameter):属于常量,在仿真开始之前就被赋值,在仿真过程中保持不变。

运算符和表达式

FPGA学习笔记02——Verilog HDL基础知识_第4张图片

基本与C语言一致

※连接运算符{}与复制运算符{{}}

  • 连接运算符:{信号1的某几位,信号2的某几位,...,信号n的某几位}
  • 复制运算符:将一个表达式放入双重花括号中,复制因子放在第一层括号中。

※赋值语句

  • 非阻塞赋值语句:“<=”
  • 阻塞赋值语句:“=”
Initial
    begin
        A<=B;    //语句S1
        B<=A;    //语句S2
    end

语句S1、S2没有先后顺序

Initial
    begin
        A=B;    //语句S1
        B=A;    //语句S2
    end

※条件语句

(1)if-else:条件分支语句

(2)case:分支控制语句

module pocky_led(
	input				clk,
	input				rst,
	output reg [3:0]	led
);

reg err;
reg [1:0] sel;

always @(posedge clk or negedge rst)begin // if-else 语句块
	if(!rst)begin
		led[1:0] <= 2'b00;
	end
	else if(err == 1'b1)
		led[1:0] <= 2'b11;
	else
		led[1:0] <= 2'b10;
end

always @(posedge clk or negedge rst)begin // case 语句块
	if(!rst)begin
		led[3:2] <= 2'b00;
	end
	else begin
        case(sel)
            2'b00:led[3:2] <= 2'b00;
            2'b01:led[3:2] <= 2'b01;
            2'b10:led[3:2] <= 2'b10;
            2'b11:led[3:2] <= 2'b11;
            default:;
        endcase
    end
end

endmodule

※模块

FPGA学习笔记02——Verilog HDL基础知识_第5张图片

Verilog HDL程序设计建模方式

数据流建模

数据流建模是比较简单的建模,基本语句是由assign关键词引导的。显示连续赋值语句如下:

;
assign #=Assignment expression;

 上述格式中:

  • net_declaration(连线型变量类型):可以是除了trireg之外的任何一种连线型数据类型。
  • range(变量位宽):指明了变量数据类型的宽度,格式为[msb:lab],省缺时为1位。
  • delay(延时量):是可选的。语法格式为:#(delay1,delay2,delay3) delay1指连线型变量转移到“1”状态的延时值(称为上升沿时),delay2指连线型变量转移到“2”状态的延时值(称为下降沿时),delay3指连线型变量转移到“高阻Z”状态的延时值(称为关闭沿时)。
module example(a,b,m,n,c,y);
    input[3:0] a,b,m,n;
    output[3:0] c,y;
    wire[3:0] a,b,m,n,c,y;
    assign y = m|n;
    assign #(3,2,4) c=a&b;
    // wire[3:0] #(3,2,4) c=a&b; // 隐式连续赋值语句
endmodule

行为级建模

FPGA学习笔记02——Verilog HDL基础知识_第6张图片

always过程语句 触发状态是一直存在的,只要满足always后面的敏感事件表,就执行语句块。

always @(<敏感事件列表>)
    语句块

敏感事件列表就是触发条件,只有当触发条件满足时,后面的语句块才会被执行。当有两个或者两个以上的信号,他们之间可以用“or”连接,也可以用逗号“,”连接。敏感信号分为两种:一种为边沿敏感型,一种为电平敏感型。对于时序电路通常采用边沿敏感型。posedge和negedge两个关键字分别描述信号的上升沿和下降沿。例如

@(*)                                 // 触发信号的省缺模式,使用时相当于assign
@(a)                                 // 当信号a的值发生改变时
@(a or b)                            // 当信号a或者信号b的值发生改变时
@(posedge clock)                     // 当clock的上升沿到来时
@(negedge clock)                     // 当clock的下降沿到来时
@(posedge clock or negedge clock)    // 当clk的上升沿或者reset信号的下降沿到来时

结构化建模

结构描述方式就是讲硬件电路描述成一个分级子模块系统,通过组成电泳这些子模块构成功能复杂的数字逻辑电路和系统的一种描述方式。

 

 

你可能感兴趣的:(FPGA学习笔记)