日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

matlab verilog 接口,使用SystemVerilog简化FPGA中的接口

發布時間:2025/5/22 154 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab verilog 接口,使用SystemVerilog简化FPGA中的接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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中的接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。