Jump to content

    

Ynicky

Участник
  • Content Count

    72
  • Joined

  • Last visited

Everything posted by Ynicky


  1. Цитата(Golikov A. @ May 21 2015, 09:08) не понял расчета) у меня тогда получается 4 такта. 2 такта на чтение операндов и 1 такт на исполнение, 1 такт на запись. Почему вы в такты включили размер команды? Или почему вы в RISC процессоре исключили загрузку команды? А где 4 такта на извлечение команды? Если, конечно, Вы не сделаете извлечение 4 слов команды за 1 такт. Иначе нарушается конвейер при выполнении каждой команды за 1 такт. Я уже не говорю о том, что команды обработки данных перемежаются с командами ветвления. Хотя это справедливо и для тех RISC, где каждая команда имеет длину в 1 слово.
  2. Цитата(Golikov A. @ May 20 2015, 09:35) ну то есть надо на самом деле сделать 3 портовую оболочку брам, даже чуть проще 2 порта чтения и один запись, и автоматом получиться огромный регистровый файл. А вот теперь вопрос, зачем регистры в таком решении отделять от РАМ проца? Выигрыш только в сокращении шины адресации? В регистрах на LUTах можно за один такт складывать любые 2 и писать в третий, но эта возможность порождает дикие мультиплексоры которые жрут все LUTы, альтернативой я так понимаю служит несколько тактовая операция R1+R2->R3, реализуемая через 3 портовую БРАМ. И в этом случае у меня получается что нет смысла делать отдельно БРАМ регистров, и включить его в общий РАМ проца. Правильно рассуждаю или я что-то не учел? Давайте порассуждаем. Команда в Вашем случае должна содержать: Опкод - 1 слово. Адрес первого операнда - 1 слово. Адрес второго операнда - 1 слово. Адрес приемника - 1 слово. + 2 такта минимум на чтение операндов. + 1 такт на исполнение в АЛУ. + 1 такт запись результата. Итого получили 8 тактов. В RISC процессоре: 2 такта на загрузку первого операнда. 2 такта на загрузку второго операнда. 1 такт на исполнение в АЛУ. 1 такт на запись результата. Итого получили 6 тактов. В Вашем случае можно сэкономить 1 такт начиная считывать первый операнд не дождавшись конца загрузки команды. Можно еще укоротить адреса операндов (например в одном слове 2 адреса источников).
  3. Мне очень помогло это: [attachment=83387:lec9_2.pdf] http://www.kurtm.net/archive/2003-Fall-cs1..._html/lecnotes/
  4. Долго думал и решил создать новую тему. Полтора года назад мое начальство дало задание проработать проект цифровой видеокамеры, но потом от него отказалось. А мне это до сих пор не дает покоя. На тот момент у меня уже был опыт создания SOC (систем на кристалле) на своих процессорах. Был даже проект векторного 64 разрядного сопроцессора (SIMD). Правда он так и не был реализован в ASIC-е. С тех пор, занимаясь "плановой" работой, я нахожу немного времени для проекта цифровой видеокамеры. Уже сделано почти все, кроме вывода изображения на ЖК экран. Но надежда на то, что камера когда-нибудь будет востребована, с каждым днем "тает". Конечно я понимаю, что это коммерчески не выгодно. Тягаться с известными зарубежными фирмами, выпускающими видеокамеры, бессмысленно. Но для души такой проект - то что надо. Даже если он и не будет реализован. Наработанный опыт не пройдет даром. Мысль о том что проект никому не нужен заставила меня обратиться на форум. Выложить его, как есть, всем желающим я не могу по причине того, что это собственность предприятия. Тем более что ассемблер к RISC процессору и векторному сопроцессору написан не мною. Так вот, чтобы не нарушать коммерческую тайну и право собственности, я решил разработать новый RISC процессор и векторный сопроцессор к нему в свободное от основной работы время (т.е. дома). Так как опыт и наработки уже есть, это займет не очень много времени. Их то я (RISC и VCP) и мог бы выложить на форуме. Проблема только в программном обеспечении. Чтобы быстро отладить процессор и сопроцессор, нужен как минимум ассемблер с простейшей функцией разделения кода и данных, так как RISC ядро имеет гарвардскую архитектуру. А как максимум, не мешало бы иметь gcc или binutils для разработки прикладного ПО. В принципе, написать ассемблер мог бы и я, но тогда это займет много времени и не будет стимула выкладывать все на форуме, да и заниматься этим. Может найдется среди вас энтузиаст, который бы взялся хотя бы за ассемблер. Если таких нет, может кто знает к кому обратиться? "С" компилятор на основе LCC мог бы написать и я в дальнейшем (если не будет gcc или binutils). Чтобы иметь представление о RISC ядре, выкладываю пока не полное описание. Николай.
  5. Цитата(:-) @ Oct 18 2011, 09:22) Кстати, а вы смотрели выход max2769 на спектроанализаторе в аналоговом режиме? Как там выглядит спектр? А сдвиг всех литер одинаковый? Тогда, может, у вас кварцевый генератор плохой (низкая стабильность частоты у него)? А как посмотреть выход MAX2769 (и какой) в аналоговом режиме? Про генератор я подумал в первую очередь. Я использую NT3225SA-26M-NSA0322T. У него стабильность 2,5 ppm. Это гораздо меньше 26 кГц. Насколько я понял, у всех литер одинаковый сдвиг. Точный сдвиг можно будет вычислить после того как программисты осилят вторичку (определение координат в реальном времени). Николай. PS. Забыл добавить. На трех экземплярах приемника результат аналогичен.
  6. Наконец-то принял сигналы спутников. Оказалось, что все литеры сдвинуты примерно на +26 кГц. С чем это связано, пока не понял. Работаю как с полосой +-4 МГц, так и с +-8 МГц. С полосой +-8МГц неравномерность АЧХ очень сильная. При работе АРУ вообще непонятная АЧХ. Без АРУ - лучше. Выброс на частоте 1600 МГц - 32-я гармоника частоты 50 МГц на которой работает процессор. Настройки MAX2769 следующие: +-4 МГц: 0xA291FEB0 0x85502881 0xEAF71DC2 0x9EC00083 0x0C820D04 0x80000705 0x80000006 0x10061B27 0x1E0F4018 0x14C04029 +-8 МГц без АРУ: 0xA291FFD0 0x85512881 0xCAF71DC2 0x9EC00083 0x0C820D04 0x80000705 0x80000006 0x10061B27 0x1E0F4018 0x14C04029 +-8 МГц с АРУ: 0xA291FFD0 0x85502881 0xEAF71DC2 0x9EC00083 0x0C820D04 0x80000705 0x80000006 0x10061B27 0x1E0F4018 0x14C04029 АЧХ прилагаю. Николай. PS. Два месяца назад написал в службу поддержки ф.MAX. Задавал вопросы по MAX2769. В ответ запросили больше информации. Послал. С тех пор жду ответа.
  7. Цитата(:-) @ Sep 2 2011, 17:55) Вторая удачная конфигурация Интересно, а какая у Вас получится АЧХ со следующей конфигурацией: 0xA2919A30 - полоса пропускания 2,5 МГц. Остальные регистры не менял. То, что получилось у меня - во вложении. Николай.
  8. Цитата(:-) @ Sep 2 2011, 17:55) Вторая удачная конфигурация Сделал тоже самое у себя. Интересные получились результаты. Николай.
  9. Цитата(:-) @ Sep 1 2011, 17:26) Ой, а это у вас не сам сигнал в файле, а уже его спектр? Только я так и не понял у вас работает max2769 в режиме ГЛОНАСС или нет? В режиме lowpass filter mode (бит FCENX = 0), по-моему, значение бит FCEN не играет роли. А что значит "Минимальное время петли обратной связи - это 4 мС в фильтре ФАП"? Т.е. каждую мс вы считываете значения с интеграторов, но только каждые 4 мс используете их? А какую частоту выставляете для синтезатора несущей: соответствующую текущей расстройке или как-то хитро экстраполируете ее на время +4мс? Я сам пытаюсь использовать коррелятор из проекта namuru: http://www.gmat.unsw.edu.au/namuru/ А управляющую программу osgps: http://sourceforge.net/projects/osgps/ Отсчеты с АЦП мне не доступны, да и памяти столько в FPGA нет, чтобы их сохранить. А с MAX2769 я так и не могу принять ни одного спутника, ни в режиме ФНЧ ни в режиме ПФ. Значения с интеграторов я использую каждую эпоху. Усредняю и подставляю в формулу фазовой автоподстройки. Каждые 4мС записываю в управляющие регистры корректирующую информацию (новое значение фазы несущей). Для неподвижного объекта это время можно увеличить. Для динамического (самолет) больше нельзя сделать. Будет срыв автоподстройки. А вообще коррелятор у меня позаимствован у GP2021 (идея). Только я его модифицировал для работы с широкой входной полосой несущего сигнала, чтобы обрабатывал весь спектр ГЛОНАСС. И программа за основу взята у ф.Zarlink, которую они прилагают к своим отладочным платам. Николай.
  10. Цитата(:-) @ Aug 31 2011, 00:34) Это вы берете вторую ПЧ с gp2015 вместо третьей? Ох, как-то непривычно выглядит спектр в данном режиме у вас. А не могли бы вы выложить запись отсчетов, по которым у вас строился спектр, чтобы я мог сравнить в своей привычной программе? У меня спектр выглядит как в приложении. Выбросы около нулевой частоты и прочие тоже обычно прослеживаются, если взять БПФ от выборки подлинее. С причиной пока не разобрался, но так как они заметно не влияют на результат обработки пока оставил все как есть... Ой, очень любопытно узнать как отлаживается связка коррелятор+программа управления. Еще очень интересует вопрос как влияют задержки между моментом получения очередной выборки с коррелятора и моментом ввода новых команд коррелятору. В проекте RF приемника на GP2015 с выхода 1-й ПЧ идет ответвление для ГЛОНАССа на квадратурный смеситель U2794B, далее через RC ФНЧ - на АЦП AD9066 (используются 2 старших разряда). Для NAVSTAR-а используется остальная часть GP2015. АЧХ прикрепил. Так как схема довольно сложная, решил перейти на MAX2769. Дамп памяти для построения спектра в MATLAB-е прикрепил. Текс .m файла привожу ниже. fid = fopen('f1601bw18.dmp','r'); [a,count] = fread(fid,'uint16'); fclose(fid) c = log10(a) plot(c,'r-') title('GLONASS') ylabel('Log10(P)') xlabel('Frequency (0 = +13MHz, 2600 = 0MHz, 5200 = -13MHz (1 = 5000Hz))') hold on В состав моего коррелятора входят 2 синтезатора частот (для кода и несущей), комплексный смеситель (на основе ПЗУ), накапливающие сумматоры-интеграторы (за период 1 эпоха ПСП (1 мС)), а также счетчик местной шкалы времени. Каждую эпоху процессором считываются получаемые на интеграторах и других регистрах (псевдодальности, счетчик эпох и др.) отсчеты, которые обрабатываются и используются для задания корректирующей информации коррелятору. Минимальное время петли обратной связи - это 4 мС в фильтре ФАП. Фильтр слежения за кодом замыкается раз в 20 мС. Процессор можно применить общего назначения, только для вычисления координат требуется плавающая точка. Экспериментируя с MAX2769 установил, что нулевую центральную частоту внутреннего фильтра ПЧ можно выставить записав все 1 в поле FCEN. АЧХ для полосы 8 МГц с нулевой центральной частотой фильтра также вложил. Николай.
  11. Цитата(:-) @ Aug 30 2011, 01:17) А какая АЧХ у Вас получается? Чем не устраивает? А какой коррелятор Вы используете? Что-то самописное? А на чем сделано управление коррелятором? Коррелятор использую самодельный (написан на VHDL). При работе с приемником на GP2015 работают как ГЛОНАСС так и NAVSTAR. Только там у меня рабочая частота 25 МГц. В корреляторе есть возможность работы и на частоте 26 МГц, что используется в проекте с MAX2769. Коррелятор управляется софтпроцессором. АЧХ снимаю с помощью специальной программы. Настроил MAX2769 следующим образом: 0xA2918F90 0x85592881 - sign & mag 0xFEFF1DC2 0x9EC00083 0x0C820D04 - 1601MHz, RDIV=26 0x08000705 0x80000006 0x10061B27 Два последних регистра не конфигурирую (оставляю значения по умолчанию). Изменил Ваши настройки с учетом используемой у меня аппаратуры. АЧХ прилагаю. Выброс вблизи 0-й частоты - полагаю помеха от внутреннего VCO. При изменении центральной частоты VCO меняется и положение этого выброса. Николай.
  12. Цитата(:-) @ Jan 16 2011, 21:41) В указанном по ссылке проекте частота TCXO=16МГц; Т.к. исползьзуются обе квадратуры, то полоса оцифровываемого сигнала - 16МГц. При этом, чтобы фильтр ПЧ MAX2769 не обрезал полезный сигнал выбран его режим работы в виде фильтра НЧ с частотой среза 9 МГц. Т.е. относительно нулевой частоты сигнал простирается в положительную и отрицательную сторону на 9 МГц (т.е. полная полоса=18МГц). Сделал RF приемник на MAX2769 с выходами I и q. Коррелятор аппаратный на FPGA. Никак не получается настроить ПЧ приемника на полосу +-9МГц. АЧХ не соответствует тому что надо. Хотя полосы 2,5, 4,2 и 8 МГц в режиме с нулевой ПЧ (zero-IF mode) те что надо. Если не сложно, не могли бы Вы дать настройки каждого регистра MAX2769? Николай.
  13. Цитата(ADA007 @ Feb 23 2011, 21:10) А это случайно не аналог Cortex-M1? Нет. Вот его операции АЛУ: // Shift instructions `ALU_OP_SLL: result_o = {1'b0, a_i << b_i[4:0]}; `ALU_OP_SRL: result_o = {1'b0, a_i >> b_i[4:0]}; `ALU_OP_SRA: result_o = {1'b0, {{32{a_i[31]}}, a_i } >> b_i[4:0]}; // Arithmetical instructions `ALU_OP_ADD: if(signed_i) result_o = a_i + b_i; // Result may include a carry bit else result_o = {1'b0, a_i + b_i}; `ALU_OP_SUB: if(signed_i) result_o = a_i - b_i; // Result may include a carry bit else result_o = {1'b0, a_i - b_i}; // Logical instructions `ALU_OP_AND: result_o = {1'b0, a_i & b_i}; `ALU_OP_OR: result_o = {1'b0, a_i | b_i}; `ALU_OP_XOR: result_o = {1'b0, a_i ^ b_i}; `ALU_OP_NOR: result_o = {1'b0, ~(a_i | b_i)}; // Conditional instructions `ALU_OP_SEQ: result_o = (a_i == b_i) ? 33'b1 : 33'b0; `ALU_OP_SNE: result_o = (a_i != b_i) ? 33'b1 : 33'b0; `ALU_OP_SLT: if(signed_i) result_o = ({~a_i[31],a_i[30:0]} < {~b_i[31],b_i[30:0]}) ? 33'b1 : 33'b0; else result_o = (a_i < b_i) ? 33'b1 : 33'b0; `ALU_OP_SLE: if(signed_i) result_o = ({~a_i[31],a_i[30:0]} <= {~b_i[31],b_i[30:0]}) ? 33'b1 : 33'b0; else result_o = (a_i <= b_i) ? 33'b1 : 33'b0; `ALU_OP_SGT: if(signed_i) result_o = ({~a_i[31],a_i[30:0]} > {~b_i[31],b_i[30:0]}) ? 33'b1 : 33'b0; else result_o = (a_i > b_i) ? 33'b1 : 33'b0; `ALU_OP_SGE: if(signed_i) result_o = ({~a_i[31],a_i[30:0]} >= {~b_i[31],b_i[30:0]}) ? 33'b1 : 33'b0; else result_o = (a_i >= b_i) ? 33'b1 : 33'b0;
  14. Понятно. Значит, если я сделаю частоту опоры 26 МГц, я могу работать с ВТ кодом. Николай.
  15. Не могу понять какая частота TCXO в этом проекте? И частота среза указана 9 МГц. Нужно сделать GPS/ГЛОНАСС RF приемник, поэтому интересует этот проект. Николай.
  16. Промоделировал "queens". Результаты совпадают с "q.c". Указатели в "q2.c" изменяются на 1, в то время как у меня в процессоре байтовая адресация, т.е. указатели должны меняться на 4. Временно сдвинул адрес в процессоре на 2 разряда вправо и все заработало. 2 Leka: Что нужно (или можно) посмотреть по результатам моделирования? И еще, для чего в программе "q2.c" мы обращаемся к памяти через указатели? Почему нельзя обойтись только регистрами? Ошибок в процессоре больше пока не обнаружил. Николай.
  17. Цитата(Leka @ Jun 28 2010, 22:05) В "a2h.c" "#define ST(a,b )..." надо исправить на "#define ST(b,a)...". Исправил, заработало, проверяю дальше. Николай.
  18. CODEtst_ptr() { int *ptr1; int *ptr2; int iA,iB; *ptr1 = 0xA; *ptr2 = 0xB; iA = *ptr1; iB = *ptr2; } => .REG 000:00000000 001:00000000 002:00000000 003:00000000 004:00000000 005:0000000A 006:0000000B .CODE 000001:4500000A ; 000002:66001000 ;*ptr1=0xA; 000003:4500000B ; 000004:66002000 ;*ptr2=0xB; 000005:62003001 ;iA=*ptr1; 000006:62004002 ;iB=*ptr2; 000007:12000000 ;} Помоему, в командах "STORE" (опкод 66) перепутаны местами RD и (RS). У меня в системе команд RD и (RS) находятся в одном и том же месте для формата "LOAD/STORE". Николай.
  19. Попробовал отмоделировать программу "queens". Работает не правильно. Тогда стал писать тесты. Сразу обнаружил следующее: CODEtst_rr() { int iA = 1; int iB = 2; iB = iA; } => .REG 000:00000000 001:00000001 002:00000002 .CODE 000001:45002001 ;iB=iA; //формат RI вместо RR!!! 000002:12000000 ;} Но если переменную iA не инициализировать, то все нормально: Кодtst_rr() { int iA; int iB = 2; iB = iA; } => .REG 000:00000000 001:00000000 002:00000002 .CODE 000001:25002001;iB=iA; //!!! 000002:12000000;} Николай.
  20. To Leka: А что делать с секцией ".REG"? Надо прописывать в регистровый файл? Николай. P.S. Понял, надо.
  21. Цитата(Leka @ Jun 20 2010, 21:18) Надеюсь, кое-какая польза все-таки была извлечена из этого проекта. Для меня - да.
  22. Цитата(Leka @ Jun 20 2010, 21:03) проект, судя по всему, развиваться не будет(мало участников) Согласен.
  23. Цитата(Leka @ Jun 20 2010, 18:41) То-же, что и "<<" и ">>" в Си. Насколько я знаю, "<<" - это всегда логический сдвиг, а ">>" - либо логический либо арифметический, в зависимости от переменной (беззнаковой или знаковой). Это так? Николай.
  24. Цитата(Leka @ Jun 18 2010, 01:37) В "a2b.c" надо вместо "00" кодов операций поставить реальные. Вывод комментов добавил. Есть вопросы по командам в "a2b.c". 1. "TST" - это операция "AND" без записи в регистр (т.е. только изменение флагов)? 2. "BZ","BNZ" - ветвление, если результат "=0" и "/=0"? Дело в том, что с командами "CMP" все условия ветвления сравниваются с '0'. Значит ли это, что их можно приравнять к командам "BEQ" и "BNE"? 3. Что из себя представляют команды: "COM", "LDI", "LDD", "LDDI", "STI", "STD", "STDI"? 4. "ASL" и "ASR" - это команды арифметического или логического сдвига? Исправил еще несколько ошибок в процессоре. Николай.
  25. Цитата(Leka @ Jun 18 2010, 12:34) По поводу слотов задержки в командах условных переходов. В FPGA вся память - двухпортовая, можно использовать для упреждающей выборки альтернативной инструкции из памяти программ - выигрываем 1 такт. В принципе, можно вообще обойтись без слотов задержки, как, например, в ARM-е. Тогда мы будем терять 3 слота задержки при невыполнении условия перехода (flush). Можно, конечно, сделать альтернативную выборку команд и не терять ни одного слота, переключаясь на альтернативную ветку конвейера. Но это, по моему, будет привязывать данную архитектуру только к FPGA. Как это может сочетаться с кеш, пока не знаю. Николай.