FPGA工程师们应该都会吐槽Verilog的语法,相当的不友好,尤其是对于有很多接口的模块,像AXI4/AXI-Lite这种常用的总线接口,动不动就好几十根线,写起来是相当费劲。

当然现在Xilinx推荐使用纯bd文件的方式来设计FPGA,这样HDL代码就会少了很多。但我们大多数的工程还是无法避免使用HDL来连接两个module。所以本文就推荐使用SystemVerilog来简化FPGA中接口的连接方式。

也许很多FPGA工程师对SystemVerilog并不是很了解,因为以前的FPGA开发工具是不支持SystemVerilog的,导致大家都是用VHDL或者Verilog来开发,但现在Vivado对SystemVerilog的支持已经比较好了,完全可以使用SystemVerilog写出可综合的FPGA程序,而且FPGA开发中只会使用的SystemVerilog语法的一小部分,入门也很快,因此建议FPGA工程师学一下SystemVerilog。

本文中用到的logic关键字的解释可以参考SystemVerilog教程之数据类型1

此次例程也比较简单,有两个模块module1和module2,module1中输出a和b,在module2中完成加法后再返还给module1,最终输出的led=c | a。

image-20200720203534072

首先用Verilog来实现,代码也比较简单,就简单解释一句:文件格式都是.sv,这是因为SystemVerilog的语法都是包含Verilog的。

//top.sv

module top(

input        clk,

input        rst,

output [3:0] led

);

logic    [3:0] a ;

logic    [3:0] b ;

logic    [3:0] c ;

module1 inst_module1(

.clk  (clk  ),

.rst  (rst  ),

.a    (a),

.b    (b),

.c    (c),

.led  (led)

);

module2 inst_module2(

.clk  (clk  ),

.rst  (rst  ),

.a    (a),

.b    (b),

.c    (c)

);

endmodule

// module1.sv

module module1(

input clk,

input rst,

output logic [3:0] a,

output logic [3:0] b,

input  logic [3:0] c,

output logic [3:0] led

);

assign led = c | a;

always @ ( posedge clk ) begin

if(rst) begin

a <= 4'd1;

b <= 4'd2;

end

else begin

a <= a + 1'b1;

b <= b + 1'b1;

end

end

endmodule

// module2.sv

module module2(

input clk,

input rst,

input  logic [3:0] a,

input  logic [3:0] b,

output logic [3:0] c

);

always @ ( posedge clk ) begin

if(rst)

c <= 4'd1;

else

c <= a + b;

end

endmodule

综合之后的Schematic如下图所示:(为了更好的表示电路结构,我将flatten_hierarchy选为了none)

image-20200720192328527

下面我们把程序稍作改动,将a/b/c三个接口使用SystemVerilog中的interface来连接。

在工程中添加my_itf.sv文件如下:

// my_itf.sv

interface my_itf;

logic [3:0] a, b, c;

modport mod1 (input c,    output a, b);

modport mod2 (input a, b, output c  );

endinterface : my_itf

关键字interface就表示要创建一个接口模块,里面包含了3个接口:a/b/c。

modport定义了这三个接口的方向,对于module1来说,a和b是输出,c是输入;对于module2来说,a和b是输入,c是输出。

注:也可以不使用modport,Vivado会根据代码自动推断出接口的方向,但不建议这么做

修改module1.sv如下,其中a/b/c端口换成了my_itf.mod1 itf_abc,my_itf.mod1就表示my_itf接口的方向按照mod1中指定的,而且代码中的a、b、c要相应的换成itf_abc.a、itf_abc.b、itf_abc.c.

// module1.sv

module module1(

input clk,

input rst,

my_itf.mod1 itf_abc,

output logic [3:0] led

);

assign led = itf_abc.c | itf_abc.a;

always @ ( posedge clk ) begin

if(rst) begin

itf_abc.a <= 4'd1;

itf_abc.b <= 4'd2;

end

else begin

itf_abc.a <= itf_abc.a + 1'b1;

itf_abc.b <= itf_abc.b + 1'b1;

end

end

endmodule

修改module2.sv代码如下,原则跟上面是一样的,不再赘述。

// module2.sv

module module2(

input clk,

input rst,

my_itf.mod2 itf_abc

);

always @ ( posedge clk ) begin

if(rst)

itf_abc.c <= 4'd1;

else

itf_abc.c <= itf_abc.a + itf_abc.b;

end

endmodule

修改top.sv如下,例化my_itf接口,将itf_abc.mod1传给module1,将itf_abc.mod2传给module2.

// top.sv

module top(

input        clk,

input        rst,

output [3:0] led

);

logic    [3:0] a ;

logic    [3:0] b ;

logic    [3:0] c ;

my_itf itf_abc();

module1 inst_module1(

.clk       (clk  ),

.rst       (rst  ),

.itf_abc   (itf_abc.mod1),

.led       (led)

);

