I'm new to Verilog and I need a little help here.
I have a register array reg [32-1:0] out
which represents a signed integer.
A smaller array holds a number between 0 and 1000 reg [14-1:0] d
. I would like to do something like this (damping out on every clock cycle):
always @(posedge clk_i) begin
out <= $signed(out) * $unsigned(d)/1000;
end
I heared that using / is bad practice for synthesizable code. Can anyone show me how to implement such an exponential decay?
EDIT: I changed dividing by 1000 to dividing by 1024, because it's much easier to handle. My code looks now like this:
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
The code works well in simulation but on the fpga it seems like in is multiplied by zero (out is zero)? Does anyone know what is going wrong here?