Например TDA7294

Форум РадиоКот • Просмотр темы - Verilog как это работает?
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 20:56:20

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Verilog как это работает?
СообщениеДобавлено: Вт мар 28, 2017 21:00:00 
Родился

Зарегистрирован: Чт ноя 28, 2013 10:06:10
Сообщений: 8
Рейтинг сообщения: 0
Добрый день! Помогите пожалуйста разобраться почему происходит именно так, а не иначе.
Сразу перейду непосредственно к сути.
Вот текст очень небольшого модуля на языке Verilog:
Код:
module filter(
   input wire data,             
   input wire clk,                 
   output reg signal,
   output reg [1:0]state
);

always @ (posedge clk)
begin
   case(state)
      0: state <= 1;
      1: state <= 2;
      2: state <= 3;
      3: state <= 0;
   endcase   
end

always @ (state)
begin
   case(state)
      0: signal <= signal;
      1: signal <= data;
      2: signal <= signal;
      3: signal <= signal;
   endcase   
end

endmodule

Задумка была такая. При каждом фронте "clk" меняется переменная "state", а при каждом изменении "state" меняется состояние сигнала выходной переменной "signal".
При "state=1" в выходную переменную"signal" записывается значение входа "data", в остальных случаях переменная "signal" не должна менять своего значения.
По идее значение переменной "signal" должно обновляться только при изменении переменной "state", так как только она заключена в так называемый список чувствительности (always @ (state)).
Но на деле ее значение повторяет входной сигнал "data", при неизменяемой "state=1". Как будто при "state=1" между "data" и "signal" просто проводник. Прикладываю скриншот из симулятора.
Буду признателен за подсказки.
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Verilog как это работает?
СообщениеДобавлено: Ср мар 29, 2017 22:37:00 
Родился

Зарегистрирован: Чт ноя 28, 2013 10:06:10
Сообщений: 8
Рейтинг сообщения: 0
Если кому интересно причина такого поведения следующая:
При описании выражений внутри процедурных блоков комбинаторной логики
регистры, которым идет присвоение не будут выполнены в виде D-триггеров после синтеза.
Описание синхронной логики очень похоже на описание
комбинаторной логики с одним важным отличием – в списке чувствительности
always блока указывают не сами сигналы, а фронт тактовой частоты clock. Только в этом случае регистры,
которым идет присвоение, будут реализованы в виде D-триггеров.
На всякий случай выложу рабочий модуль. Мало ли.
Код:
module filter(
   input wire data,             
   input wire clk,                 
   output reg signal,
   output reg [1:0]state
);

always @ (posedge clk)
begin
   case(state)
      0: begin state <= 1; signal <= data; end;
      1: begin state <= 2; signal <= signal; end;
      2: begin state <= 3; signal <= signal; end;
      3: begin state <= 0; signal <= signal; end;
   endcase   
end

endmodule


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y