2016-06-21 13 views
0

Ich bin neu bei Verilog und brauche hier ein wenig Hilfe. Ich habe ein Registerarray reg [32-1:0] out, das eine Ganzzahl mit Vorzeichen darstellt. Ein kleineres Array enthält eine Zahl zwischen 0 und 1000 reg [14-1:0] d. Ich möchte so etwas wie dieses (Dämpfung aus bei jedem Taktzyklus) tun:Exponentieller Zerfall in Verilog

always @(posedge clk_i) begin 
    out <= $signed(out) * $unsigned(d)/1000; 
end 

Ich habe gehört, dass die Verwendung von/ist eine schlechte Praxis für synthetisierbaren Code. Kann mir jemand zeigen, wie man einen solchen exponentiellen Zerfall implementiert?

EDIT: Ich habe geteilt durch 1000 zu teilen durch 1024, weil es viel einfacher zu handhaben ist. Mein Code sieht nun wie folgt aus:

reg [32-1:0] out; 
reg [32-1:0] in; 
reg [42-1:0] tmp; 
reg [14-1:0] d; 
always @(posedge clk_i) begin 
    tmp = {in,10'd0}; 
    if(tmp[41]==1) begin 
     tmp = $signed(tmp) * -1; 
     tmp = $signed(tmp) >> 10; 
     tmp = $signed(tmp) * $unsigned(d); 
     tmp = $signed(tmp) * -1; 
    end 
    else begin 
     tmp = $signed(tmp) >> 10; 
     tmp = $signed(tmp) * $unsigned(d); 
    end 
    out <= tmp[42-1:10]; 
end 

Der Code funktioniert gut in der Simulation, sondern auf der fpga es scheint, wie in von Null multipliziert wird (out Null ist)? Weiß jemand, was hier schief läuft?

+0

Betrachten Sie D als Fixpunkt anstelle einer ganzen Zahl. Es kann jetzt Teilinformationen speichern. Speichern Sie das neue d als 'alt d/1000' und Ihr Problem ist nur Multiplikation, keine Division. – Morgan

+0

[Verilog: Festpunkt] (http://Stackoverflow.com/a/28383767/97073) – Morgan

+0

Ich habe meinen Code geändert. Könntest du bitte einen Blick darauf werfen? – user2224350

Antwort

1

Vorzeichenbehaftete Nummer sollte >>> verwenden, um zu verlängern. Nicht sicher, warum Sie die * -1 vielleicht die >>> tun müssen, wird das Problem lösen. Berücksichtigen Sie auch das Multiplizieren vor dem Verschieben, um eine bessere Genauigkeit zu erhalten.

auch tun:

tmp = {in,10'd0}; 
tmp = $signed(tmp) >> 10; 

nicht zu viel Sinn machen Sie die LSBs mit 0 Gefütterte haben dann heraus die Nullen verschieben.

Zeichen (entspricht >>>), die sich dieses MSB 10 Mal wiederholt werden:

tmp = { {10{in[32-1]}}, in}; 

ich vermeiden würde Variablen wie tmp und Verwendung benannt und Größe Variablen für jeden Abschnitt die Wiederverwendung, das wird nicht die synthetisierte Größe bewirken .

+0

Das Problem war woanders. Aber danke, ich denke, dein Code ist eine bessere Praxis – user2224350