Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Проблема с типом reg.

Проблема с типом reg. 12 года 11 мес. назад #641

  • Петр
  • Петр аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 13
  • Спасибо получено: 1
Здравствуйте!

Осваиваю PLL и чтобы убедиться в его работоспособности написал такой код:

module test_wires(
input clk,
output led
);

reg b]32:0[/b pos;
reg l;

always@(posedge clk)
begin
pos = pos + 1;
if (pos == 150 000 000)
begin
pos = 0;
l = l + 1'b1;
end
end
assign led = l;

endmodule


При частоте 150МГц светодиод каждую секунду или гаснет или включается. Все просто.
Проблема в том, что работает через раз.
Решил её так: увеличил разрядность переменной pos до 64 разрядов. Все заработало на ура!
Сомнения появились, но решил не заморачиваться B)

Но это не все!
Взял готовый модуль из другого проекта, подключил - не работает.
Плясал с бубном, пока не вспомнил про разрядность и опять увеличил некоторые переменные. Все опять заработало(с погрешностями - генерирую VGA, видно, что иногда пропадает картинка)!

Решил разобраться: в чем же дело. Вернул все переменные(в обоих модулях) до первоначального уровня - все заработало на отлично - картинка как влитая.

В чем дело? Может, чип уже портится?:)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Проблема с типом reg. 12 года 11 мес. назад #642

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 112
  • Спасибо получено: 34
какую плату Вы используете? судя по тому, что разбираетесь с PLL у Вас не плата марсоход, правильно? Ведь PLL есть только в FPGA..
Не очень понятно, что у Вас происходит однако скажу несколько замечаний - ни разу не видел, чтобы чип "портился", ни CPLD ни FPGA.
Возможно есть какие-то другие проблемы вроде нестабильного питания или еще что-то.
Разрядность скорее всего никак не влияет - потому, что независимо от того какую разрядность напишите компилятор оптимизирует и выбросит лишние триггера. Пользуйтесь в Quartus II меню Tools->Netlist viewers -> RTL Viewer, чтобы посмотреть что же реально получилось в результате из Вашего кода.
число 150000000 это в шестнадцатеричном виде 8F0D180, значит достаточно 28 бит счетчика - описывается как reg [27:0]counter;
В том коде что вы приводите reg [32:0]pos; описывается 33хразрядный счетчик, но в RTLViewer останется только 28 разрядов.
И последнее (не по вашей проблеме, но просто замечание).
Вы пишите:
pos = pos + 1;
if (pos == 150 000 000)
begin
pos = 0;
l = l + 1'b1;
end
Так работать будет, но лучше так не писать. Такая запись создает ложное чувство, что сперва произойдет присвоение в регистр pos=pos+1, а "потом" если нужно переприсвоится ноль. это стиль программирования на C/C++.
Лучше все же написать вот так:
always @(posedge clk)
if(cnt==149999999)
cnt<=0;
else
cnt<=cnt+1;
Такая запись точно описывает суть дела - перед регистром стоит мультиплексор (if-else), который выбирает число для записи. Это, конечно, к Вашей проблеме не имеет отношения, но просто замечание по стилю написания.
Спасибо сказали: Петр

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Проблема с типом reg. 12 года 11 мес. назад #643

  • Петр
  • Петр аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 13
  • Спасибо получено: 1
Спасибо за замечание!

Более того, так как я написал может создать потенциальные грабли: мне кажется, pos никогда не будет равен 0!

Плату использую китайскую с Cyclone, питание беру по USB.
После начала темы все работает нормально. Испугалась плата, что-ли?:unsure:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Проблема с типом reg. 12 года 11 мес. назад #656

  • Петр
  • Петр аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 13
  • Спасибо получено: 1
Кстати, попробовал увеличить разрядность некой переменной в проекте, а после компиляции посмотрел на количество задействованных логических ячеек. Общее количество увеличилось. Не сильно оптимизирует:whistle:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.104 секунд
Работает на Kunena форум