module2 inst_module2(

.clk       (clk  ),

.rst       (rst  ),

.itf_abc   (itf_abc.mod2)

);

endmodule

大功告成!!!

综合后Schematic如下,跟上面的图只是名字不同,电路是一样的。

image-20200720201342972

matlab verilog 接口,使用SystemVerilog简化FPGA中的接口相关推荐

  1. 类与接口(三)java中的接口与嵌套接口

    ###一.接口 ##1. 接口简介 接口: 是java的一种抽象类型,是抽象方法的集合.接口比抽象类更加抽象的抽象类型. 接口语法: [修饰符] [abstract] interface 接口名 [e ...

  2. api 接口开发理论 在php中调用接口以及编写接口

    如: http://localhost/openUser.php?act=get_user_list&type=json 在这里openUser.php相当于一个接口,其中get_user_l ...

  3. go语言如何调用java接口,[译] 如何在 Go 中使用接口

    在开始使用 Go 编程之前,我的大部分工作都是用 Python 完成的.作为一名 Python 程序员,我发现学习使用 Go 中的接口是非常困难的.基础很简单,而且我知道如何在标准库中使用接口,但是我 ...

  4. java定义接口必用关键字_Java中定义接口的关键字是什么

    Java中定义接口的关键字是什么 Java中定义接口的关键字是"interface"."interface"是面向对象编程语言中接口操作的关键字,功能是把所需成 ...

  5. java接口有什么用_Java 中的接口有什么作用?好处?

    接口的作用就是把使用接口的人和实现接口的人分开,实现接口的人不必要关心谁去使用,而使用接口的人也不用关心谁实现的接口,由接口将他们联系在一起. 很多JAVA初级程序员对于接口存在的意义很疑惑.不知道接 ...

  6. golang 切片 接口_如何理解Golang中的接口?

    个人认为,要理解 Go 的接口,一定先了解下鸭子模型. 鸭子模型 那什么鸭子模型? 鸭子模型的解释,通常会用了一个非常有趣的例子,一个东西究竟是不是鸭子,取决于它的能力.游泳起来像鸭子.叫起来也像鸭子 ...

  7. java接口是类型吗_JAVA中,接口到底是不是类

    从面向对象的角度来说,接口是一个超越了类的共性的描述,不能把它和类混为一谈 举个例子,现在有磁条卡和IC卡的两种银行卡,它们有很多共性,有卡号,基本是个长方形的薄片,有发卡行的标识等等等,这些共性可以 ...

  8. 理想中的接口自动化项目

    如何评价接口自动化项目 我理想中的接口自动化项目,是有一套脚本,能够100%覆盖核心业务场景,能够回归线上频繁出现的问题,能够支持手工无法验证的场景,能够抛出偶现问题,能够包含容易遗漏的边界场景.异常 ...

  9. vue与php接口对接,怎样使用vue项目中api接口

    这次给大家带来怎样使用vue项目中api接口,使用vue项目中api接口的注意事项有哪些,下面就是实战案例,一起来看一下. 1. 在axiosconfig目录下的axiosConfig.jsimpor ...

最新文章

  1. js中Dom元素及获取方法
  2. 安装很久_快看啦!吊轨推拉门安装图解在这里。
  3. C++中std::function和std::bind
  4. C# 通过socket实现UDP 通信
  5. 天天用Redis,持久化方案你又知道哪些?
  6. 计算机专业学习课程推荐
  7. python基础教程-Python入门教程完整版(懂中文就能学会)
  8. 设计模式(9)----- 创建型模式-----工厂设计模式(抽象工厂模式)
  9. 惯性系统常用坐标系_惯性技术常用坐标系
  10. 三角函数 公式【和差化积、积化和差】最简记忆口诀
  11. Java面试题目和答案
  12. 网络数据传输的节点大全
  13. 微信小程序第三方平台开发配置
  14. 2021最新版IDEA安装(最新版可和谐)
  15. AirpodsPro 使用技巧
  16. 数据,数据对象,数据元素,数据项的关系图
  17. mybatis源码-plugin源码
  18. mac下安装node.js6 ,【并使用zsh】
  19. C#_Ublox指令参照
  20. 看完面经,他拿出一打大厂offer玩起了斗地主,人生不过是如此枯燥乏味....

热门文章

  1. 购物商城Web开发第十二天
  2. H5存储------localStorage和sessionStorage
  3. assert()函数用法
  4. 十七UML核心视图动态视图之时序图
  5. cogs 539. 牛棚的灯
  6. Java 时间 Date类型,Long类型,String类型
  7. linux修改网卡mac
  8. Postmaster主循环的大致流程
  9. DataGrid Web Control 连载之九
  10. 如果使用SD-WAN为客户提供高价值,应该部署哪些安全功能?