Выход модуля сумматора всегда не волнует [Verilog] - PullRequest
0 голосов
/ 12 февраля 2019

Я знаю VHDL, и теперь я пытаюсь сделать немного verilog.У меня есть два файла, один из которых содержит счетчик, а другой содержит 32-разрядный полный сумматор.

Counter.v:

module counter (
    input clk,
    input enable,
    input reset,
    output reg [3:0] count
    );


    wire [31:0] temp2 = 0;
    reg [31:0] clk_count = 0;
    wire [31:0] test = 32'b1;

    parameter integer number_of_clk_cycles = 15;
    adder adder1(clk_count, test, temp2);


    always @(posedge clk) begin
        if (reset) begin
            count = 0;
        end else if (enable) begin
            clk_count <= temp2;    
            if(clk_count == number_of_clk_cycles) begin
                count <= count + 1;
                clk_count <= 0;
            end
        end
    end

endmodule

Adder.v:

module adder(
    input [31:0] a,
    input [31:0] b,
    output [31:0] c
    );

    wire [32:0] cin;    //The internal Carry signal
    assign cin[0] = 0;     //Force the carry line to 0, since the first adder has no carry

    genvar i;
    for(i=0; i<32;i = i + 1) begin
        fa fa1( a[i], b[i], cin[i], c[i], cin[i+1]);
    end

endmodule

module ha( a, b, s, c);
    input a, b;
    output s, c;

    xor xor1(s ,a, b);      //Output first, then inputs
    and and1(c, a ,b);        //Output first, then inputs
endmodule

module fa (a , b, cin, s, cout);
    input a, b, cin;
    output s, cout;

    ha ha1(a, b, ha1_sum, ha1_cout);        //Half adder 1
    ha ha2(ha1_sum, cin, s, ha2_cout);        //Half adder 2
    or or1(cout, ha1_cout, ha2_cout);        //Carry out
endmodule

Я проверил свой полный код сумматора в ModelSIM, и он работает постоянно.Но когда я пытаюсь запустить код counter.v, вывод adder1 всегда равен X (все равно).Если для разрешения задано значение «1», по сумматору все равно будет волноваться (clk_count <= temp1;).Чего мне не хватает?

1 Ответ

0 голосов
/ 13 февраля 2019

В verilog, если вы управляете одним и тем же wire с другими значениями, отличными от z, результирующее значение будет x.

В вашем случае вы дважды запускаете temp2.Первый раз здесь:

 wire [31:0] temp2 = 0;

, что эквивалентно

 wire [31:0] temp2;
 assign temp2 = 0;

, и второй раз с выходом вашего сумматора.

В результате, еслизначение, полученное на выходе сумматора, равно ненулевое , temp2 станет x, в противном случае оно будет 0.

Так что не присваивайте 0к этому.

...