2015-03-27 2 views
0

Я написал код Verilog, чтобы найти остаток, когда мы делим два числа. Но я столкнулся с одной проблемой. У меня есть q (дивиденд) и m (делитель), rem - остаток. Мой алгоритм:Verilog код для поиска остатка

if(q>m) 
    q=q-m 
otherwise 
    rem=q 

Я написал эту Verilog код, но if -statement бежит за один раз. В следующем такте цикл принимает значение p=q, чего я не хочу. Я хочу, чтобы моя стоимость в p появилась как p=p-m.

Мой код:

module div(q,clk,rem,p,count); 

    parameter m=13'd840; 
    input [12:0] q; 
    input clk; 
    output reg [12:0] rem; 
    output reg [3:0] count; 
    output reg [12:0] p; 
    initial 
    begin 
     count=4'b0; 
     //+ rem=9'b0; 
     //p=13'b0; 
    end 

    [email protected](posedge clk) 
    begin 
     p=q; 
     if (p>m) 
     begin 
     p=p-m; 
     count=count+1; 
     rem=p; 
     end else 
     rem=9'b0; 
    end 
endmodule 
+0

Пожалуйста, покажите ваш испытательный стенд. Мне кажется, что вы должны получить 'X'-вывод с кодом, написанным так, как вы это сделали. – Qiu

ответ

0

Ваш алгоритм неправильно. Это должно быть что-то вроде этого

while(q>=m) 
    q=q-m 
rem=q 

Затем ваш модуль Verilog-то вроде этого:

module div #(parameter m=13'd840) (
    input wire clk, 
    input wire [12:0] q, 
    input wire load, 
    output reg [12:0] rem, 
    output reg finish 
); 

    reg [12:0] p; 

    [email protected](posedge clk) begin 
    if (load) begin 
     finish <= 1'b0; 
     p <= m; 
    end 
    else if (p>=q) 
     p <= p - q; 
    else begin 
     rem <= p; 
     finish <= 1'b1; 
    end 
    end 
endmodule 

Я добавил два сигнала: load и finish. load необходимо подтвердить, чтобы сохранить новый делитель в q. Поскольку время, необходимое модулю для поиска остатка, не всегда одинаково, сигнал finish утверждается, когда есть допустимый вывод в rem.

Быстрый испытательный стенд:

module tb; 
    reg clk,load; 
    reg [12:0] q; 
    wire [12:0] rem; 
    wire finish; 

    div uut (clk, q, load, rem, finish); 

    initial begin 
    clk = 1'b1; 
    for (q=1; q<840; q=q+1) begin 
     load = 1; 
     @(posedge clk); // allow settle load 
     load = 0; 
     @(posedge finish); // wait until finish is asserted 
     @(posedge clk); // allow settle rem 
     if (rem!=840%q) begin // assert rem 
     $display ("840 %% %d = %d , %d\n", q, rem, 840%q);   
     $finish; 
     end 
    end 
    $display ("PASSED\n"); 
    end 

    always begin 
    clk = #5 ~clk; 
    end 
endmodule 
Смежные вопросы