FPGA verilog入门案例笔记一

       Verilog 是一种硬件描述语言(HDL),广泛应用于电子系统级(ESL)到寄存器传输级(RTL)的数字系统建模。

 

1. 模块(Module)

        Verilog 代码的基本单位是模块,它代表了一个硬件组件。一个模块可以包含端口(port)定义、输入/输出、变量、函数和过程等。

用法案例:一个简单的 LED 控制器模块



module led_controller(  
    input wire clk,     // 时钟信号  
    input wire reset,   // 复位信号  
    output reg led      // LED 输出  
);  
  
// 初始化 LED 为关闭状态  
initial begin  
    led = 0;  
end  
  
// 时钟驱动的逻辑  
always @(posedge clk or posedge reset) begin  
    if (reset) begin  
        // 如果复位信号为高,LED 关闭  
        led <= 0;  
    end else begin  
        // 否则,LED 状态切换  
        led <= ~led;  
    end  
end  
  
endmodule



 

2. 数据类型

    Verilog 支持多种数据类型,包括位(bit)、位向量(bit-vector)、逻辑(logic)、整数(integer)、实数(real)等。

用法案例:使用位向量和整数



module counter(  
    input wire clk,  
    input wire reset,  
    output reg [7:0] count  // 8位计数器  
);  
  
reg [7:0] temp;  
  
always @(posedge clk or posedge reset) begin  
    if (reset) begin  
        temp <= 0;  
    end else begin  
        temp <= temp + 1;  // 使用整数加法  
        if (temp == 255) begin  // 使用整数比较  
            temp <= 0;  
        end  
    end  
end  
  
assign count = temp;  // 将内部寄存器值赋给输出端口  
  
endmodule



3. 运算符

    Verilog 支持多种运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符等。

用法案例:使用位运算符



module bit_manipulation(  
    input wire [7:0] a,  
    input wire [7:0] b,  
    output reg [7:0] result  
);  
  
always @(*) begin  
    // 使用位与、位或和位移运算符  
    result = (a & b) | (a << 2) | (b >> 1);  
end  
  
endmodule



4. 条件语句

Verilog 使用 if-else 和 case 语句来实现条件逻辑。

用法案例:使用 if-else 语句



module mux2to1(  
    input wire [1:0] sel,  
    input wire [7:0] a,  
    input wire [7:0] b,  
    output reg [7:0] out  
);  
  
always @(*) begin  
    if (sel == 2'b00) begin  
        out = a;  
    end else if (sel == 2'b01) begin  
        out = b;  
    end else begin  
        out = 8'hFF;  // 如果选择信号无效,输出高阻态或其他值  
    end  
end  
  
endmodule



5. 循环语句

      Verilog 支持 forwhile 和 repeat 循环语句,但通常只在 initial 和 always 块中的仿真模型中使用,而不是在硬件模型中。

6. 函数和任务(Functions and Tasks)

    Verilog 允许定义函数和任务来封装可重用的代码块。函数返回单个值,而任务可以返回多个值或没有返回值。

7. 实例化(Instantiation)

    在 Verilog 中,一个模块可以被其他模块实例化,从而构建更复杂的系统。

用法案例:实例化 LED 控制器和计数器



module system_top(  
    input wire clk,  
    input wire reset,  
    output wire led  
);  
  
// 实例化 LED 控制器和计数器模块  
led_controller led_ctrl(  
    .clk(clk),  
    .reset(reset),  
    .led(led)  
);  



8. 系统任务和函数(System Tasks and Functions)

    Verilog 提供了一组系统任务和函数,用于与仿真环境进行交互,例如读取或写入文件、显示消息等。常用的系统任务包括 $display$write 和 $readmemb 等。

用法案例:使用 $display 系统任务显示消息



module test_display;  
  
initial begin  
    $display("Hello, Verilog!");  
    #10 $display("This is a test message.");  
end  
  
endmodule



9. 时间控制(Timing Control)

    在 initial 和 always 块中,可以使用时间控制来模拟硬件的延迟或同步行为。例如,#10 表示等待 10 个时间单位的延迟。

10. 参数化设计(Parametric Design)

    Verilog 支持参数化设计,允许模块在实例化时接受参数,从而实现更灵活和可重用的设计。

用法案例:参数化计数器模块



module counter_param(#(parameter WIDTH = 8) // 默认宽度为 8 位  
    input wire clk,  
    input wire reset,  
    output reg [WIDTH-1:0] count  
);  
  
// ... 计数器逻辑 ...  
  
endmodule  
  
// 实例化时指定宽度为 16 位  
counter_param #(.WIDTH(16)) cnt16(  
    .clk(clk),  
    .reset(reset),  
    .count(count16)  
);



总结

    Verilog 是一种功能强大的硬件描述语言,支持从简单的逻辑门到复杂的数字系统的建模。通过掌握其基本语法和用法案例,我们可以使用 Verilog 来设计和模拟各种数字电路和系统。希望本文提供的内容能帮助你更好地理解和使用 Verilog。

相关推荐

  1. FPGA verilog入门案例笔记

    2024-06-07 13:18:09       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 13:18:09       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 13:18:09       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 13:18:09       87 阅读
  4. Python语言-面向对象

    2024-06-07 13:18:09       96 阅读

热门阅读

  1. Flask、uWSGI和Nginx在Web服务器架构中的职责

    2024-06-07 13:18:09       30 阅读
  2. 多云世界中的 API 治理

    2024-06-07 13:18:09       50 阅读
  3. Github 2024-06-04 Python开源项目日报 Top10

    2024-06-07 13:18:09       30 阅读
  4. 【路径规划】二维Dijkstra启发式改进算法

    2024-06-07 13:18:09       31 阅读
  5. LeetCode|938. Range Sum of BST

    2024-06-07 13:18:09       29 阅读
  6. 什么情况下需要进行网络安全等级保护?

    2024-06-07 13:18:09       32 阅读
  7. 如何将 Vue 应用程序部署到 Cloudflare Pages

    2024-06-07 13:18:09       27 阅读
  8. MySQL8.0默认TCP端口介绍

    2024-06-07 13:18:09       29 阅读
  9. Inner-IoU

    Inner-IoU

    2024-06-07 13:18:09      66 阅读
  10. PLM 解决方案如何提高您的业务效率?

    2024-06-07 13:18:09       30 阅读