17. АО ПКК «Миландр». ТСКЯ.431281.002СП. Сигнальный процессор со статической суперскалярной архитектурой 1967ВН028, К1967ВН028, К1967ВН028К, 1967ВН02Н4, К1967ВН02Н4.
18. Altera. Analog Devices Link-Port Reference Design. – https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/an/an332.pdf
19. Altera. Design Guidelines for Implementing LVDS Interfaces in Cyclone Series Devices.– https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/an/an479.pdf
20. Денисов А. О документировании проектов для ПЛИС // Компоненты и технологии. 2010, вып. № 9. С. 70–72.
21. ГОСТ 19.101–77. Единая система программной документации (ЕСПД). Виды программ и программных документов (с Изменением N 1). М.: Стандартинформ, 2010.
22. ГОСТ 19.103–77. ГОСТ 19.103-77 ЕСПД. Обозначения программ и программных документов. М.: Стандартинформ, 2010
Рисунок А.1 – Начало системы, HPS и первые два блока памяти
Рисунок А.2 – Остальные используемые блоки памяти и служебные блоки сиcтемы
Рисунок А.3 – Конец системы
/* Creates a datagram server. The port
number is passed as an argument. This
server runs forever */
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include "hwlib.h"
#include "socal/socal.h"
#include "socal/hps.h"
#include "socal/alt_gpio.h"
#include "hps_0.h"
volatile uint8_t * ocm_service = NULL ;
volatile uint16_t* ocm_input_re = NULL ;
volatile uint16_t* ocm_input_im = NULL ;
volatile uint32_t * ocm_output_re = NULL ;
#define LOW_ADDRESS 0x0000FFFF
#define HIGH_ADDRESS 0xFFFF0000
#define HW_REGS_BASE ( ALT_STM_OFST )
#define HW_REGS_SPAN ( 0x04000000 )
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )
void error(const char *msg) {
perror(msg);
exit(0);
}
int main(int argc, char *argv[]) {
//for ocm mapping
void *virtual_base;
int fd;
int addr;
//for UDP
int serviceSuccess, dataSuccess;
int sock, length, n;
socklen_t fromlen;
struct sockaddr_in server;
struct sockaddr_in from;
uint8_t dgramService[5];
uint32_t dgramData[256];
uint32_t dgramOutput[512];
uint16_t dataLength = 0x0;
char ack_buffer[256];
if (argc < 2) {
fprintf(stderr, "error: no port provided\n");
exit(0);
}
//opening dev/mem
if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
printf( "error: could not open \"/dev/mem\"...\n" );
return( 1 );
}
//mapping
virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );
if( virtual_base == MAP_FAILED ) {
printf( "error: mmap() failed...\n" );
close( fd );
return( 1 );
}
//initializing ocm base address
ocm_service = (uint8_t*)(virtual_base + ((unsigned long)(ALT_LWFPGASLVS_OFST + OCM_SERVICE_BASE) & (unsigned long)(HW_REGS_MASK)));
ocm_input_re = (uint16_t*)(virtual_base + (( unsigned long)(ALT_LWFPGASLVS_OFST + OCM_DATA_INPUT_RE_BASE) & (unsigned long)(HW_REGS_MASK)));
ocm_input_im = (uint16_t*)(virtual_base + ((unsigned long)(ALT_LWFPGASLVS_OFST + OCM_DATA_INPUT_IM_BASE) & (unsigned long)(HW_REGS_MASK)));
ocm_output_re = (uint32_t*)(virtual_base + (( unsigned long)(ALT_LWFPGASLVS_OFST + OCM_DATA_OUTPUT_RE_BASE) & (unsigned long)(HW_REGS_MASK)));
//opening socket, initializing server
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
error("error: opening socket");
length = sizeof(server);
bzero(&server,length);
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(atoi(argv[1]));
if (bind(sock,(struct sockaddr *)&server,length)<0)
error("binding");
fromlen = sizeof(struct sockaddr_in);
//clearing the buffers
for (n = 0; n < 5; n++) dgramService[n] = 0x00;
for (n = 0; n < 256; n++) dgramData[n] = 0x00000000;
while (1) {
//waiting for service datagram
puts("Waiting for service...");
//receiving service datagram
serviceSuccess = recvfrom(sock, dgramService,5,0,
(struct sockaddr *)&from, &fromlen);
if (serviceSuccess < 0) error("recvfrom, service");
puts("Received a service datagram: ");
for (n = 0; n < 5; n++) printf("%04X ", dgramService[n]);
putchar('\n');
//letting client know we received the service datagram
n = sendto(sock, "Got service", 11, 0, (struct sockaddr *)&from,fromlen);
if (n < 0) error("sendto service"); */
//waiting for data datagram
puts("Waiting for data...");
//receiving data datagram
dataSuccess = recvfrom(sock,dgramData,1024,0,
(struct sockaddr *)&from,&fromlen);
if (dataSuccess < 0) error("recvfrom, data");
//printing received data
puts("Received a data datagram: ");
for (n = 0; n < 256; n++) if (dgramData[n] & 0xFFFFFFFF)
printf("%08X ", dgramData[n]);
putchar('\n');
//letting client know we received the data datagram
n = sendto(sock, "Got data", 8, 0, (struct sockaddr *)&from,fromlen);
if (n < 0) error("sendto data");
puts("Press enter");
getchar();
//getting data length
dataLength = (uint16_t)((dgramService[3] << 8) & 0xFF00) | (uint16_t)((dgramService[4]) & 0x00FF);
printf("dataLength = %d %08X\n", dataLength, dataLength);
//putting info into ocm
for (addr = 0; addr < 5; addr++)
*(ocm_service+addr) = dgramService[addr];
for (addr = 0, n = 0; addr < 256; addr++) {
*(ocm_input_im+addr) = (uint16_t)(dgramData[n] & LOW_ADDRESS);
*(ocm_input_re+addr) = (uint16_t)((dgramData[n] & HIGH_ADDRESS) >> 16);
n++;
}
puts("Press enter to look at ocm");
getchar();
//looking at ocm
for (addr = 0; addr < 5; addr++)
printf("Service address: %d, content: %d %08X\n", addr, (*(ocm_service+addr)), (*(ocm_service+addr)));
for (addr = 0; addr < 256; addr++)
printf("Input address: %d, content: %d %08X\n", addr, (*(ocm_input_re+addr)), (*(ocm_input_re+addr)));
for (addr = 0; addr < 256; addr++)
printf("Input address: %d, content: %d %08X\n", addr, (*(ocm_input_im+addr)), (*(ocm_input_im+addr)));
for (addr = 0; addr < dataLength; addr++)
printf("Output address: %d, content: %d %08X\n", addr, (*(ocm_output_re+addr)), (*(ocm_output_re+addr)));
//waiting for signal to form output datagram
puts("Press enter to send output back to client");
getchar();
//forming the output datagram
for (addr = 0; addr < dataLength; addr++)
{
dgramOutput[addr] = (*(ocm_output+addr));
}
//sending the output datagram to client
n = sendto(sock,dgramOutput,dataLength*4,0, (struct sockaddr *)&from,fromlen);
if (n < 0) error("sendto output");
//getting an ack from the client that it received the datagram
n = recvfrom(sock, ack_buffer,256,0,
(struct sockaddr *)&from,&fromlen);
if (n < 0) error("recvfrom output");
write(1,"Got an ack: ",12);
write(1,ack_buffer,n);
puts("Press enter");
getchar();
}
return 0;
}
Рисунок В.1 – Подмодуль eth_service
Рисунок В.2 – Подмодуль eth_read
Рисунок В.3 – Подмодуль eth_write
Рисунок Г.1 – Начало моделирования
Рисунок Г.2 – Появление первого квадрослова на FPGA-приемнике
Рисунок Г.3 – Начало выдачи квадрослов на имитации DSP-приемника
Рисунок Г.4 – Конец приема FPGA-приемника
Рисунок Г.5 – конец приема имитации DSP-приемника
Таблица Д.1 – Назначение контактов модуля сопряжения с Link
Контакт разъема |
Цепь на схеме |
Номер pin ПЛИС |
Сигнал Verilog |
Сигнал |
|
J10.1 |
GPIO0 |
L13 |
|
|
|
J10.2 |
GPIO1 |
L16 |
|
DI[3] |
DI 3 n |
J10.3 |
GPIO2 |
L15 |
gpio[2] |
DI 3 p |
|
J10.4 |
GPIO3 |
K16 |
|
|
|
J10.5 |
GPIO4 |
P16 |
|
CLKI |
CLKI n |
J10.6 |
GPIO5 |
R16 |
gpio[5] |
CLKI p |
|
J10.7 |
GPIO6 |
N16 |
|
CLKO |
CLKO n |
J10.8 |
GPIO7 |
N15 |
gpio[7] |
CLKO p |
|
J10.9 |
GPIO8 |
N14 |
|
|
|
J10.10 |
GPIO9 |
P15 |
|
|
|
J10.11 |
VCC_5V_GPIO |
--- |
|
|
|
J10.12 |
GND |
--- |
|
|
|
J10.13 |
GPIO10 |
N8 |
gpio[10] |
ACKO |
ACKO |
J10.14 |
GPIO11 |
P8 |
gpio[11] |
ACKI |
ACKI |
J10.15 |
GPIO12 |
M8 |
gpio[12] |
BCMPI |
BCMPI |
J10.16 |
GPIO13 |
L8 |
|
BCMPO |
BCMPO |
J10.17 |
GPIO14 |
R7 |
gpio[14] |
DO[0] |
DO 0 p |
J10.18 |
GPIO15 |
T7 |
gpio[13] |
DO 0 n |
|
J10.19 |
GPIO16 |
L7 |
|
|
|
J10.20 |
GPIO17 |
M7 |
|
|
|
J10.21 |
GPIO18 |
R6 |
gpio[18] |
DO[1] |
DO 1 p |
J10.22 |
GPIO19 |
T6 |
|
DO 1 n |
|
J10.23 |
GPIO20 |
T2 |
|
|
|
J10.24 |
GPIO21 |
M6 |
|
|
|
J10.25 |
GPIO22 |
R5 |
gpio[22] |
DO[2] |
DO 2 p |
J10.26 |
GPIO23 |
T5 |
|
DO 2 n |
|
J10.27 |
GPIO24 |
N5 |
gpio[24] |
DO[3] |
DO 3 p |
J10.28 |
GPIO25 |
N6 |
|
DO 3 n |
|
J10.29 |
VCC_3.3V |
--- |
|
|
|
J10.30 |
GND |
--- |
|
|
|
J10.31 |
GPIO26 |
R4 |
|
|
|
J10.32 |
GPIO27 |
T4 |
|
|
|
J10.33 |
GPIO28 |
N3 |
gpio[28] |
DI[0] |
DI 0 p |
J10.34 |
GPIO29 |
P3 |
|
DI 0 n |
|
J10.35 |
GPIO30 |
R3 |
gpio[30] |
DI[1] |
DI 1 p |
J10.36 |
GPIO31 |
T3 |
|
DI 1 n |
|
J10.37 |
GPIO32 |
P6 |
|
|
|
J10.38 |
GPIO33 |
P2 |
gpio[33] |
DI[2] |
DI 2 p |
J10.39 |
GPIO34 |
P1 |
|
DI 2 n |
|
J10.40 |
GPIO35 |
R1 |
|
|
|