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?
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
[Verilog: Festpunkt] (http://Stackoverflow.com/a/28383767/97073) – Morgan
Ich habe meinen Code geändert. Könntest du bitte einen Blick darauf werfen? – user2224350