Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программирование FIFO
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
verali
Здравствуйте! Совершенно запутался из-за малого опыта работы с процессорами, но надеюсь разобраться!
Облазил кучу форумов, но так и не нашел ничего подобного.
Требуется слать управляющие сигналы (код частоты) от dsp процессора по spi на ip-ядро nco, а после NCO планируется уже использовать умножитель, блок фильтров и spi-master.
В предыдущей теме посоветовали самому написать мастер шины Avalon, но из-за непонимания что это такое и зачем нужно решил воспользоваться Ниосом(Nios требуется только для управления ) и по ходу дела начать разбираться с процессором, а так же подтянуть знания в программировании на Си.
Так как NIOS с NCO напрямую не соединить, требуется использовать “переход” AvMM-AvST, роль которого у меня выполняет fifo.
Начал разбираться с блоком fifo, и для начала собрал систему, которая из nios отправляет данное число в fifo_1 (AvMM-AvST), после это число отсылаю на внешние пины PIO(AvMM) благодаря второй fifo_2 (AvST-AvMM).
Интуитивно (так как не нашел примеров) использовал следующие API:
1) altera_avalon_fifo_init – инициализация фифо
2) altera_avalon_fifo_write_fifo – запись в фифо
3) altera_avalon_fifo_read_fifo – чтение из фифо

CODE
/***********************************************************************/
//Includes
#include "io.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_fifo_regs.h"
#include "altera_avalon_fifo_util.h"
#include "system.h"
#include "sys/alt_irq.h"
#include <stdio.h>
#include <stdlib.h>
#define ALMOST_EMPTY 2
#define ALMOST_FULL FIFO_0_IN_CSR_FIFO_DEPTH-3

int main(){
/*
//First FIFO (AvMM - AvST)
int a, b, c, d, e, g, h;
//initializes the FIFO

a = altera_avalon_fifo_init(FIFO_0_IN_CSR_BASE, //the base address of the FIFO control slave
0, //the value to write to the interruptenable register
ALMOST_EMPTY, //the value for the almost empty threshold (порог) level
ALMOST_FULL); //the value for the most full threshold level

//write a, b into fifo

b = 0xff;
c = altera_avalon_fifo_write_fifo(FIFO_0_IN_BASE, //the base address of the fifo write slave
FIFO_0_IN_CSR_BASE, //the base address of the fifo control slave
cool.gif; //value to write to address

//read a,b from fifo
d = altera_avalon_fifo_read_fifo(FIFO_0_IN_BASE, //the base address of the fifo read slave
FIFO_0_IN_CSR_BASE); //the base address of the fifo control slave




//Second FIFO (AvST - AvMM)

//initializes the FIFO
e = altera_avalon_fifo_init(FIFO_1_IN_CSR_BASE, //the base address of the FIFO control slave
0, //the value to write to the interruptenable register
ALMOST_EMPTY, //the value for the almost empty threshold (порог) level
ALMOST_FULL); //the value for the most full threshold level

//write d into fifo

g = altera_avalon_fifo_write_fifo(FIFO_1_OUT_BASE, //the base address of the fifo write slave
FIFO_1_IN_CSR_BASE, //the base address of the fifo control slave
d); //value to write to address

//read e,f from fifo
h = altera_avalon_fifo_read_fifo(FIFO_1_OUT_BASE, //the base address of the fifo read slave
FIFO_1_IN_CSR_BASE); //the base address of the fifo control slave

*/


// external PIO (AvMM)

IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, h);

return 0;
}


Моделирование провожу в ModelSim.
Нажмите для просмотра прикрепленного файла
По осциллограммам видно, что в fifo ничего не пишется. Есть предположение, что неправильно использую API (столкнулся впервые) или не до конца проинициализировал fifo (не могу найти четкой пошаговой инструкции как это сделать).
Буду рад любым замечаниям, предложениям и советам.
Swup
Так, как-то без прошлой темы не очень понятно)
1. У вас есть мегафункция NCO и вы хотите менять на ней фазовый икремент (там для этого есть порт)
2. У вас есть SPI который вы делает в qsys. процессором вы получаете этот фазовый инкремент из spi от dsp.
3. Далее вам необходимо из процессора выставить это полученное число (вынув из qsys) на порт NCO.

Поправьте где я вас неправильно понял.

ну и сразу вопрос такой у вас сейчас такая фигня cpu_mm -> fifo_mm_st -> fifo_st_mm ->pio_mm чтобы вывести одно число? почему не cpu-> pio напрямую?

ПС у меня в qsys 12 и 13 квартуса нет NCO, может в 14 он есть и он имеет интерфейс ST? или его надо ставить отдельно?
verali
Цитата(Swup @ Feb 27 2015, 13:39) *
Так, как-то без прошлой темы не очень понятно)

