Take it in steps. First the xo assignment is the same every time through the loop, so let's hoist that up:
xo <= s0o & s1o & s2o & s3o; for i in 0 to 3 generate beginmixOut(32*(i+1)-1 downto 32*i) <= xo; end generate
Now we can unroll the loop in our mind:
xo <= s0o & s1o & s2o & s3o; -- i = 0: beginmixOut(32*(0+1)-1 downto 32*0) <= xo; beginmixOut(31 downto 0) <= xo; -- i = 1: beginmixOut(32*(1+1)-1 downto 32*1) <= xo; beginmixOut(63 downto 32) <= xo; -- i = 2: beginmixOut(32*(2+1)-1 downto 32*2) <= xo; beginmixOut(95 downto 64) <= xo; -- i = 3: beginmixOut(32*(3+1)-1 downto 32*3) <= xo; beginmixOut(127 downto 96) <= xo;
As someone else pointed out, it's the same effect as concatenating xo 4 times into the destination vector:
beginmixOut <= x0 & xo & xo & xo;
which would be my preferred syntax!
Just plain old multiplication, like in other contexts (and most other languages I can think of :)
Thanks so much man. Alot clearer now
Is this the same? where mixOut is 127 down to 0 and sXo 7 down to 0
mixOut <= s0o & s1o & s2o & s3o
& s0o & s1o & s2o & s3o
& s0o & s1o & s2o & s3o
& s0o & s1o & s2o & s3o;
it is the same but i am just unsure of the line
mixOut(32*(i+1)-1 downto 32*i) <= xo;
I am just looking for it to be explained, as i am unsure what it means. Thanks for the quick reply also!
The loop is rolled out 4 times to generate a concatenated vector. I assume s0o.. are all 8 bit wide.