пятница, 27 февраля 2015 г.

Python для ПЛИС

В предыдущим посте я упоминал про MyHDL, теперь буду разбираться с этой темой. Библиотека предоставляет псевдоверилоговский синтаксис для Python, благодаря которому можно транслировать написанные блоки на Verilog/VHDL и/или моделировать их, используя встроенные в Python средства(matplotlib) и/или создавать временные диаграммы. Возможностей на самом деле больше, но надо разбираться.

Перед тем, как погружаться в MyHDL, коротко моя сборка Python. Я пользуюсь miniconda 2.7 с установленными из репозитория пакетами numpy, matplotlib, pip (-через cmd в папке /Scrips conda install), установленным через pip spyder(-там же pip install) и скаченным c github myhdl (-cmd > python setup.py install в распакованной папке). Вот необходимый минимум.

На сайте MyHDL много описания и примеров. Моей конечной целью будет переписать CORDIC (снова, опять). Забавное совпадение, что в примерах для MyHDL есть CORDIC. Как раз посмотрю есть ли у меня где-нибудь недочеты.

Единственное новое с чем я столкнулся - декораторы и генераторы в Python. Про декораторы хорошо расписано на хабре, а генераторы по любой ссылке в гугле. Я опущу примеры с сайта MyHDL и начну с "хвоста", то есть в тестбенча.
# -*- coding: utf-8 -*-

from myhdl import *
import matplotlib.pyplot as plt

plt_clk = []
plt_cnt = []
def clkgen():
    global plt_clk, plt_cnt
    r_cnt = Signal(modbv(0, 0, 4))
    r_clock = Signal(bool(0))
    @instance
    def posedge_negedge():
        while True:            
            yield delay(10)
            r_clock.next = 1            
            yield delay(10)
            r_clock.next = 0

    @always(r_clock.posedge)
    def count():
        r_cnt.next = r_cnt + 1

    @instance
    def monitor():
        while True:
            plt_clk.append(int(r_clock))
            plt_cnt.append(int(r_cnt))
            print "%d_%d" %(now(), r_clock)
            yield delay(1)
            

    return posedge_negedge, count, monitor

inst = traceSignals(clkgen)
sim = Simulation(inst)
sim.run(100)


fig, ax = plt.subplots(2,1)
ax[0].plot(plt_clk,'ro-')
ax[1].plot(plt_cnt,'bo-')
fig.tight_layout()

Получившиеся графики в Pthon:
Так же в рабочей папке появится файл .vcd, который можно открыть в gtkwave:

Видно, что результат получился одинаковым, но открывать .vcd файл дольше. В ModelSim тоже можно отрыть .vcd, но сначала нужно сконвертировать vcd2wlf в окне команд ModelSim'а.

Комментариев нет:

Отправить комментарий