Перейти к содержанию
    

doc17

Свой
  • Постов

    24
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о doc17

  • Звание
    Участник
    Участник

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

2 948 просмотров профиля
  1. Примерно так, если я верно понял, что нужно: LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY pwm_sawtooth IS GENERIC( sys_clk : INTEGER := 50_000_000; pwm_freq : INTEGER := 100_000; bits_resolution : INTEGER := 8; phases : INTEGER := 1 ); PORT( clk : IN STD_LOGIC; reset_n : IN STD_LOGIC; ena : IN STD_LOGIC; pwm_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0); pwm_n_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0); direction : IN STD_LOGIC -- set sawtooth direction: 0 - rising, 1 - falling ); END pwm_sawtooth; ARCHITECTURE logic OF pwm_sawtooth IS -- Components used in the design COMPONENT pwm GENERIC( sys_clk : INTEGER := 50_000_000; pwm_freq : INTEGER := 100_000; bits_resolution : INTEGER := 8; phases : INTEGER := 1 ); PORT( clk : IN STD_LOGIC; reset_n : IN STD_LOGIC; ena : IN STD_LOGIC; duty : IN STD_LOGIC_VECTOR(bits_resolution-1 DOWNTO 0); pwm_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0); pwm_n_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0) ); END COMPONENT; -- Entity variables SIGNAL duty: STD_LOGIC_VECTOR(bits_resolution-1 DOWNTO 0); BEGIN -- PWM module connection pwm_cmp: pwm GENERIC MAP( sys_clk => sys_clk, pwm_freq => pwm_freq, bits_resolution => bits_resolution, phases => phases ) PORT MAP( clk => clk, reset_n => reset_n, ena => ena, duty => duty, pwm_out => pwm_out, pwm_n_out => pwm_n_out ); -- Sawtooth counter PROCESS(clk, reset_n) BEGIN IF(reset_n = '0') THEN duty <= (OTHERS => '0'); ELSIF(rising_edge(clk)) THEN IF(direction = '0') THEN duty <= duty + '1'; ELSE duty <= duty - '1'; END IF; END IF; END PROCESS; END logic; А вот тестбенч (на верилоге для простоты): // Testbench for PWM_SAWTOOTH module module pwm_sawtooth_tb; reg clk, reset_n; wire ena = 1'b1; reg direction; initial begin clk = 1'b0; reset_n = 1'b0; direction = 1'b0; #1 reset_n = 1'b1; #1000 direction = 1'b1; end pwm_sawtooth DUT ( .clk, .reset_n, .ena, //pwm_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0); //pwm_n_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0); .direction ); endmodule // pwm_sawtooth_tb
  2. Обращаться можно, но в данном случае Вам нужно использовать в пакете parameter PI = 3.14; вместо макроса. Макросы - это тупая автоподстановка текста (как "поиск-замена" в тектовом редакторе), она ортогональна иерархии типов и объектов языка. Макрос может быть объявлен где угодно (внутри или вне package/module/etc) и применён где угодно. Чтобы сработал макрос, нужно написать `include "<первый_файл.sv>" перед module, но в данном случае это явно не то, что Вы хотите.
  3. interface boobs_intf #( parameter BoobSize = 6 )( input logic CLK, input logic RESETn ); logic [BoobSize-1:0] LEFT_BOOBIE; logic [BoobSize-1:0] RIGHT_BOOBIE; modport woman ( input CLK, RESETn, output LEFT_BOOBIE, RIGHT_BOOBIE ); modport man ( input CLK, RESETn, input LEFT_BOOBIE, RIGHT_BOOBIE ); endinterface // boobs_intf module oh_pretty_woman #( parameter BoobSize = 6 )( boobs_intf.woman boobs ); wire [BoobSize-1:0] pleasure = 100; always_ff@(posedge boobs.CLK, negedge boobs.RESETn) if(!boobs.RESETn) begin boobs.LEFT_BOOBIE <= 'b0; boobs.RIGHT_BOOBIE <= 'b0; end else begin boobs.LEFT_BOOBIE <= pleasure; boobs.RIGHT_BOOBIE <= pleasure; end endmodule // oh_pretty_woman module flower_garden #( parameter CollegeSize = 128, parameter BoobSize = 6 )( boobs_intf.woman boobs[CollegeSize+3-1:0] ); // Girls-next-door oh_pretty_woman #(.BoobSize(BoobSize)) girl1(.boobs(boobs[0])); oh_pretty_woman #(.BoobSize(BoobSize)) girl2(.boobs(boobs[1])); oh_pretty_woman #(.BoobSize(BoobSize)) girl3(.boobs(boobs[2])); // City college generate genvar i; for(i = 0; i < CollegeSize; i++) begin oh_pretty_woman #(.BoobSize(BoobSize)) student(.boobs(boobs[i+3])); end endgenerate endmodule // flower_garden module user #( parameter GirlAmount = 128+3, parameter BoobSize = 0 )( boobs_intf.man boobs[GirlAmount-1:0] ); reg [GirlAmount*BoobSize*2-1:0] fun; generate genvar i; for(i = 0; i < GirlAmount; i++) begin always_ff@(posedge boobs[i].CLK, negedge boobs[i].RESETn) if(!boobs[i].RESETn) begin fun[i*BoobSize*2 +: BoobSize*2] <= 'b0; end else begin fun[i*BoobSize*2 +: BoobSize] <= boobs[i].LEFT_BOOBIE; fun[(i*2+1)*BoobSize +: BoobSize] <= boobs[i].RIGHT_BOOBIE; end end endgenerate endmodule // user module night_party(); localparam CollegeSize = 128; localparam GirlsNextDoor = 3; localparam BoobSize = 6; wire CLK, RESETn; boobs_intf boobs[CollegeSize+GirlsNextDoor-1:0](.CLK(CLK), .RESETn(RESETn)); flower_garden #(.CollegeSize(CollegeSize), .BoobSize(BoobSize)) garden(.*); user #(.GirlAmount(CollegeSize+GirlsNextDoor), .BoobSize(BoobSize)) usr(.*); endmodule // night_party
  4. А разве RAW формат жёстко стандартизован ? Подобную задачу я решал именно так, как описал Builder. Файлы обрабатывались IrfanView - он понимает RAW с любым порядком и разрядностью цвета (параметры задаются вручную). Любая картинка -> приводим размер к нужному в Irfanview -> сохраняем в RAW (RGB 8 bit) -> модуль на Verilog читает файл и выдаёт картинку тестируемому -> выход пишется другим модулем в RAW -> открываем RAW в Irfanview и смотрим. Для пущей радости можно всё это делать скриптом (в мейкфайле например) - у Irfanview операции доступны через командную строку. Под юниксами подойдёт ImageMagick или XnView.
  5. У Вас случсайно вместе два Quartus'a не стоят? Когда 5.1 и 6.0 вместе были установлены, то вообще некоторые узлы из проекта в симулятор не добалялись- писал критическая ошибка и выбрасывал из программы. Стер старый квартус- и все в порядке!
  6. У нас был случай (правда на устаревшем ныне APEX20KE) что проект нормально работал на 120-150МГц без использования SignalTap, а при его добавлении частота в 100МГц уже давала непонятные результаты (даже помехами это сложно было назвать). Собственно это вполне логично объясняется тем, что под SignalTap необходимо выделять ресурсы ПЛИС. И увеличивая количество сигналов и глубину просмотра, увеличиваем требуемое количество ресурсов.
  7. Если неохота вставлять виртуальные пины, то можно сразу посмотреть содержимое нужного регистра: В симуляторе стандартно Insert Node or Bus-> Node Finder-> выбрать " Registers Pre-synthesis" и указать название регистра как в блоке проекта (лучше имя указывать как "*name*" т.к. в начале добавляются имя проекта и блока )
  8. Насколько я понял сейчас отладка идет на функцианальном или временном уровне. После этого можно посмотреть как все это будет работать на реальном железе (естественно при его наличии). Для этого своетую испоьзовать SignalTap (Tools-> SignalTap Logic Analizer) В Signal Configuration выбираете clock, по которому будет просмотр и запись сигналов, глубину просмотра (Sample Depth), а в окне SETUP добавляете сигналы, которые требуется посмотреть, а также выставляете условие, по которому производить начало записи (напр. по положительному фронту какого-ниб сигнала), нажимаете Run и готово!
  9. Можно посмотреть нужный сигнал и через Output Port, но лучше его объявить виртуальным: выбираете пин, правая клавиша мыши-> locate->locate in assignment editor-> в поле "Assignment name" выбрать "Virtual Pin" , затем в поле Value выбрать "On" и сохраниться (Ctrl+S) Это позволит вставить куда нужно виртуальные пины, не загромождая настоящими контактами проект, а также смотреть реальный сигнал в данный момент времени (без учета задержек, связанных с прохождением сигнала из ячейки до настоящего пина через матрицу соединений)
  10. Нет ли кого-нибудь кто уже работал с Celoxica? А то столько пишут про нее, а реальных отзывов не видно. Может вообще нет смысла этим направлением заниматься?
  11. Чего-то не могу себе представить, что FIFO , будет работать с двумя абсолютно разными clock'ами используя только логические ячейки. На мой взгляд, если работаешь с разными клоками, то единственный шанс сделать для них FIFO- это использовать двухпортовую память, а не пытаться завести два клока на один регистр.
  12. А какой версией Quartus'a ты пользуешься? Может просто глючная версия? Не знаю как с ACEX, но с APEX'ами Quartus II 6.0 нормально работает, хотя они тоже порядком устарели. Я также заметил, что если стоят две версии Q, то их очень глючит (причем как правило более новую версию) А MaxPlusII морально себя изжил еще пару лет назад.
  13. Quartus II 6.0 можно скачать с сайта альтеры, причем полную версию. Не знаю как 5.0, но 5.1 меня достал основательно- глючил нереально, что я с ним только не делал... А с шестой версией все нормально работает, даже без SP1
×
×
  • Создать...