Облазил кучу форумов, но так и не нашел ничего подобного.
Требуется слать управляющие сигналы (код частоты) от 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
; //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;
}
//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

//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 (не могу найти четкой пошаговой инструкции как это сделать).
Буду рад любым замечаниям, предложениям и советам.