ilkz 0 27 марта, 2013 Опубликовано 27 марта, 2013 (изменено) · Жалоба А почему симуляция (функциональная) компонента ALTDDIO в режиме выхода (OUT) не соответствует времянкам из даташита (ug_altddio, страница 22)? Результат симуляции: Группы ddout - ноги компонента. На вход _h компонента побитно выставляются биты шины channel, на вход _l побитно выставляются биты слова SET_MASK (и там и там - начиная с нулевого бита). Времянка от Альтеры: Изменено 27 марта, 2013 пользователем ilkz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 27 марта, 2013 Опубликовано 27 марта, 2013 · Жалоба Входы формируются по клоку или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 27 марта, 2013 Опубликовано 27 марта, 2013 (изменено) · Жалоба Да, вся схема синхронная. Приведу код: module sw_phy ( input reset, input clk, input [3:0] channel, input set, input get, output sw_d_io, output sw_d_oe, output sw_d_dir, output sw_d_clk ); localparam SET_MASK = 4'b1100; localparam GET_MASK = 4'b1010; wire sys_clk; wire locked; wire sys_reset = !locked; sys_pll sys_pll ( .inclk0 (clk), .c0 (sys_clk), .locked (locked) ); reg [3:0] txbuf; reg tx_oe; reg mask_sel; reg [1:0] bit_cnt; always @(posedge sys_clk, posedge sys_reset) begin if(sys_reset) begin txbuf <= 0; tx_oe <= 0; mask_sel <= 0; bit_cnt <= 0; end else begin if(set) mask_sel <= 1; if(set | get) begin txbuf <= channel; bit_cnt <= 0; tx_oe <= 1; end if(tx_oe) begin if(bit_cnt < 3) bit_cnt <= bit_cnt + 1; else begin tx_oe <= 0; txbuf <= 0; bit_cnt <= 0; mask_sel <= 0; end end end end ddr_outblock ddr_out ( .oe (tx_oe), .outclock (sys_clk), .datain_h (tx_oe ? txbuf[bit_cnt] : 1'b0), .datain_l (mask_sel ? SET_MASK[bit_cnt] : GET_MASK[bit_cnt]), .dataout (sw_d_io) ); assign sw_d_clk = sys_clk; endmodule Изменено 27 марта, 2013 пользователем des00 используйте codebox для оформления больших частей кода (с) модератор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 27 марта, 2013 Опубликовано 27 марта, 2013 · Жалоба Извините, я Верилог не воспринимаю. (Тут приходится ковыряться с одной коркой, готорая генерится только на Верилоге. Для меня это адъ.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 27 марта, 2013 Опубликовано 27 марта, 2013 · Жалоба А если я переписал DDR-регистр самостоятельно, то как можно компилятору указать, чтобы он засовывал оба триггера (pos-edged и neg-edged) в один pin? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 27 марта, 2013 Опубликовано 27 марта, 2013 · Жалоба Да, вся схема синхронная. Приведу код: хммм .datain_h (tx_oe ? txbuf[bit_cnt] : 1'b0), .datain_l (mask_sel ? SET_MASK[bit_cnt] : GET_MASK[bit_cnt]), пропустите через триггеры + еще для адекватности задержки на цепях #1 поставить не помешает, если чистый верилог моделируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 27 марта, 2013 Опубликовано 27 марта, 2013 · Жалоба Прошу прощения, да, на входе компонента были мультиплексоры. Добавил задержки, триггеры, но моделирование все равно показывает ерудну: module sw_phy ( input reset, input clk, input [3:0] channel, input set, input get, output sw_d_io, output sw_d_oe, output sw_d_dir, output sw_d_clk ); localparam SET_MASK = 4'b1100; localparam GET_MASK = 4'b1010; wire sys_clk; wire locked; wire sys_reset = !locked; sys_pll sys_pll ( .inclk0 (clk), .c0 (sys_clk), .locked (locked) ); reg [3:0] txbuf; reg tx_oe; reg mask_sel; reg [1:0] bit_cnt; reg d_hi, d_lo, ddout_oe; always @(posedge sys_clk, posedge sys_reset) begin if(sys_reset) begin #1; txbuf <= 0; tx_oe <= 0; mask_sel <= 0; bit_cnt <= 0; d_hi <= 0; d_lo <= 0; ddout_oe <= 0; end else begin if(set) #1 mask_sel <= 1; if(set | get) begin #1; txbuf <= channel; bit_cnt <= 0; tx_oe <= 1; end if(tx_oe) begin if(bit_cnt < 3) #1 bit_cnt <= bit_cnt + 1; else begin #1; tx_oe <= 0; txbuf <= 0; bit_cnt <= 0; mask_sel <= 0; end end #1; d_hi <= tx_oe ? txbuf[bit_cnt] : 1'b0; d_lo <= mask_sel ? SET_MASK[bit_cnt] : GET_MASK[bit_cnt]; ddout_oe <= tx_oe; end end ddr_outblock ddr_out ( .outclock (sys_clk), .oe (ddout_oe), .datain_h (d_hi), .datain_l (d_lo), .dataout (sw_d_io) ); assign sw_d_clk = sys_clk; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться