MyHDL是一个Python的库,使用Python来开发数字电路。
官网 MyHDL
在python3中,直接使用 pip3 install myhdl 即可安装。
使用python开发,最主要看中python使用比较灵活,最重要也想能否使用python的面向对象的特征,来写硬件模块。闲话少说,我们来看怎么使用myhdl实现一个模块。
MyHDL的文档,我也是看得一知半解,下面的例子,根据自己的感觉总结。
1.首先实现一个模块,模块有端口,在verilog中我们如下方式写一个模块
module mod_name (
port0,
port1,
....
);
endmodule
在MyHDL中定义模块
@block
def mod_name( port0, port1, ...):
pass
使用block装饰器修饰这个函数,函数就是模块
2.在Verilog模块中,定义端口的属性:输入输出。在MyHDL中的模块函数中不需要定义
3.verilog中使用always和assign描述逻辑关系,在MyHDL中在模块中定义函数
如下图实现寄存器自加
reg [15:0] cnter;
always @(posedge clk or negedge sys_reset_n)
if(!sys_reset_n)
cnter <= 16'h0;
else
cnter <= cnter + 1
在MyHDL中
cnter = myhdl.Signal(myhdl.modbv(0)[16:])
@myhdl.always_seq(clk.posedge, reset=sys_reset)
def logic():
cnter.next = cnter + 1
接下来,使用MyHDL编写一个闪灯模块
import myhdl
@myhdl.block
def led_blinker(sys_clk, sys_reset, led):
cnter = myhdl.Signal(myhdl.modbv(0)[10:])
@myhdl.always_seq(sys_clk.posedge, reset=sys_reset)
def logic():
cnter.next = cnter + 1
@myhdl.always_comb
def logic_comb():
led.next = cnter[9]
return logic, logic_comb
if __name__ == '__main__':
clk = myhdl.Signal(bool(0))
reset = myhdl.ResetSignal(0,active=0,isasync=True)
led = myhdl.Signal(bool(0))
inst = led_blinker(clk, reset, led)
inst.convert(hdl='Verilog')
运行后生成Verilog代码如下
// File: led_blinker.v
// Generated by MyHDL 0.11
// Date: Thu Feb 24 18:42:15 2022
`timescale 1ns/10ps
module led_blinker (
sys_clk,
sys_reset,
led
);
input sys_clk;
input sys_reset;
output led;
wire led;
reg [9:0] cnter;
always @(posedge sys_clk, negedge sys_reset) begin: LED_BLINKER_LOGIC
if (sys_reset == 0) begin
cnter <= 0;
end
else begin
cnter <= (cnter + 1);
end
end
assign led = cnter[9];
endmodule