Модуль производит правильный вывод один, но не при создании экземпляра

Я сделал простой тикер-модуль, который выдает рик каждый раз, когда счетчик достигает 163. Вот код для него:

    module baud_gen(
    input clock,
    input reset,
    output tick
    );

reg [7:0] count;

always @ (posedge clock)
begin
    if(reset || (count == 163))
        count <= 0;
    else
        count <= count + 1;
end

assign tick = (count == 163) ? 1:0;

endmodule

Он работает как следует, в симуляции, когда счетчик достигает 163, tick назначается высокий, а в противном случае его 0.

Теперь я создал это в своем приемнике UART. Вот фрагмент кода:

module receiver(
    input clock,
    input reset,
    input s_tick,
    input rx,
    output reg done,
    output [7:0] word_out
    );

    localparam [1:0]
            idle = 00,
            start = 01,
            data = 10,
            stop = 11;

    baud_gen ticker (.clock(clock), .reset(reset), .tick(s_tick));
   .
   .
   .
   .

Теперь, когда я запускаю симуляцию для receiver модуль. Тикер не работает правильно. Здесь вместо производства 1 в count==163 это производит x,

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

Я не могу понять, почему это изменение в поведении. Спасибо за поиск

1 ответ

Решение

Лучше всего предположить, что второй водитель tick где-то в дизайне. Простой способ узнать это изменить tick назначение в baud_gen чтобы:

wire pre_buf_tick = (count == 163) ? 1:0;
assign tick = pre_buf_tick;

Зонд обоих сигналов. Шансы pre_buf_tick будет 1, когда tick это X.

Причина конфликтующего драйвера может быть связана с s_tick быть перечисленным в качестве входа receiver когда это должен быть выход.

Другие вопросы по тегам