मैं 4 अंक के साथ एक 7 खंड प्रदर्शन ड्राइव करने के लिए अस्थायी बहुसंकेतन लागू करने के लिए कोशिश कर रहा हूँ: इसलिए यदि आप चार प्रदर्शित करना चाहते हैं, इस उपकरण 7 डेटा पैर और 4 एनोड है अलग-अलग अंक, आपको पहले से 0001
पर एन्ड्स सेट करना होगा और डेटा सेगमेंट को अपने सेगमेंट में सेट करना होगा; फिर थोड़ी देर के बाद, 0010
पर एन्ड्स सेट करें और डेटा पैरों को अपडेट करें; और इसी तरह।केन्सास में एक संकेत के साथ मैट्रिक्स के एक मैट्रिक्स अनुक्रमण लावा
मैं कान्सास लावा में इस लागू करने के लिए कोशिश कर रहा हूँ। हालांकि, Xilinx कंपाइलर उत्पन्न प्रकार के वीएचडीएल को एक प्रकार की त्रुटि के साथ अस्वीकार करता है (और जेनरेट कोड को देखकर, मुझे लगता है कि यह सही है)।
सबसे पहले, मेरी लावा कोड: यह मूल रूप से लागू करता है अनुक्रम [0, 1, 2, 3, 0, ...]
का एक संकेत है, तो .!.
ऑपरेटर Language.KansasLava.Signal
से सूचकांक करने के लिए मैट्रिक्स के- मैट्रिक्स पैरामीटर में उपयोग करता है। एनोड मान बाईं ओर प्रत्येक टाइमस्टेप पर 0001
घुमाकर उत्पन्न होता है।
ERROR:HDLParsers:800 - "/home/cactus/prog/lava/hello/src/hello.vhdl" Line 85. Type of sig_24_o0 is incompatible with type of sig_28_o0.
hello.vhdl
से प्रासंगिक लाइनें हैं:
type sig_24_o0_type is array (7 downto 0) of std_logic_vector(0 downto 0);
signal sig_24_o0 : sig_24_o0_type;
signal sig_25_o0 : std_logic_vector(1 downto 0);
type sig_28_o0_type is array (3 downto 0) of std_logic_vector(6 downto 0);
signal sig_28_o0 : sig_28_o0_type;
sig_24_o0 <= sig_28_o0(to_integer(unsigned(sig_25_o0)));
sig_24_o0
के प्रकार के गलत लगता है
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
import Language.KansasLava
import Hardware.KansasLava.Boards.Papilio.LogicStart -- from http://github.com/gergoerdi/kansas-lava-papilio
import Data.Sized.Matrix
import Data.Sized.Unsigned as Unsigned
import Data.Bits
driveSS :: forall clk sig n. (Clock clk, sig ~ Signal clk, Size n, Rep n, Num n, Integral n) => Matrix n (Matrix X7 (sig Bool)) -> SevenSeg clk ActiveLow n
driveSS segss = SevenSeg (fmap bitNot anodes) segs high
where
clkAnode :: sig Bool
clkAnode = divideClk (Witness :: Witness X8)
selector :: sig n
selector = counter clkAnode
segss' :: sig (Matrix n (Matrix X7 Bool))
segss' = pack . fmap pack $ segss
segs :: Matrix X7 (sig Bool)
segs = unpack $ segss' .!. selector
anodes :: Matrix n (sig Bool)
anodes = rotatorL clkAnode
test_sseg :: Fabric()
test_sseg = do
sw <- switches
let sw' = cropAt sw 1
sseg $ driveSS $ matrix [sw', zero, zero, zero]
where
zero = matrix $ replicate 7 low
divideClk :: forall c sig ix. (Clock c, sig ~ Signal c, Size ix) => Witness ix -> sig Bool
divideClk _ = counter high .==. (0 :: sig (Unsigned ix))
counter :: (Rep a, Num a, Clock c, sig ~ Signal c) => sig Bool -> sig a
counter inc = loop
where
reg = register 0 loop
loop = mux inc (reg, reg + 1)
rotatorL :: (Clock c, sig ~ Signal c, Size ix, Integral ix) => sig Bool -> Matrix ix (sig Bool)
rotatorL step = fromUnsigned loop
where
reg = register 1 loop
loop = mux step (reg, rotateL reg 1)
fromUnsigned :: (sig ~ Signal c, Size ix) => sig (Unsigned ix) -> Matrix ix (sig Bool)
fromUnsigned = unpack . coerce Unsigned.toMatrix
main :: IO()
main = do
writeVhdlPrelude "lava-prelude.vhdl"
kleg <- reifyFabric $ do
board_init
test_sseg
writeVhdlCircuit "hello" "hello.vhdl" kleg
writeUCF "hello.ucf" kleg
तो जब मैं उत्पन्न VHDL संकलित करने के लिए प्रयास करते हैं, मैं इस त्रुटि संदेश मिलता है ; मुझे लगता है कि यह या तो array (6 downto 0) of std_logic_vector(0 downto 0)
या std_logic_vector(6 downto 0)
होना चाहिए, लेकिन मैं नहीं जानता कि लावा उन std_logic_vector(0 downto 0)
की क्या उपयोग करता है।
एंडी गिल, कान्सास लावा की देखभाल करने, मुझे निजी मेल में कहा है कि यह वास्तव में लावा अपने आप में एक बग की तरह प्रतीत होता है। मैं अपने जवाब को एक प्रभावी कामकाज के रूप में स्वीकार कर रहा हूं। – Cactus