2013-08-22 2 views
0

Я новичок в Verilog HDL, и мой первый проект - реализовать простой счетчик секундомера, используя набор регистров. Я использую Altera Quartus.компиляция Verilog-кода в Quartus

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

Error (10028): Не удается разрешить несколько постоянных драйверов для чистых "sec0 [3]" в test_interface.v (127)

Любой человек может помочь? Код моделирует штраф в Modelsim.

Вот фрагмент кода, который вызывает проблемы:

always @ (posedge clk) 

    if (qsoutput == 1) 
     sec0 = sec0 + 1; 
    else if (sec0 == 4'b1010) begin 
     sec1 = sec1 + 1; 
     sec0 = 4'b0000; 
    end else if (sec1 == 4'b0110) begin 
     min0 = min0 + 1; 
     sec1 = 4'b0000; 
    end else if (min0 == 4'b1010) begin 
     min1 = min1 + 1; 
     min0 = 4'b0000;  
    end else if (min1 == 4'b0110) begin 
     sec0 = 4'b0000; 
     sec1 = 4'b0000; 
     min0 = 4'b0000; 
     min1 = 4'b0000; 
    end 
+0

Я действительно не вижу ничего плохого в этом сегменте кода. Не могли бы вы опубликовать полную версию 'test_interface.v', сделав заметку о том, что такое строка 127? Можете ли вы также опубликовать весь список ошибок компиляции? – Tim

+0

На самом деле я получаю несколько ошибок для каждой строки кода, а не только 127. Это происходит следующим образом: Ошибка (10028): Не удается разрешить несколько постоянных драйверов для сети «sec0 [3]» на test_interface.v - Ошибка (10028): Не удается разрешить несколько постоянных драйверов для сети «sec1 [3]» на test_interface.v и т. Д. – user2707696

+0

Понял, но нам нужна дополнительная информация от вас. Пожалуйста, отправьте две вещи, которые я просил, если вы хотите, чтобы я посмотрел дальше.Вы можете выбрать 'edit', чтобы добавить их в конец своего сообщения. – Tim

ответ

2

на основе your code in Dropbox, вы назначаете регистры в нескольких always блоков. Это незаконно для синтеза, и коспонсоры к сообщению об ошибке Altera Quartus имеют в виду. A reg тип должен быть назначен только в одном блоке always.

В качестве примера sec0 определен в always @(posedge reset_reg) и код, указанный в вашем запросе. code in Dropbox еще хуже, потому что вы разделяете логику счетчика на 4 отдельных всегда блока, которые назначают sec0.

Я предлагаю вам поставить все sec* и min* Resisters один тактовый синхронные всегда блок с асинхронным:

always(@posedge clk or posedge reset_reg) 
begin 
    if(reset_reg) 
    begin 
    // ... asynchronous reset code ... 
    end 
    else 
    begin 
    // ... synchronous counter code ... 
    end 
end 

Эта статья идет в подробности о хороших Verilog кодирования практики синтеза: http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf


Другие вопросы, которые у вас будут:

  • При назначении регистров используйте неблокирующие (<=). Это обсуждается в Cliff's paper, упомянутом ранее.
  • Избавьтесь от начального блока. Я понимаю, что некоторые синтезаторы FPGA позволяют это, а некоторые игнорируют его. Лучше использовать асинхронный способ превратить все в известное и предсказуемое значение.
  • Блок, начинающийся с always @ (clk or start_reg or lap_reg or reset_reg), имеет странный список чувствительности и, скорее всего, даст вам проблемы. вы wither хотите @(*), если вам нужна комбинационная логика или @(posedge clk or posedge reset_reg) для синхронных провалов.
  • Очень редко используются шлейфы с двойным краем. Строка always @ (posedge clk or negedge clk) должна быть always @ (posedge clk) для синхронного или always @(*) для комбинированной логики.
+0

спасибо за всю эту ценную информацию! – user2707696

+0

@ user2707696 Примите этот ответ, если этот ответ выполнил ваш вопрос. Это поможет другим узнать, что вы не ищете больше решений. Добавьте комментарий, если что-то из ответа является неполным или неясным. – Greg

Смежные вопросы