Active Low LED and Active Low Switch behavior on FPGA counter-intuitive
(note: I am using the verilog operators in this post, but most reference materials you find will probably use other notation)

So what am I missing here ?

For AND and OR we have De-morgans theorem
A | B === ~((~A)&amp;(~B))
A &amp; B === ~((~A)|(~B))

For XOR the following is true (not sure if this identity has a name)
A ^ B === (~A)^(~B)


Your buttons and LEDs are active low. In other words their behaviour is inverted from what one might naively expect. The button produces a 1 when not pressed and a 0 when pressed. Similarly the LED lights up when given a 0 and does not light when given a 1.
  SW0      SW1    i_sw[0] i_sw[1] o_led[2] o_led[3] o_led[4] D2  D3  D4
release  release    1       1        1        1        0     Off Off On 
release   press     1       0        0        1        1     On  Off Off
 press   release    0       1        0        1        1     On  Off Off
 press    press     0       0        0        0        0     On  On  On