вопросы по Verilog

Программируемая логика - это не так уж и сложно. Разберемся вместе.
Nevox
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Re: вопросы по Verilog

Сообщение Nevox »

придется думать что-то гениальное....
потому что прошивка на AHDL влезает и работает)
Pe3ucTop
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Re: вопросы по Verilog

Сообщение Pe3ucTop »

Кажется вы не внимательны!
1) В исходном коде только один регистр ! IN_REG[15..0] , остальное всё логические действия !
2) Вы не разобрались как работать с портом ввода/вывода т.е. двунаправленным, и поэтому наверное код не работает..

Пример от Алтеры:

Код: Выделить всё

module bidirec (oe, clk, inp, outp, bidir);
// Port Declaration
input   oe;
input   clk;
input   [7:0] inp;
output  [7:0] outp;
inout   [7:0] bidir;

reg     [7:0] a;
reg     [7:0] b;

assign bidir = oe ? a : 8'bZ ;
assign outp  = b;

// Always Construct
always @ (posedge clk)
begin
    b <= bidir;
    a <= inp;
end

endmodule


Тоесть читаем состояние порта когда ему присвоено состояние "Z"

В остальном, хорошо что двигаетесь вперёд..
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: вопросы по Verilog

Сообщение РадиоЛоматель »

Добрый день! Такая проблема. Есть код на Verilog, который, по идее, реализует машину состояний для инициализации динамической памяти. Проблема в том, что при компиляции в State Machine Viewer-е эта машина состояний просматривается как пустая. Соответственно, в железке ничего не срабатывает. Уменьшил код до такого:
Спойлер

Код: Выделить всё

module MemInit (
      //Тактирование
      input wire mem_clk_133MHz,
      input wire mem_clk_lock,
      input wire nreset,
      
      output wire init_done,
      //output wire [2:0] init_cmd,
      //output wire [21:0] init_adr,
      input wire cmd_ack
   );
   
   /*****************************************************************/
   //Описание состояний
   localparam [3:0]
      state_begin    = 4'b0000,
      state_loadreg1 = 4'b0001,
      state_iwait    = 4'b0010,
      state_prech    = 4'b0011,
      state_prwait    = 4'b0100,
      state_fautor    = 4'b0101,
      state_fwait    = 4'b0110,
      state_sautor    = 4'b0111,
      state_swait    = 4'b1000,
      state_loadmr    = 4'b1001,
      state_loadreg2 = 4'b1010,
      state_done       = 4'b1111;
         
   /*****************************************************************/
   //регистры
   reg [3:0] state = state_begin;
   reg [3:0] next_state = state_begin;
      
   reg init_done_reg = 0, next_init_done_reg;
   reg [31:0] cycle_counter = 0;
   reg [31:0] next_cycle_counter = 0;
   
   assign init_done = init_done_reg;
   
   /*****************************************************************/
   //Тактирование
   wire clk;
   assign clk = mem_clk_133MHz & mem_clk_lock;
   
   always @(posedge clk or negedge nreset) begin
      if(!nreset) begin      //Сброс
         state <= state_begin;
         init_done_reg <= 0;
      end
      else begin            //Нормальная работа
         state <= next_state;
         init_done_reg <= next_init_done_reg;
         cycle_counter <= next_cycle_counter;
      end
   end
   
   /*****************************************************************/
   //Машинка состояний
   always @* begin
      next_state = state;
      next_init_done_reg = init_done_reg;
      
      next_cycle_counter = cycle_counter + 32'b1;
      
      case (state)
         state_begin:
            begin
               next_cycle_counter = 0;
               next_state = state_iwait;
            end
         state_iwait:
            begin
               if(cycle_counter >= 32'd133000) next_state = state_done;
            end
         state_done:
            begin
               next_init_done_reg = 1;
            end
         default:
            begin
               next_state = state_begin;
               next_init_done_reg = 0;
            end
      endcase
   end
   
endmodule

Все равно, машина состояний остаётся пустой, регистр init_done_reg никогда не становится единицей, хотя ошибится тут трудно, вроде как. Уже бьюсь головой об стену. Что я делаю не так?
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

Хочу освоить verilog
Создал программу счетчика

module q1 (led [29:0], clk);
input clk;
output reg [29:0]led;
always @(posedge clk)
begin
#100
led <= led + 1'd1;
end
endmodule

Почему задержка не срабатывает?
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: вопросы по Verilog

Сообщение РадиоЛоматель »

Pawel91 писал(а):Почему задержка не срабатывает?

Что значит, не срабатывает? Написанное вами значит, что между положительным фронтом clk и изменением значения регистра leds будет задержка 100 нс. Но частота изменений регистра leds будет определяться частотой тактирования clk. Вот вам картинка для пояснения:

Изображение
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

Я так и предполагал, но симуляция в квартус выдает другое.
Задержка получается 6.819
(картинку загрузить не получилось((()
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: вопросы по Verilog

Сообщение Meteor »

Не уверен что верилог сильно отличается, но в вхдл, задержка имеет смысл только в моделировании (например что бы задать смещение сигналов), а в синтезе (речь как я понял именно о синтезе) команда задержки не работает.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

Я вот как раз и делал моделирование :( , modelsim пока не осилил, делал во встроенной в 13 квартусе системе моделирования(waveform editor), указал на конкретно временное моделирование, я вообще делаю лабы студентам, мне нужно полностью изучить этот язык, так как лабы будут на освоение этого языка. Вот хочу научиться как правильно писать задержки для модулей.
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: вопросы по Verilog

Сообщение РадиоЛоматель »

Pawel91 писал(а):Я вот как раз и делал моделирование

А какой период у источника тактового сигнала? Может, ваша задержка кратна этому периоду?
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

Период разный делал и 200 и 500 нс. Задержка одна и таже
Nevox
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Re: вопросы по Verilog

Сообщение Nevox »

Здравствуйте! Помогите разобраться в конечных автоматах на верилоге для альтеры.

Что можно почитать? С чего начать?
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

Поддерживаю вопрос порекомендуйте пожалуйста русскоязычную литературу, раскрывающую синтаксис и семантику языка Verilog HDL, а то до сих пор не могу разобраться с функциями следующих команд :( :
cmos
deassign
pmos
pull0
pull1
pullup
pulldown
rcmos
release
rnmos
rpmos
rtran
rtranif0
rtranif1
specparam
strength
strong
notif0
notif1
strong1
tran
tranif0
tranif1
small
medium
large
force
Nevox
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Re: вопросы по Verilog

Сообщение Nevox »

Помогите с мелочью.

пишу строчку :

assign CLK1=CLK2;

у меня CLK1 бежит как надо, а CLK2 просто включается в единицу и все, как правильно будет написать?
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

Попробуйте
wire CLK1 = CLK2
Nevox
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Re: вопросы по Verilog

Сообщение Nevox »

так не работает,мне надо вход с выходом напрямую связать(
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

Т.е создать обратную связь?
Nevox
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Re: вопросы по Verilog

Сообщение Nevox »

Сделать перенаправление) Т.е есть альтерка, на одну ногу приходит одно, с другой ноги выходит тоже самое, в данном случае клок.
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

попробуйте
assign CLK2=CLK1 :)
Nevox
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Re: вопросы по Verilog

Сообщение Nevox »

так тоже не прокатывает,делал уже)
Pawel91
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Re: вопросы по Verilog

Сообщение Pawel91 »

А какая частота ?
Ответить

Вернуться в «ПЛИС»