前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyHDL,体验一下“用python设计电路”

MyHDL,体验一下“用python设计电路”

作者头像
ExASIC
发布2022-03-29 14:14:48
6310
发布2022-03-29 14:14:48
举报
文章被收录于专栏:ExASIC

写代码:

下面的myhdl代码写了一个模块top,里面有两个计数器:cnt1从0计到9,当cnt1=9时,cnt2从0计到4。

代码语言:javascript
复制
from myhdl import *

@block
def top(cnt1, cnt2, clk, rst_n):
    """
    this is an example of counter
    """

    @always_seq(clk.posedge, reset=rst_n)
    def counter1():
        if cnt1 == 9:
            cnt1.next = 0
        else:
            cnt1.next = cnt1 + 1

    @always(clk.posedge, rst_n.negedge)
    def counter2():
        if rst_n == 0:
            cnt2.next = 5
        elif cnt1 == 9:
            if cnt2 == 4:
                cnt2.next = 0
            else:
                cnt2.next = cnt2 + 1

    return counter1, counter2

从上面的代码可以看到其实与verilog非常接近,只是复位和时钟在python装饰器always和always_seq里实现了。另一个特殊点是,给一个信号赋值需要用xxx.next,这样就描述了DFF的功能,赋的值下一个时钟生效。

转Verilog:

我们用下面的方法来把myhdl转成verilog:

代码语言:javascript
复制
def convert():
    cnt1 = Signal(intbv(0,0,16))
    cnt2 = Signal(intbv(0,0,8))
    clk = Signal(bool(0))
    rst_n = ResetSignal(0, active=0, isasync=True)
    dut = top(cnt1, cnt2, clk, rst_n)
    dut.convert(hdl='verilog')

convert()

直接上效果,不解释了,大家自己看:

代码语言:javascript
复制
// File: top.v
// Generated by MyHDL 0.11
// Date: Sat Feb 26 21:29:06 2022

`timescale 1ns/10ps

module top (
    cnt1,
    cnt2,
    clk,
    rst_n
);
// this is an example of counter

output [3:0] cnt1;
reg [3:0] cnt1;
output [2:0] cnt2;
reg [2:0] cnt2;
input clk;
input rst_n;

always @(posedge clk, negedge rst_n) begin: TOP_COUNTER1
    if (rst_n == 0) begin
        cnt1 <= 0;
    end
    else begin
        if ((cnt1 == 9)) begin
            cnt1 <= 0;
        end
        else begin
            cnt1 <= (cnt1 + 1);
        end
    end
end

always @(posedge clk, negedge rst_n) begin: TOP_COUNTER2
    if ((rst_n == 0)) begin
        cnt2 <= 5;
    end
    else if ((cnt1 == 9)) begin
        if ((cnt2 == 4)) begin
            cnt2 <= 0;
        end
        else begin
            cnt2 <= (cnt2 + 1);
        end
    end
end

endmodule

写验证环境,仿真:

代码语言:javascript
复制
from random import randrange

def testbench():

    cnt1 = Signal(intbv(0,0,16))
    cnt2 = Signal(intbv(0,0,8))
    clk = Signal(bool(0))
    rst_n = ResetSignal(0, active=0, isasync=True)

    dut = top(cnt1, cnt2, clk, rst_n)

    @always(delay(10))
    def clkgen():
        clk.next = not clk

    @instance
    def rstgen():
        yield delay(15)
        rst_n.next = 1

    return dut, clkgen, rstgen

def simulate(timesteps):
    tb = traceSignals(testbench)
    sim = Simulation(tb)
    sim.run(timesteps)

simulate(2000)

与Verilog的验证环境没有太大区别,实例化、编写时钟、复位等激励,设置dump波形,仿真时间等。

看波形:

运行后目录下产生testbench.vcd。用Verdi打开如下图:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ExASIC 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档