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中的接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电镀用整流电源设计matlab,基于MA
- 下一篇: mysql ignore index,m