У меня есть сигнал sig. Это может оставаться высоким в течение нескольких тактовых циклов. Я хочу создать его импульс, который должен переключаться на столько тактовых циклов, для которых сигнал был высоким.
То есть каждый раз, когда мой знак сигнала меняется от низкого к высокому, я получаю его импульс. Сложность заключается в том, что если сигнал высокий для нескольких кликов, как мне создать его импульс? Несмотря на то, что мой сигнал высокий в течение трех последовательных тактовых циклов, мой импульс должен переключаться три раза (с 0 на 1 и с 1 на 0).
module PULSE_GEN (input clk, input sig,input en,output wire pulse);
reg r1,r2,r3;
always @(posedge clk) begin
if (en)
begin
r1 =sig;
r2 = r1 ^ sig;
r3 = r1 & r2;
end
else
r3 = 1'b0;
end
assign pulse = r3;
endmodule
Однако я не могу генерировать импульс. Форма волны в порядке показывает pulse, en, sig и clk. pulse всегда мало.
Я создал рисунок желаемой формы волны:
Как показано на изображении, sig выше для нескольких тактовых циклов. Требование состоит в том, чтобы импульс был высоким в положении clk и должен стать низким в следующем положении clk. И снова становится высоким на следующей позиции, так как сигнал был высоким. Это должно происходить только тогда, когда состояние en высокое (что в основном является опережением времени). Если en низкое, пульс должен быть низким.
опубликуйте свой тестовый стенд как минимальный воспроизводимый пример, чтобы мы могли запустить симуляцию
r1 ^ sig всегда будет 0, потому что r1 = sig. В вашем описании есть противоречие в том, что вы говорите, что хотите создать его импульс на определенном цикле, который должен оставаться высоким только в течение одного тактового цикла, но затем вы говорите, что хотите, чтобы он переключался три раза.
я обновил вопрос
@dave_59: я обновил
@Mikef: я создал рисунок
@mikef: всякий раз, когда мой сигнал высокий, мой пульс должен стать высоким на часах и должен снизиться на следующем уровне часов





Тот факт, что вам нужно, чтобы pulse поднялся с sig, означает, что вам нужно использовать конечный автомат в стиле Мили; где выход является функцией его текущего состояния и текущего входа. Мили работает быстро, но более подвержен сбоям и другим ограничениям. Рекомендую поискать: Мили против Мура. Я также рекомендую поискать информацию о блокировке и неблокировке Verilog.
Требуемое поведение может быть достигнуто с помощью приведенного ниже. Я пропустил en, так как ваш вопрос выглядит как домашнее задание. Я оставлю это вам, чтобы понять.
assign pulse = !present_state && sig;
always @(posedge clk) begin
present_state <= pulse && sig;
end
они в порядке импульс, эн, сиг и цлк