Программируемая логика - это не так уж и сложно. Разберемся вместе.
Чт ноя 07, 2013 17:09:49
ПЛИС - epm240 распаяная в микромодуле. Перед первым пуском плисины плату тщательно проверял на правильность.
Дело в том, что это второй раз в жизни прошивал плис, и эта тема (как и сама технология) пока для меня является тёмным лесом полным загадок.
Книжки читал, первый раз прошивал по инструкции, как и сам код писал. Так же как и по инструкции назначал всякие пины (в квартусе). Но в инструкции ни слова как повторно перепрошивать. Стирать его или нет??? и как стирать память. или он автоматом память очищает перед новой прошивкой.
Чт ноя 07, 2013 19:39:02
Ну что ж, теперь хоть производителя узнали - Altera. Теперь надо выяснить, что ты под фразой "прошить ПЛИС" подразумеваешь? Ты флеш память программируешь или просто конфигурируешь саму ПЛИС?
Чт ноя 07, 2013 19:40:29
А.. прошу прощения... всё ясно. Надо покумекать... Вообще, здесь несколько может быть вариантов. Но перво наперво в Pin Planner посмотри, точно ли ноги назначены. Эт раз. Во вторых было и у меня нечто похожее... Приведи кусок кода тех сигналов, которые не на своих ногах. И ещё какая частота рабочая? Мне честно говоря с алтеровскими CPLD особо не приходилось ковыряться, но уверен, что принцип тот же что и при прошивки флешки. Её можно как стереть, так и запрограммировать. Естественно, перед тем как туда новую прошивку положить, её желательно отчистить.
Пт ноя 08, 2013 16:08:56
Стер память, потом снова залил прошивку. Все равно както не адыкватно работает.
1-Сигнал
bclk не проходит через плис. В нутри плис этот сигнал присутствует, так как без него сплитер не работал, и данные дата не инвертировал бы. Его просто нет на выходе. пин41 и пин55.
2-
reset_out неправильно работает. На левом канале (пин38) ресет правильно отображается (+3.3 вольта), а на правом канале (пин50) его нет.
Частоты: mclk: 23 - 25 мгц; bclk: 3 - 12 мгц; data - и есть data.
Основное тело программы:
сплитер:
Пт ноя 08, 2013 19:41:46
Я к сожалению не спец по разработке проектов для ПЛИС в схемотехническом редакторе, но по поводу bclk_in, первое что бросается в глаза два не один за другим. Это будит оптимизировано. В остальном, честно говоря не понятно. \оптимизатор может выбрасывать лишнюю логику, но если сигнал выведен на внешнюю ногу то он теряться не должен. А MCLK на выходе присутствует? И ещё, всё ли в порядке с микросхемой? Возможно стоит создать совсем простенький проектик (рабочий на 100% например мигалку) и подключить сигналы с него к данным ножкам. И ещё с BCLK_Q - это ведь фактически not(RESET). Если он в 0, то на выходе все нули (в т. ч. и BCLK_Q) т.е. выходной триггер сброшен (наверно). Если он 1 то выходной триггер работает, но BCLK_Q всёравно 0.
Сб ноя 09, 2013 02:41:44
В корне все не верно. MCLK - тактовая частота ЦАП (25мгц). BCLK - опорная частота потока данных DATA. Все клоки присутствуют в ПЛИС, так как отсутствие клока BCLK в схеме приведет к не работоспособности всей программы.
Последние два Д-тригера 74574 - это реклок. Когда восходящие фронты сигналов выравниваются по времени. Вот почему то сигнал DATA проходит через него, а BCLK нет (хотя частота у них идентична).
Может сигнал утерян чуть раньше??? Квартус при компиляции на энергоэффективность вроде бы не ругался.
- Вложения
-
- I2S.rar
- (346.07 KiB) Скачиваний: 495
Сб ноя 09, 2013 09:07:37
Что мешает отладить? Выводите всё наружу и двигайтесь от входа до выхода и смотрите где косяк. А вообще лучше писать всё на языке #HDL, чем ковыряться в этих дебрях. Тут желание мало у кого есть в этом разбираться, если вообще у кого то есть. В симуляторе дебажили?
Сб ноя 09, 2013 09:27:43
Я говорю про splitter. BCLK_Q на его выходе есть инвертированный RESET поступающий на его вход (по схеме). Не знаю что такое реклок, но у выходных триггеров reset это асинхронный сброс. Ну во всяком случае если это не какой нить хитрый триггер. Одновременно этот же ресет (не инвертированный) сбрасывает и выходные триггеры. А в целом, в соответствии с советом dimitriy91 старые версии кваруса (до 10) имеют встроенный симмулятор. Он и на #HDL и схемотическое описание проекта поддерживает. Не скажу про ModelSim, как он к схемотехнике относится....
P.S.
Verilog к сожалению не разумею(
Сб ноя 09, 2013 11:05:48
И как раньше не замечал эту ошибку с неправильно подключенной bclk_q.
Осталось разобраться, почему квартус не любит на одну линию вешать несколько выводов. Ведь взять проект "Марсоход", там люди по нескольку штук объединяют в один мегопин. Значит можно.
Сб ноя 09, 2013 11:34:25
Не только можно, но иногда даже нужно! Эти все ресеты - фактически перемычка от входного пина к 2-м выходным. Если бы сигналы использовались внутри ПЛИС то можно было бы списать всё на оптимизатора-озарника... но они выведены на физическую ножку и почему такая штука не фурычет, тем более что один из них работает
Ещё раз внимательно посмотрите Assignment Editor или Pin Planner (что больше нравится). Возможно просто забыли ножку назначить и она в воздухе повисла... Если всё норм, на эту ногу другой какой нибуть сигнал выведите, не исключено что в микросхеме косяк...
Ср дек 04, 2013 17:17:38
И снова здрасте
Перечитывал тут книжечку одного паренька с незатейливой русской фамилией Понг Чу (Pong Chu) про плис, и остановил внимание на строчке про умножение. Он пишет, что это операция определена для типа integer. Далее в книге он пишет, что дескать умножение это сложная операция и зависит она от того какой у меня софт и аппаратная часть. Затем говорит о встроенных умножителях (я так понял аппаратных), и о том что дескать Xilinx (а в другой книге и Altera не отстаёт) это дело поддерживают. Я написал проектик, скомпилировал его и посмотрел. Всё работает, посмотрел в квартусе на скомпилированную схему, но вот в том что там развилось так и не въехал. Более того, скомпилилось даже деление! При этом в сводной таблице написано, что умножители задействованы не были (чего и стоило ожидать). Может это всё кто нить прокомментировать. И стоит ли пользоваться таким умножением в своих проектах или нет?
P.S. Приведу кодик.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--use IEEE.NUMERIC_STD.ALL;
entity multipl is
port ( d_in : in std_logic_vector(3 downto 0);
d_out : out std_logic_vector(3 downto 0)
);
end multipl;
architecture behavioral of multipl is
signal d_in1 : integer range 0 to 15 := 0;
signal d_out1 : integer range 0 to 15 := 0;
begin
d_in1 <= conv_integer(d_in);
d_out1 <= (d_in1) * 3 ;
d_out <= conv_std_logic_vector(d_out1, 4);
end behavioral;
Ср дек 04, 2013 19:16:56
Параллельное умножение на 3 это сумма X + (X << 1).
Возможно компилятор счёл неразумным тратить ячейку умножителя на такую ерунду.
Попробуйте умножить две шины (два целых числа заранее неизвестных).
Ср дек 04, 2013 19:18:11
Кто нибудь собирал платформу с microblaze хоть раз ?
Чт дек 05, 2013 19:24:27
Kavka, Вы правы... Надо поэкспериментировать!
Пт дек 27, 2013 08:33:27
Всем привет. Выручайте!!!
- Код:
#include "xparameters.h"
#include "stdio.h"
#include "xgpio.h"
#include "xutil.h"
#include "xtmrctr.h"
#include "xintc.h"
#include "mb_interface.h"
#define SIZE 150
#define LED_CHANNEL 1
XGpio Gpio;
XTmrCtr XPS_Timer;
XIntc InterruptController;
XTmrCtr* TmrCtrInstancePtr;
unsigned char flag = 0;
void TimerCounterHandler(void *CallBackRef, Xuint8 TmrCtrNumber)
{
flag = ~ flag;
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,0xFF);
}
//================
int main (void) {
/*
* Enable and initialize cache
*/
#if XPAR_MICROBLAZE_0_USE_ICACHE
microblaze_invalidate_icache();
microblaze_enable_icache();
#endif
#if XPAR_MICROBLAZE_0_USE_DCACHE
microblaze_invalidate_dcache();
microblaze_enable_dcache();
#endif
//Инициализация GPIO драйвера
XGpio_Initialize(&Gpio, XPAR_LEDS_POSITIONS_DEVICE_ID);
//Установим порты на выход
XGpio_SetDataDirection(&Gpio, LED_CHANNEL,0x0);
// Установим выходной порт в 1
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,0x00);
volatile int j,i,k;
volatile double time;
float A[SIZE][SIZE] ;
float B[SIZE][SIZE] ;
float C[SIZE][SIZE] ;
float temp;
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,0x0F);
for( j=0; j < SIZE ; j++ )
for( i=0; i < SIZE ; i++ )
{
A[j][i] = 2.34;
B[j][i] = 1.23;
}
print("Start \n\r");
for( j=0; j < SIZE ; j++ )
for( i=0; i < SIZE ; i++ )
{
temp = 0;
for( k=0; k < SIZE ; k++ )
{
A[j][k] = 1.2;
B[j][k] = 1.2;
temp += A[j][k]*B[k][i];
}
C[j][i] = temp;
}
print("Stop \n\r");
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,0xFF);
return 0;
}
Почему то отказывается выполнять циклы и всё что ниже них :
- Код:
for( j=0; j < SIZE ; j++ )
for( i=0; i < SIZE ; i++ )
{
temp = 0;
for( k=0; k < SIZE ; k++ )
{
A[j][k] = 1.2;
B[j][k] = 1.2;
temp += A[j][k]*B[k][i];
}
C[j][i] = temp;
}
Даже при отключенной оптимизации.
volatile - не помогает.
Пт дек 27, 2013 12:11:22
dimitriy91 писал(а):Начнём с того, что в ПЛИС прошивка храниться не может.
Еще и как может. Семейство Altera MAX, например.
Пт дек 27, 2013 12:13:35
это CPLD
Пт дек 27, 2013 13:20:14
Спасибо Кэп
CPLD (англ. Complex Programmable Logic Device) — программируемая логическая интегральная схема (ПЛИС)
Пт дек 27, 2013 13:37:24
О Господи. Вам время своё не жалко тратить на подобное? Ясен пень под ПЛИС я подразумевал FPGA. Вы лучше по микроблайзу подскажите.
Пт дек 27, 2013 14:21:23
По Xilinx к сожалению не подскажу, тк занимаюсь только с Altera.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.