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

ALTDDIO_OUT

А почему симуляция (функциональная) компонента ALTDDIO в режиме выхода (OUT) не соответствует времянкам из даташита (ug_altddio, страница 22)?

 

Результат симуляции:

post-67084-1364380086_thumb.png

 

Группы ddout - ноги компонента.

На вход _h компонента побитно выставляются биты шины channel, на вход _l побитно выставляются биты слова SET_MASK (и там и там - начиная с нулевого бита).

 

Времянка от Альтеры:

post-67084-1364380209_thumb.png

Изменено пользователем ilkz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, вся схема синхронная. Приведу код:

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

Изменено пользователем des00
используйте codebox для оформления больших частей кода (с) модератор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, я Верилог не воспринимаю. (Тут приходится ковыряться с одной коркой, готорая генерится только на Верилоге. Для меня это адъ.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если я переписал DDR-регистр самостоятельно, то как можно компилятору указать, чтобы он засовывал оба триггера (pos-edged и neg-edged) в один pin?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, вся схема синхронная. Приведу код:

хммм

 

.datain_h (tx_oe ? txbuf[bit_cnt] : 1'b0),
.datain_l (mask_sel ? SET_MASK[bit_cnt] : GET_MASK[bit_cnt]),

пропустите через триггеры + еще для адекватности задержки на цепях #1 поставить не помешает, если чистый верилог моделируется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения, да, на входе компонента были мультиплексоры.

 

Добавил задержки, триггеры, но моделирование все равно показывает ерудну:

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

 

post-67084-1364391109_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...