• `include指令【FPGA】


     案例:

    1. 在Verilog中,`include指令可以将一个文件的内容插入到当前文件中。
    2. 这个指令通常用于将一些常用的代码片段或者模块定义放在单独的文件中,
    3. 然后在需要使用的地方通过`include指令将其插入到当前文件中。
    4. 这样可以提高代码的复用性和可维护性。
    5. 下面是一个`include的使用案例:
    6. 假设我们有一个名为"adder.v"的文件,其中定义了一个4位加法器模块"adder4"
    7. 我们可以将这个模块定义放在一个单独的文件"adder4.v"中,
    8. 然后在"adder.v"中通过`include指令将其插入到当前文件中。具体操作如下:
    9. 1."adder4.v"中定义4位加法器模块"adder4"
    10. ```
    11. module adder4(a, b, cin, sum, cout);
    12. input [3:0] a, b;
    13. input cin;
    14. output [3:0] sum;
    15. output cout;
    16. assign {cout, sum} = a + b + cin;
    17. endmodule
    18. ```
    19. 2."adder.v"中通过`include指令将"adder4.v"中的内容插入到当前文件中,并使用"adder4"模块:
    20. ```
    21. `include "adder4.v"
    22. module top;
    23. wire [3:0] a, b;
    24. wire cin, cout;
    25. wire [3:0] sum;
    26. adder4 u_adder4(.a(a), .b(b), .cin(cin), .sum(sum), .cout(cout));
    27. endmodule
    28. ```
    29. 这样,我们就可以在"adder.v"中使用"adder4"模块,而不需要在当前文件中重新定义一遍。

    源文件: 

    假设我们有一个名为"adder.v"的文件

    1. module adder4(a, b, cin, sum, cout);
    2. input [3:0] a, b;
    3. input cin;
    4. output [3:0] sum;
    5. output cout;
    6. assign {cout, sum} = a + b + cin;
    7. endmodule

    调用文件: 

    1. `include "adder4.v"
    2. module top;
    3. wire [3:0] a, b;
    4. wire cin, cout;
    5. wire [3:0] sum;
    6. adder4 u_adder4(.a(a), .b(b), .cin(cin), .sum(sum), .cout(cout));
    7. endmodule

    io案例:

    1. 在Verilog中,
    2. 使用`include可以将IO引脚定义写在另一个文件内,以便于代码的管理和维护。
    3. 下面是一个简单的Demo:
    4. 引用:
    5. `include "io_def.v"
    6. module my_module(clk, in1, in2, out1, out2);
    7. input clk;
    8. input in1, in2;
    9. output out1, out2;
    10. wire [7:0] data_in;
    11. wire [7:0] data_out;
    12. // 实例化一个模块
    13. my_submodule submodule_inst(clk, data_in, data_out);
    14. // 将输入输出端口与data_in、data_out相连
    15. assign data_in = {in1, in2};
    16. assign {out1, out2} = data_out;
    17. endmodule
    18. 在上面的代码中,我们使用了`include "io_def.v"将IO引脚定义写在了另一个文件io_def.v中。
    19. 在my_module模块中,我们实例化了一个名为submodule_inst的模块,
    20. 并将其输入输出端口与data_in、data_out相连。
    21. 这样,我们就可以在另一个文件中定义IO引脚,然后在需要使用的模块中使用`include将其引入,
    22. 从而实现代码的模块化和复用。
    1. io_def.v文件内容:
    2. `define DATA_WIDTH 8
    3. `define CLK_PERIOD 10
    4. module io_def(
    5. input clk,
    6. input [`DATA_WIDTH-1:0] in1,
    7. input [`DATA_WIDTH-1:0] in2,
    8. output [`DATA_WIDTH-1:0] out1,
    9. output [`DATA_WIDTH-1:0] out2
    10. );
    11. endmodule
    1. my_module.v文件内容:
    2. `include "io_def.v"
    3. module my_module(
    4. input clk,
    5. input in1,
    6. input in2,
    7. output out1,
    8. output out2
    9. );
    10. wire [`DATA_WIDTH-1:0] data_in;
    11. wire [`DATA_WIDTH-1:0] data_out;
    12. // 实例化一个模块
    13. my_submodule submodule_inst(clk, data_in, data_out);
    14. // 将输入输出端口与data_in、data_out相连
    15. assign data_in = {in1, in2};
    16. assign {out1, out2} = data_out;
    17. endmodule

    在上面的代码中,我们使用了include "io_def.v"将IO引脚定义写在了另一个文件io_def.v中。在my_module模块中,我们实例化了一个名为submodule_inst的模块,并将其输入输出端口与data_in、data_out相连。这样,我们就可以在另一个文件中定义IO引脚,然后在需要使用的模块中使用include将其引入,从而实现代码的模块化和复用。

    define方法

    1. 在Verilog中,使用`include可以将IO引脚定义写在另一个文件内,
    2. 这样可以方便地修改与硬件哪个引脚绑定。下面是一个简单的Demo:
    3. // io_defines.v
    4. `ifndef _IO_DEFINES_V
    5. `define _IO_DEFINES_V
    6. `define CLK 1
    7. `define RST 2
    8. `define DATA_IN 3
    9. `define DATA_OUT 4
    10. `endif // _IO_DEFINES_V
    11. // top_module.v
    12. `include "io_defines.v"
    13. module top_module (
    14. input wire [`CLK] clk,
    15. input wire [`RST] rst,
    16. input wire [`DATA_IN] data_in,
    17. output wire [`DATA_OUT] data_out
    18. );
    19. // ...
    20. endmodule
    21. 在上面的例子中,我们将IO引脚定义写在了io_defines.v文件中,
    22. 并使用`include将其包含到了top_module.v文件中。
    23. 这样,在top_module中就可以使用`CLK、`RST、`DATA_IN
    24. 和`DATA_OUT这些宏来代替具体的引脚号码了。
    25. 如果需要修改某个引脚的绑定,只需要修改io_defines.v文件即可。

    案例3:

    1. 在Verilog中,如果要在io_defines.v文件中定义LED,并在top_module.v文件中使用LED,
    2. 可以按照以下步骤进行操作:
    3. 1. 在io_defines.v文件中定义LED,可以使用以下代码:
    4. ```
    5. module io_defines(
    6. input wire LED
    7. );
    8. endmodule
    9. ```
    10. 2. 在top_module.v文件中使用LED,可以使用以下代码:
    11. ```
    12. module top_module(
    13. input wire clk,
    14. input wire reset,
    15. input wire [7:0] data_in,
    16. output wire [7:0] data_out,
    17. input wire LED
    18. );
    19. io_defines io_defines_inst(
    20. .LED(LED)
    21. );
    22. //其他模块实例化和逻辑代码
    23. endmodule
    24. ```
    25. 3. 在综合工具中,需要将LED绑定到对应的硬件引脚上,具体方法可以参考综合工具的使用手册。
    26. 下面是一个简单的Demo,演示了如何在io_defines.v和top_module.v中使用LED:
    27. ```
    28. // io_defines.v
    29. module io_defines(
    30. input wire LED
    31. );
    32. endmodule
    33. // top_module.v
    34. module top_module(
    35. input wire clk,
    36. input wire reset,
    37. input wire [7:0] data_in,
    38. output wire [7:0] data_out,
    39. input wire LED
    40. );
    41. io_defines io_defines_inst( //【注】这里进行连线
    42. .LED(LED)
    43. );
    44. assign data_out = data_in;
    45. endmodule
    46. ```

  • 相关阅读:
    音频语言学习领域数据集现状、分类及评估
    JavaScript 进阶03
    计算机视觉中的可解释性分析
    动态规划9(Leetcode63不同路径2)
    数据结构第29节 后缀树和后缀数组
    谷粒商城 高级篇 (五) --------- 商品上架
    fiddler抓包工具
    推荐算法---矩阵分解
    qemu-system-arm搭建arm仿真环境
    设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别
  • 原文地址:https://blog.csdn.net/cfqq1989/article/details/134092563