欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

MyHDL入门笔记

时间:2023-04-23

MyHDL是一个Python的库,使用Python来开发数字电路。

官网 MyHDL

在python3中,直接使用 pip3 install myhdl 即可安装。

使用python开发,最主要看中python使用比较灵活,最重要也想能否使用python的面向对象的特征,来写硬件模块。闲话少说,我们来看怎么使用myhdl实现一个模块。

MyHDL的文档,我也是看得一知半解,下面的例子,根据自己的感觉总结。

1.首先实现一个模块,模块有端口,在verilog中我们如下方式写一个模块

module mod_name ( port0, port1, ....);endmodule

在MyHDL中定义模块

@blockdef 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.blockdef 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_combif __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/10psmodule 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); endendassign led = cnter[9];endmodule

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。