Перейти к содержанию
    

doublekey

Свой
  • Постов

    71
  • Зарегистрирован

  • Посещение

Весь контент doublekey


  1. Тут, похоже, вопрос в том, что в Synplify нет поддержки XC4000EX, при синтезе нужно выбирать аналогичный XC4000XL.
  2. А если дописать пару строчек: module h2d ( input clock, // System clock input. input signal, // Start signal input. output pulse // Generated pulses output. ); parameter PULSE_COUNT = 1; // Number of output pulses. localparam PULSE_COUNT_W = $clog2(PULSE_COUNT) + 1; // Pulse counter width. reg signal_reg; // Start signal detection register. reg [PULSE_COUNT_W:0] pulse_cntr; // Output pulses counter. logic start; // Start pulses generation. assign start = signal & ~signal_reg; always_ff @(posedge clk) signal_reg <= signal; always_ff @(posedge clk) if (start) signal_cntr <= '0; else if (~signal_cntr[$high(signal_cntr)]) signal_cntr <= signal_cntr + 1; assign pulse = signal_cntr[0]; endmodule
  3. Правильнее анализировать состояние signal по фронту clock, и в случае если обнаружена смена состояния из 0 в 1, начинать формирование импульсов. Формирование 1 импульса по приходу signal: module h2d ( input clock, input signal, output pulse ); reg signal_reg; always_ff @(posedge clk) signal_reg <= signal; assign pulse = signal & ~signal_reg; endmodule Если сигнал signal асинхронен отностиельно clock, то необходимо добавить два дополнительных триггера для предотвращения возникновения метастабильного состояния на входе. По желанию pulse можно сделать регистром, тогда выход будет привязан к clock.
  4. При работе с памятью программ один такт требуется, чтобы защёлкнуть выставленный ядром адрес в rom.addr_reg, плюс задержка на установление данных на выходе памяти ещё один такт, вроде бы так. Во всяком случае у меня с меньшим WAIT_VAL не работало на симуляторе.
  5. Делаю как-то так: module core8051 ( input clk, input cpu_nrst, MEM_if MEM_IF ); CORE8051S #( ... .STRETCH_VAL (1), // Number of wait cycles for data memory. .VARIABLE_STRETCH (0), // Use fixed number of cycles for data memory access. .VARIABLE_WAIT (0), // Use fixed number of cycles for program memory access. .WAIT_VAL (1), // Number of wait cycles for program memory .INTRAM_IMPLEMENTATION(0), // Use block RAM for internal RAM implementation. .FAMILY (15) // FPGA faily: ProASIC3. ) CPU_CORE ( ... .CLK (clk), .NSYSRESET(cpu_nrst), .PRESETN (), .WDOGRES (1'b0), .WDOGRESN (), .INT0 (1'b0), .INT1 (1'b0), .MOVX (), // Memory bus .MEMPSACKI(1'b1), .MEMACKI (1'b1), .MEMDATAI (MEM_IF.data), .MEMDATAO (), .MEMADDR (MEM_IF.addr), .MEMPSRD (), .MEMWR (), .MEMRD (), ); endmodule module rom ( input clk, // Clock input. ROM_if ROM_IF, // Programming interface for initialization. MEM_if MEM_IF // System data bus. ); import definitions::*; reg [ROM_DATA_WIDTH - 1:0] mem [ROM_DEPTH - 1:0]; // ROM. reg [ROM_ADDR_WIDTH - 1:0] addr_reg; // Read address register. assign MEM_IF.data = mem[addr_reg]; always_ff @(posedge clk) begin addr_reg <= MEM_IF.addr[ROM_ADDR_WIDTH - 1:0]; if (ROM_IF.we) mem[ROM_IF.addr] <= ROM_IF.data; end endmodule Соответственно, после включения питания специальный автомат грузит программу из внешней EEPROM (I2C/SPI) в эту память и потом снимает reset для ядра.
  6. Пару слов про SV package definitions; parameter cons1 = 8; endpackage ... import definitions::cons1; always @ (posedge clk) parallel_data = {serial_data, parallel_data[cons1-1:1]};
  7. Первое, что настораживает, это то, что в качестве источника выбран External I/O, а на верхнем уровне clock заведён не только на PLL, но ещё и на счётчик, вроде как генератор PLL пихает входной буфер в такой конфигурации внутрь модуля PLL_075MHZ. Ещё не понятно, что подаётся на buttom_in[1:0]. Пробовали отсимулировать?
  8. Так сделайте себе несколько макетных платок, размеры и типы разъёмов же есть, и размещайте на ней всё что вам нужно, и проводов будет меньше.
  9. У Atmel есть документ в котором они пишут тип разъёмов и их распиновку, а также говорят, что Сам Atmel под них ничего не делает, у сторонних фирм готового тоже ничего не встречал.
  10. Вы описали асинхронную схему, а по условию задачи вроде бы нужна синхронная. Поэтому, следует добавить вход частоты синхронизации, назвав его, например, clk, описать выходы как reg, а также добавить always @(posedge clk).
  11. Наверное, syn_keep для sum не даёт его заоптимизировать, если его убрать, результаты лучше?
  12. Art55555, принимал данные по параллельной DDR шине с AD6657 на частоте 200 МГц, но там немного другой формат. Попробуйте, у вас же есть железка.
  13. Synplify вот что говорит: Performance Summary ******************* Worst slack in design: -0.441 Requested Estimated Requested Estimated Clock Clock Starting Clock Frequency Frequency Period Period Slack Type Group ------------------------------------------------------------------------------------------------------------------------- ltc2195_rx|dco 1000.0 MHz 531.2 MHz 1.000 1.883 -0.441 inferred Autoconstr_clkgroup_0 ================================================================================ =========================================
  14. module ltc2195_rx ( input rst, // Reset input. input dco, // Clock input. input fr, // Frame sync signal. input [ 3:0] rxd, // Serial data. output reg [15:0] data, // Parallel data. output reg done // Data recieved flag. ); reg [1:0][3:0] data_p; // Positive edge data. reg [1:0][3:0] data_n; // Negative edge data. always_ff @(negedge dco, posedge rst) if (rst) data_n[1:0] <= '0; else data_n[1:0] <= {data_n[0], rxd}; // Recieve data at negative edge. always_ff @(posedge dco, posedge rst) if (rst) begin data_p <= '0; data <= '0; done <= '0; end else begin data_p[1:0] <= {data_p[0], rxd}; // Recieve data at positive edge. if (fr) // Store data to output register. {data[15], data[14], data[ 7], data[ 6], data[13], data[12], data[ 5], data[ 4], data[11], data[10], data[ 3], data[ 2], data[ 9], data[ 8], data[ 1], data[ 0] } <= {data_p[1], data_n[1], data_p[0], data_n[0]}; done <= fr; // Set recieved flag. end endmodule И читать данные из выходного регистра по сигналу done.
  15. (C1C2R3R5) p2 + (C2R3R4R5) p w = --------------------------------------------------------------- (C1C2C3R2R2R2) p3 + (C1C2R2R2R2) p2 + (C1R2R3R5) p + R2R3R4R5 Вроде бы передаточная функция такая, похоже на фильтр. Отмоделируйте вашу схему в Multisim/Microcap или эту ПФ в Matlab/Octave.
  16. Укажите DIFF_TERM = "TRUE" в .ucf или .DIFF_TERM("TRUE") при инстанции IBUFDS. Работать будет.
  17. Кажется, он ругается не на параметризацию входов, а на то, что не понимает модификатор signed. Может, где-то в настройках задан 95 стандарт, и нужно явно указать 2001? Но, на всякий случай, попробуйте описать модуль так: module cordic #( parameter WF = 8, parameter IN_WIDTH= 16, parameter WO = 8 ) ( input clock, input signed [WF-1:0] frequency, input signed [IN_WIDTH-1:0] in_data, output signed [WO-1:0] out_data_I, output signed [WO-1:0] out_data_Q ); C codeblock получше выглядит.
  18. ILYAUL, так тема про то, что человек написал инициализацию ADCSRA в 2 инструкции, и такой код оказывается неработоспособным, но вы настаиваете, что инициализация должна выполняться именно так. Есть такой момент, что если производить запись в регистры АЦП когда бит ADEN ещё не установлен, не понятно, запишется что-нибудь или нет, ведь блок выключен и enable на регистры не подаётся. Так вот, если выставлять ADEN в ADCSRA в одной команде вместе с остальными битами, то запись в остальные биты может не производиться, поскольку enable ещё не выставлен (ведь он защёлкнется только в этом такте), именно поэтому ADCSRA = _BV(ADEN); вынесено в отдельную команду. И следующей командой может идти запись в остальные биты ADCSRA, поскольку в этом случае блок АЦП гарантированно включен.
  19. e: 80 e8 ldi r24, 0x80; 128 10: 86 b9 out 0x06, r24; 6 12: 80 ec ldi r24, 0xC0; 192 14: 87 b9 out 0x07, r24; 7 16: 86 b1 in r24, 0x06; 6 18: 8f 62 ori r24, 0x2F; 47 1a: 86 b9 out 0x06, r24; 6 1c: 36 9a sbi 0x06, 6; 6 Команд всего 8, с учётом загрузки ADMUX, без загрузки - 6. Есть подозрение, что может быть косяк с выставлением ADSC одновременно с конфигурацией остальных битов в ADCSRA. Ещё интересно, бит I в SREG выставляет до конфигурации АЦП или после.
  20. Хм, но вот проверил у себя на плате, инициализирую АЦПшник вот так, и всё работает void adc_init (void) { // Включаем блок АЦП. ADCSRA = _BV(ADEN); // Выбираем внутренний источник опорного напряжения. // Выравнивание результата по правой границе. // В качестве входа используется ADC0. ADMUX = _BV(REFS0) | _BV(REFS1); // Выбираем предделитель частоты. // Разрешаем прерывание от АЦП. // Включаем режим автоматического преобразования. ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0) | _BV(ADIE) | _BV(ADATE); // Запускаем преобразование. ADCSRA |= _BV(ADSC); }
  21. В даташите на странице 247 написано: When Auto Triggering is used, the prescaler is reset when the trigger event occurs Насколько я понимаю у вас ADATE в 1, получается надо в прерывании задавать заново prescaler. Да, похоже тут я не прав. Попробуйте сбрасывать запрос прерывания в обработчике записывая 1 в ADIF. Или такой вариант: Изначально прерывание уже выставлено, и при инициализации включается автоматическое преобразование и происходит переход в обработчик прерывания, а prescaler не задаётся (хотя маловероятно). Можно попробовать при инициализации ADCSRA также сбрасывать ADIF, а ADATE задавать в следующей команде.
  22. Попробуйте //synthesis attribute INIT of i_z0 is 32'hC67319CC; или как написано в LibraryGuide ROM32X1 #( .INIT(32'hC67319CC) // Contents of ROM ) i_z0 ... Также попробуйте убрать инициализацию в .v и прописать в UCF. И какая у вас версия ISE, под какой кристалл собираете? На каком этапе появляется ошибка translate, map, P&R?
  23. Можно ещё обфускачить или исходники или edif, модифицировать будет довольно сложно.
  24. Вроде бы по информации с официального сайта ModelSim PE Student Edition есть только под x86/Windows: А форма запроса лицензии должна появляться при установке на одном из заключительных этапов Так что придётся покупать либо Win либо ModelSim.
×
×
  • Создать...