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

BSACPLD

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    5

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


  1. Версия EE7.9.4 update7 WinXP SP3. 1. Не работает кнопка выбора пути к центральной библиотеке, если не убрать путь прописанный "по умолчанию" (скриншот 1.png). 2. При попытке изменить значение строки в свойствах компонента она съезжает. Если делать следующим образом: Скрыть Value, изменить его значение, сделать его видимым, то всё нормально (скриншот 2.png). Тестовый проект прилагается. test.rar
  2. Про Data2Mem прочитал, но я так и не понял, как создавать *.bmm файл. Допустим у меня есть вот такая память: module program_ram #( parameter ADDR_WIDTH = 12, parameter DATA_WIDTH = 16, parameter INIT_FILE = "init_file.ver" ) ( input clock_a, input clock_b, input addressstall_a, input addressstall_b, input [ADDR_WIDTH-1:0] address_a, input [ADDR_WIDTH-1:0] address_b, input [DATA_WIDTH-1:0] data_a, input [DATA_WIDTH-1:0] data_b, input wren_a, input wren_b, input enable_out_a, input enable_out_b, input aclr_out_a, input aclr_out_b, output reg [DATA_WIDTH-1:0] q_a, output reg [DATA_WIDTH-1:0] q_b ) ; reg [ADDR_WIDTH-1:0] address_reg_a ; wire [ADDR_WIDTH-1:0] address_mux_a ; reg [ADDR_WIDTH-1:0] address_reg_b ; wire [ADDR_WIDTH-1:0] address_mux_b ; reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0] /* synthesis syn_ramstyle = "no_rw_check" */ ; integer i ; initial begin $readmemh (INIT_FILE, mem) ; address_reg_a <= 0 ; address_reg_b <= 0 ; q_a <= 0 ; q_b <= 0 ; end assign address_mux_a = (addressstall_a)? address_reg_a:address_a ; always @(posedge clock_a) begin address_reg_a <= address_mux_a ; if (wren_a) mem[address_mux_a] <= data_a ; end always @(posedge clock_a or posedge aclr_out_a) begin if (aclr_out_a) q_a <= 0 ; else if (enable_out_a) q_a <= mem[address_reg_a] ; end assign address_mux_b = (addressstall_b)? address_reg_b:address_b ; always @(posedge clock_b) begin address_reg_b <= address_mux_b ; if (wren_b) mem[address_mux_b] <= data_b ; end always @(posedge clock_b or posedge aclr_out_b) begin if (aclr_out_b) q_b <= 0 ; else if (enable_out_b) q_b <= mem[address_reg_b] ; end endmodule Как мне создать для неё *.bmm файл?
  3. В Quartus это делается путём изменения уже сгенерённых файлов. Для каждой памяти создаётся mif файл в котором хранится образ памяти. При генерации файла прошивки mif файлы вставляются в соответствующее место в sof и pof файлах. Для изменения содержимого памяти достаточно обновить mif файлы и заново сгенерить sof и pof. Т.е. не нужно перекомпилировать весь проект. Мой вопрос состоит в том, как сделать то же самое в ISE.
  4. Но ведь в данном случае получается полная перекомпиляция проекта, а это не удовлетворяет условиям поставленной задачи. А можно немного поподробнее. И как быть если память сделана не с помощью Coregen, а описана на Verilog с инициализацией через readmemh?
  5. Когда я работал с Quartus, то для обновления содержимого ROM было достаточно выполнить команду Update Memory Initialization File. Как сделать то же самое в ISE?
  6. Совсем не факт. В 2012 версии глючный маппер. У меня он падает на проекте, который нормально собирается на 2011.09. Также он падает при добавлении в проект на Verilog'е отладчика Identify.
  7. В общем, удалось мне запустить этот ЦАП, но только с внутренним PLL, без PLL почему-то не работает. Вот получившаяся процедура инициализации: // init_DAC1408.asm sbi PORTA, DAC_RESETn rcall timer10us cbi PORTA, DAC_RESETn rcall timer10us WRITE_DAC1408_REG 0x1F, 0 WRITE_DAC1408_REG 0x00, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (1<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x09, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x0C, (1<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x1B, (1<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x1D, (1<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x1F, 4 WRITE_DAC1408_REG 0x00, (1<<7) | (1<<6) | (0<<5) | (0<<4) | (1<<3) | (1<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x01, (1<<7) | (1<<6) | (0<<5) | (0<<4) | (1<<3) | (1<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x07, (0<<7) | (1<<6) | (1<<5) | (0<<4) | (0<<3) | (0<<2) | (1<<1) | (0<<0) WRITE_DAC1408_REG 0x08, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (1<<1) | (0<<0) WRITE_DAC1408_REG 0x0C, (0<<7) | (0<<6) | (1<<5) | (1<<4) | (0<<3) | (0<<2) | (1<<1) | (0<<0) WRITE_DAC1408_REG 0x1C, (0<<7) | (0<<6) | (1<<5) | (1<<4) | (0<<3) | (0<<2) | (1<<1) | (1<<0) WRITE_DAC1408_REG 0x1F, 2 WRITE_DAC1408_REG 0x00, (0<<7) | (0<<6) | (1<<5) | (1<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0)
  8. Ну неужели никто не работал с данной микросхемой? P.S. Сегодня посмотрел глазковую диаграмму - всё совершенно нормально, но ЦАП почему-то не хочет видеть K28.5, поэтому и возник вопрос о правильности настройки.
  9. Здравствуйте, уважаемые коллеги! Я пытаюсь передавать данные с EP1AGX60 на DAC1408D650. По ходу дела возникло несколько вопросов. 1. Правильно ли я понял, что скорость передачи по GTX должна быть в 10 раз выше частоты дискретизации? 2. Читал на форуме, что для данного ЦАП нужно писать непонятно что, непонятно куда, чтобы он заработал (http://electronix.ru/forum/index.php?showtopic=89753&view=findpost&p=926038). Можно ли узнать, что конкретно? 3. Если я всё правильно настрою, то при передаче K28.5 должен будет установиться флаг K28_5_LN0 в регистре K28_LN0_FLAG? На всякий случай привожу здесь процедуру инициализации ЦАП: WRITE_DAC1408_REG 0x1F, 0 WRITE_DAC1408_REG 0x00, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x1F, 2 WRITE_DAC1408_REG 0x1F, 0 WRITE_DAC1408_REG 0x01, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x02, (1<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x09, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x0A, (0<<7) | (1<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x0B, (1<<7) | (1<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x0C, (1<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x1F, 1 WRITE_DAC1408_REG 0x00, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (1<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x1F, 2 WRITE_DAC1408_REG 0x03, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (1<<0) WRITE_DAC1408_REG 0x00, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (0<<1) | (0<<0) WRITE_DAC1408_REG 0x1F, 4 WRITE_DAC1408_REG 0x07, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (1<<1) | (0<<0) WRITE_DAC1408_REG 0x0C, (0<<7) | (0<<6) | (1<<5) | (1<<4) | (0<<3) | (0<<2) | (1<<1) | (1<<0) WRITE_DAC1408_REG 0x1C, (0<<7) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (0<<2) | (1<<1) | (1<<0) WRITE_DAC1408_REG 0x1F, 0 GTX настроен на 2000 Mbps, две линии по 8 бит, частота дискретизации 200 МГц.
  10. После вставки в основной проект проблема решилась сама собой. "Лишние" регистры соптимизировались с остальной логикой проекта. Так что по ресурсам я практически ничего не потерял.
  11. Да проблема не в том, как их задействовать, а в том, что Xilinx'овские макросы очень не удобные в использовании - геммороя с ними много :angry2: Для Altera'ы я могу указать тип памяти AUTO и она будет синтезироваться в зависимости от объёма на тех или иных блоках автоматически (M4K, M144, ...). Для Xilinx обязательно указывать тип памяти, причём для разных семейств будет свой примитив, со своим набором сигналов. В отличии от altsyncram, который один для всех семейств. Для того, чтобы корретным образом тормозить и запускать конвеер. Есть уже готовый рабочий модуль под Altera, который я хочу попробовать адаптировать по Xilinx без пределки основного кода.
  12. Так если только под Altera, то проблем нет. А если попытаться перейти на Xilinx, то возникают проблемы с использованием их примитивов или макросов - фактически поверх них нужно писать внешнюю обертку, т.к. один примитив даёт задействовать только один BRAM. Хотя, конечно, можно сделать комбинированный исходник: под Altera - altsyncram, под Xilinx - HDL и забить на лишнюю логику .
  13. Решил недавно попробовать вместо altsyncram использовать HDL описание DPRAM и столкнулся со следующей проблемой: Если синтезировать в чистом Quartus, то всё нормально. Если использовать Synplify, то вместо аппаратного rden получаю кучу внешних регистров адреса с мультиплексорами. Вопрос: можно ли как-то объяснить Synplify'ю, что нужно использовать аппаратный rden, а не лепить его аналог на логике? DPRAM_Q.rar DPRAM_S.rar
  14. Смотреть лучше всего в Chip Planner. Там точно видно, что в IO, а что на логике. P.S. Во вложении пример проекта (собиралось на Synplify 2012.03 и Quartus 11.0sp1). P.P.S. Не посмотрел на дату темы. По поводу ресинтеза. На сколько я понимаю, это можно прописать в P&R tcl скрипте. test.rar
  15. Результат полной синхронизации приведён на скриншотах (на рис. 3.png приведён пример ошибки). P.S. У нас требуется, чтобы на схеме присутствовали именно pcb символы. P.P.S. Глюк исчез после того как я обозвал сигналы в схеме точно также как сигналы в ПЛИС.
  16. Schematic Export Уже разобрался. В свойстве Port Binding нужно было поставить Signal вместо Pin. Теперь другая проблема. При автоматическом свапировании пинов в Expedition и последующем Back Annotation в IOD происходит некорректное переназначение пинов. Например, пин ddr2_ch1_ck_p вместо номера AB10 (в Expedition) имеет значение <none>. Тестовый проект во вложении. USIU2_IOD.rar Uch_Library_EE2007_full.rar
  17. Раньше при загрузке нового *.fx файла менялись номера пинов, а теперь меняются имена сигналов. Как сделать так, чтобы просто менялись номера пинов, а не сами сигналы? Версия EE7.9.2.
  18. Просто исходя из рисунка 12 на стр. 22 datasheet можно прийти к выводу, что дифпары 0 и 1 используются для первого канала, а 2 и 3 - для второго. DAC1408D650.pdf
  19. Вопрос к тем, кто работал с данной микросхемой. Если нужен только один канал ЦАП, можно ли отключить второй? Т.е. задействовать не 4 GTX линии, а только 2?
  20. Делал на SV, но переписать на обычный Verilog не очень сложно. `timescale 1 ns / 1 ps module DS18X20_CTRL #( parameter [8:0] CLKDIV = 9'd80 ) ( input clk, input read, output reg [15:0] temp, output error, inout IO ) ; localparam start = 3'd0, reset_1wire = 3'd1, check_termometer = 3'd2, write_cmd = 3'd3, wait_convert = 3'd4, read_scratchpad = 3'd5 ; reg [2:0] state = start ; reg [2:0] next_state = start ; reg [8:0] divider = 0 ; wire divider_cout ; reg divider_cout_clk = 1'b0 ; reg [8:0] timer = 0 ; wire timer_cout ; reg [8:0] toggle_cmp = 0 ; wire toggle ; wire read_1wire ; reg [15:0] shift = 0 ; reg [15:0] buffer = 0 ; reg error_n = 1'b0 ; reg [6:0] bit_cnt = 0 ; wire bit_cnt_cout ; reg out_reg_n = 1'b0 ; reg [1:0] in_reg = 0 ; reg [7:0] CRC = 0 ; wire XOR0 ; initial begin temp <= 0 ; end assign error = ~error_n ; assign IO = (out_reg_n)? 1'b0:1'bZ ; assign divider_cout = (divider == 0) ; assign timer_cout = (timer == 0) ; assign toggle = (timer == toggle_cmp) ; assign read_1wire = (timer == 9'd60) ; assign bit_cnt_cout = (bit_cnt == 0) ; assign XOR0 = CRC[0] ^ in_reg[1] ; always_ff @(posedge clk) begin if (read) temp <= buffer ; end always_ff @(posedge clk) begin in_reg <= (in_reg << 1) | IO ; end always_ff @(posedge clk) begin if (divider_cout) divider <= CLKDIV ; else divider <= divider - 1'b1 ; divider_cout_clk <= divider_cout ; end always_ff @(posedge clk) begin if (divider_cout_clk) begin case (state) start: if (timer_cout) begin state <= reset_1wire ; next_state <= wait_convert ; timer <= 9'd500 ; shift <= 16'h44CC ; bit_cnt <= 7'd16 ; out_reg_n <= 1'b1 ; end else begin timer <= timer - 1'b1 ; end reset_1wire: if (timer_cout) begin state <= check_termometer ; timer <= 9'd500 ; toggle_cmp <= 9'd432 ; out_reg_n <= 1'b0 ; end else begin timer <= timer - 1'b1 ; end check_termometer: if (timer_cout) begin state <= write_cmd ; end else begin timer <= timer - 1'b1 ; if (toggle & in_reg[1]) begin state <= start ; error_n <= 1'b0 ; end end write_cmd: begin if (timer_cout) begin if (bit_cnt_cout) begin state <= next_state ; end else begin timer <= 9'd70 ; if (shift[0]) toggle_cmp <= 9'd65 ; else toggle_cmp <= 9'd5 ; shift[15:0] <= {in_reg[1], shift[15:1]} ; bit_cnt <= bit_cnt - 1'b1 ; out_reg_n <= 1'b1 ; end end else begin timer <= timer - 1'b1 ; if (toggle) out_reg_n <= 1'b0 ; end end wait_convert: begin if (timer_cout) begin if (next_state == read_scratchpad) begin state <= reset_1wire ; timer <= 9'd500 ; shift <= 16'hBECC ; bit_cnt <= 7'd16 ; end else begin timer <= 9'd70 ; toggle_cmp <= 9'd65 ; end out_reg_n <= 1'b1 ; end else begin timer <= timer - 1'b1 ; if (read_1wire & in_reg[1]) next_state <= read_scratchpad ; if (toggle) out_reg_n <= 1'b0 ; end end read_scratchpad: begin if (timer_cout) begin if (bit_cnt_cout & (next_state == start)) begin state <= start ; if (CRC != 0) begin error_n <= 1'b0 ; end else begin error_n <= 1'b1 ; buffer <= shift ; end end else begin timer <= 9'd70 ; if (next_state != start) begin bit_cnt <= 7'd71 ; CRC <= 0 ; end else begin bit_cnt <= bit_cnt - 1'b1 ; end out_reg_n <= 1'b1 ; end next_state <= start ; end else begin timer <= timer - 1'b1 ; if (read_1wire) begin if (bit_cnt > 7'd55) shift[15:0] <= {in_reg[1], shift[15:1]} ; CRC <= {XOR0, CRC[7:5], CRC[4] ^ XOR0, CRC[3] ^ XOR0, CRC[2:1]} ; end if (toggle) out_reg_n <= 1'b0 ; end end default: state <= start ; endcase end end endmodule
  21. Так ведь можно заставить систему посылать пакеты с флагом IP_DONTFRAGMENT. BOOL dontfragment = TRUE ; setsockopt (sckt, IPPROTO_IP, IP_DONTFRAGMENT, (char*)&dontfragment, sizeof(dontfragment)) ;
  22. Так в том то вся и проблема, что в Options настройки шрифта отсутствуют напрочь. Конечно можно работать и так, хотя очень не удобно.
×
×
  • Создать...