数字逻辑设计

本教程主要讲述 Verilog 完成数字 IC 设计(数字集成电路设计,Digital Integrated Circuit Design) 时涉及的一些知识,更加注重数字电路安全、稳定、方便的实现。

内容主要包括:底层(门级建模、用户自定义原语 UDP、逻辑综合)、时序(时序分析)、优化(同步与异步、复位与时钟、低功耗设计)、技巧(系统任务、编程语言接口 PLI)。

 

1. 谁适合阅读本教程

本教程主要针对具有一定 Verilog 和数字电路基础的开发人员准备的资料。

阅读本教程前,请先参考基础篇《Verilog 教程》

 

2. Verilog 简介

Verilog HDL(简称 Verilog)是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,可以用来表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

Verilog 主要用于数字电路的系统设计,可对算法级、门级、开关级等多种抽象设计层次进行建模,是世界上最流行的两种硬件描述语言之一。

Verilog 继承了 C 语言的多种操作符和结构,与另一种硬件描述语言 VHDL 相比,语法不是很严格,代码更加简洁,更容易上手。

Verilog 不仅定义了语法,还对语法结构都定义了清晰的仿真语义。因此,Verilog 编写的数字模型就能够使用 Verilog 仿真器进行验证。

 

3. 第一个 Verilog 设计

4 位宽 10 进制计数器:

module counter10(
        //端口定义
        input                   rstn,   //复位端,低有效
        input                   clk,    //输入时钟
        output [3:0]    cnt,    //计数输出
        output                  cout);  //溢出位

        reg [3:0]               cnt_temp ;      //计数器寄存器
        always@(posedge clk or negedge rstn) begin
                if(! rstn)begin         //复位时,计时归0
                        cnt_temp        <= 4'b0 ;
                end
                else if (cnt_temp==4'd9) begin  //计时10个cycle时,计时归0
                        cnt_temp        <=4'b000;
                end
                else begin                                      //计时加1
                        cnt_temp        <= cnt_temp + 1'b1 ; 
                end
        end

        assign  cout = (cnt_temp==4'd9) ;       //输出周期位
        assign  cnt  = cnt_temp ;                       //输出实时计时器

endmodule

良好的编码风格,有助于代码的阅读、调试和修改。虽然 Verilog 代码可以在保证语法正确的前提下任意编写,但是潦草的编码风格往往是一锤子买卖。有时回看自己编写的代码,既看不出信号的意义,也不了解模块的功能,还得从 ...