Создать импульс заданного сигнала

У меня есть сигнал 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 низкое, пульс должен быть низким.

они в порядке импульс, эн, сиг и цлк

geeky 31.07.2023 16:00

опубликуйте свой тестовый стенд как минимальный воспроизводимый пример, чтобы мы могли запустить симуляцию

toolic 31.07.2023 16:02
r1 ^ sig всегда будет 0, потому что r1 = sig. В вашем описании есть противоречие в том, что вы говорите, что хотите создать его импульс на определенном цикле, который должен оставаться высоким только в течение одного тактового цикла, но затем вы говорите, что хотите, чтобы он переключался три раза.
dave_59 31.07.2023 17:16

я обновил вопрос

geeky 31.07.2023 19:01

@dave_59: я обновил

geeky 31.07.2023 19:14

@Mikef: я создал рисунок

geeky 01.08.2023 05:08

@mikef: всякий раз, когда мой сигнал высокий, мой пульс должен стать высоким на часах и должен снизиться на следующем уровне часов

geeky 01.08.2023 06:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тот факт, что вам нужно, чтобы pulse поднялся с sig, означает, что вам нужно использовать конечный автомат в стиле Мили; где выход является функцией его текущего состояния и текущего входа. Мили работает быстро, но более подвержен сбоям и другим ограничениям. Рекомендую поискать: Мили против Мура. Я также рекомендую поискать информацию о блокировке и неблокировке Verilog.

Требуемое поведение может быть достигнуто с помощью приведенного ниже. Я пропустил en, так как ваш вопрос выглядит как домашнее задание. Я оставлю это вам, чтобы понять.

assign pulse = !present_state && sig;
always @(posedge clk) begin
  present_state <= pulse && sig;
end

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