FPGA最終回

なんかLavaに2種類あるとか書いてある。Xilinx-Lavaってのは、そもそもどこかで入手可能なのかもよく分からんのだけど。まぁいいか
http://www.cs.chalmers.se/~koen/Lava/
それはいいんだけど、とりあえず分かったことは、今のLavaは全然未完成。Lavaのサイトに、思い切り
An implementation of Lava for Xilinx's FPGAs will be made available at the Lava download page shortly. Until there here is a snapshot: lava-0.1b.tar.gz
とか書いてあった

気付くのおせえよ。まあ、現時点でも組合せ回路はがんばれば書けると思うけど,順序回路は今のLavaでは多分書けない気がする。というわけで、Lavaが完成するまで待とう。いつ完成するのか知らないけど。VHDL覚えるとか、自分でLava補完するとかいう選択肢もあるけど、まあめんどくさいな


・variable-freeな全加算器
ふるあだー程度でも、基本関数とコンビネータの組合せで書くのは難しいかもしれないと書いたけど,そんなこともなかった。まぁ、なにを基本関数とするのか、決めてないんでアレだけども

halfAdder = fork2 >-> (and2 <|> xor2)
fullAdder = (halfAdder <|> return) >-> flip' >-> (return <|> halfAdder) >-> flip' >-> (return <|> or2)
 where
  flip' = (flip2 <|> return) >-> switch

flip2 :: (Combinational m bit) => (bit,bit) -> m (bit,bit)
flip2(x,y) = return (y,x)

switch :: (Combinational m bit) => ((bit,bit),bit) -> m (bit , (bit,bit))
switch((x,y),z)=(x,(y,z))

とかで。fork2はLavaに含まれてる関数で、
fork2 a = return (a,a)
という定義。

まあ、flip'が、なんとなくエレガントにいかないというか、こういうのを差し込んでいくと無駄に記述が長くなる。それに

fullAdder ((x,y),z) 
 = do (s1,c1) <- halfAdder (x,y)
      (s2,c2) <- halfAdder (s1,z)
      c3 <- or2(c1,c2)
      return (s2,c3)

の方が分かり易いことは否めない