Да, извините.
http://electronix.ru/forum/index.php?showt...25066&st=30
В теме я только начинал разбираться с шиной Avalon.
Цитата(Swup @ Feb 27 2015, 13:39) *
1. У вас есть мегафункция NCO и вы хотите менять на ней фазовый икремент (там для этого есть порт)

Блок NCO, NIOS, FIFO и PIO - компоненты QSYS (Quartus 14.1). Как я понимаю, они являются теми же ip ядрами, что и в Визарде.
Цитата(Swup @ Feb 27 2015, 13:39) *
2. У вас есть SPI который вы делает в qsys. процессором вы получаете этот фазовый инкремент из spi от dsp.

Да, SPI(slave) - компонент qsys. Связь DSP и ПЛИС осуществляется по SPI.
Соответственно DSP имеет интерфейс SPI - master, а ПЛИС spi - slave.
Цитата(Swup @ Feb 27 2015, 13:39) *
3. Далее вам необходимо из процессора выставить это полученное число (вынув из qsys) на порт NCO.

Да, все верно.
Цитата(Swup @ Feb 27 2015, 13:39) *
ну и сразу вопрос такой у вас сейчас такая фигня cpu_mm -> fifo_mm_st -> fifo_st_mm ->pio_mm чтобы вывести одно число? почему не cpu-> pio напрямую?
ПС у меня в qsys 12 и 13 квартуса нет NCO, может в 14 он есть и он имеет интерфейс ST? или его надо ставить отдельно?

Да, вы правы.
Компонент NCO в Quartus 14.1 находится в Qsys, поэтому я решил эту систему собирать именно в ней.
Так как шина Nios'а имеет тип AvMM, а NCO (тот, который в qsys) AvST, то требуется так называемый переход (AvMM-AvST)
Но перед подключением SPI и NCO я решил поработать с fifo напрямую и попытаться записать число в ФИФО и его же считать. Поэтому и сделал переход FIFO_1 (AvMM-AvST) -> FIFO_2 (AvST -> AvMM)
Swup
Вероятно вы неправильно что-то делаете. например настораживает, что на вашем скриншоте не меняются управляющие сигналы.
Я не сталкивался с такими проблемами, как-то всегда использовал фифо ST-ST.

Ну ваша идея понятна, но мне как-то не нравится такое решение. Может кто еще посоветует что-нибудь. Я бы написал адаптер свой из мм в ст. При том что в этом ничего сложного нет.
Посоветовал бы вам в первую очередь поплотнее познакомиться с интерфейсами, а так же с тем как добавить свой модуль в qsys. Уверяю вас в этом нет ничего сложного.
Вот пара ссылок:
http://www.altera.com/literature/manual/mnl_avalon_spec.pdf
ftp://ftp.altera.com/up/pub/Altera_Materi..._components.pdf

ПС про мастер шины Avalon
Avalon mm - интерфейс передачи типа мастер-подчиненный (master - slave). Мастер этот порт на шине который инициирует передачу. Например cpu - мастер, а PIO - slave.
Golikov A.
сигнал reset_n - это точно инверсный сброс?
подняв его в 1 вы не ввели блоки фифо в состояние сброса?
verali
Цитата(Swup @ Feb 27 2015, 15:22) *
Вероятно вы неправильно что-то делаете. например настораживает, что на вашем скриншоте не меняются управляющие сигналы.
Я не сталкивался с такими проблемами, как-то всегда использовал фифо ST-ST.

Ну ваша идея понятна, но мне как-то не нравится такое решение. Может кто еще посоветует что-нибудь. Я бы написал адаптер свой из мм в ст. При том что в этом ничего сложного нет.
Посоветовал бы вам в первую очередь поплотнее познакомиться с интерфейсами, а так же с тем как добавить свой модуль в qsys. Уверяю вас в этом нет ничего сложного.
Вот пара ссылок:
http://www.altera.com/literature/manual/mnl_avalon_spec.pdf
ftp://ftp.altera.com/up/pub/Altera_Materi..._components.pdf

ПС про мастер шины Avalon
Avalon mm - интерфейс передачи типа мастер-подчиненный (master - slave). Мастер этот порт на шине который инициирует передачу. Например cpu - мастер, а PIO - slave.

Cейчас мне интересно собрать всю систему в qsys и управление сделать в nios, тем более qsys это позволяет сделать, а так как в программировании я не не очень силен - поднять skill в написании кода на Си с использованием API.


Цитата(Golikov A. @ Feb 27 2015, 15:31) *
сигнал reset_n - это точно инверсный сброс?
подняв его в 1 вы не ввели блоки фифо в состояние сброса?

Да, очень может быть. Посмотрю по-подробнее на работе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.