2014-10-02 2 views
0

Я пишу Verilog код из 2 бит счетчика, используя JK Flip Flop, который насчитывает 0-3 и обратно 0. Я использую Xilinx EDA. Однако я продолжаю получать одну ошибку, и я не знаю, что это значит? Номера строк здесь не отображаются, но ошибка находится на «always @(posedge clk)».2 бит счетчика с использованием JK Flip Flop в Verilog

ERROR:HDLCompiler:1401 - "C:\Users\Eduardo\Documents\SFSU\Fall 2014\Engr 378\Lab 3\TwoBitCounter\twobitcounter.v" Line 30: Signal q in unit jkff is connected to following multiple drivers:

`timescale 1ns/1ps 
module twobitcounter(q_out, qbar_out, j,k, clk, reset); 
    input [1:0] j; input [1:0] k; input clk; input reset; 
    output [1:0] q_out; 
    output [1:0] qbar_out; 
    wire [1:0] q_out; 
    wire [1:0] qbar_out; 
    wire clk; 

    assign qbar_out[0] = ~q_out[0]; 
    assign j[0] = 1; 
    assign k[0] = 1; 
    assign j[1] = q_out[0]; 
    assign k[1] = q_out[0]; 

    jkff M1(q_out[0], qbar_out[0], j[0], k[0], clk, reset); 
    jkff M2(q_out[1], qbar_out[1], j[1], k[1], qbar_out[0]); 

endmodule 

module jkff(output q_out, output qbar_out, 
    input j, input k, input clk, input reset); 

    reg q; 
    assign q_out = q; 
    assign qbar_out = ~q; 

    initial begin 
     q = 1'b0; 
     end 
    always @(posedge clk) 
     begin 
     case({j,k}) 
     {1'b0, 1'b0}: begin 
      q = q; 
      end 
     {1'b0, 1'b1}: begin 
      q = 1'b0; 
      end 
     {1'b1, 1'b0}: begin 
      q = 1'b1; 
      end 
     {1'b1, 1'b1}: begin 
      q = ~q; 
      end 
     endcase 
     end 

    always @(posedge reset) 
     begin 
     q = 1'b0; 
     end 
endmodule 

ответ

1

ошибка говорит вам, что вы назначаете д в разных блоках. Это создает ошибку. Вы назначаете q как в своем блоке initial, так и в вашем блоке always.

Вы не должны использовать блоки initial в синтезируемом коде.

+0

** Почти никогда не использовать начальные блоки (большинство инструментов синтеза для FPGAs allo начальных блоков в некоторых случаях, например, инициализация элементов памяти). Кроме того, q также назначается в блоке сброса @ (posedge reset). – Unn

1

Вопрос q устанавливается в два блока always, которые не допускаются в синтезе. Объединение двух блоков всегда. Кроме того, q является флопом, поэтому его следует назначать с использованием неблокирующего назначения (<=), не блокируя назначение (=).

always @(posedge clk or posedge reset) 
begin 
    if (reset == 1'b1) begin 
    q <= 1'b0; 
    end 
    else begin 
    case({j,k}) 
    {1'b0, 1'b0}: begin 
     q <= q; 
     end 
    {1'b0, 1'b1}: begin 
     q <= 1'b0; 
     end 
    {1'b1, 1'b0}: begin 
     q <= 1'b1; 
     end 
    {1'b1, 1'b1}: begin 
     q <= ~q; 
     end 
    endcase 
    end 
end 

Вы почти никогда не использовать initial блоки синтезируемого кода. Большинство FPGA разрешают его для инициализации. Однако конструкции ASIC не поддерживают его. В обоих случаях, если есть асинхронный сброс/набор, тогда его исходный блок не следует использовать.

+0

Я пробовал ваш совет, но он дал мне такую ​​же ошибку для модуля twobitcounter. Я получаю сообщение об ошибке при назначении qbar_out [0] = ~ q_out [0]; " В нем указано, что qbar_out [0] подключен к нескольким драйверам –

+0

'q_out [0]' и 'qbar_out [0]' оба выхода из M1. Это делает его двойным драйвером, который является незаконным. Комментарий 'assign qbar_out [0] = ~ q_out [0];'. У вас также отсутствует подключение к порту на M2 – Greg

+0

Я получил его для работы. благодаря –

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

  • Нет связанных вопросов^_^