Модуль производит правильный вывод один, но не при создании экземпляра
Я сделал простой тикер-модуль, который выдает рик каждый раз, когда счетчик достигает 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
когда это должен быть выход.