2012-11-03 5 views
6

मैं 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) की क्या उपयोग करता है।

उत्तर

1

मैं पूरी बस बहुसंकेतन प्रति-तार बहुसंकेतन के बजाय द्वारा इस के आसपास काम कर समाप्त हो गया:

segss' :: Matrix X7 (Matrix n (sig Bool)) 
segss' = columns . joinRows $ segss 

segs :: Matrix X7 (sig Bool) 
segs = fmap (nary selector) segss' 

सहायक समारोह

nary :: forall a clk sig n. (Clock clk, sig ~ Signal clk, Rep a, Size n, Rep n) => sig n -> Matrix n (sig a) -> sig a 
nary sel inps = pack inps .!. sel 

इस द्वारा उत्पन्न VHDL ठीक संकलित उपयोग करते हुए; हालांकि मुझे कोई जानकारी नहीं है कि क्या यह परिणामी सर्किट को और अधिक जटिल (या शायद सरल भी) बनाता है।

+0

एंडी गिल, कान्सास लावा की देखभाल करने, मुझे निजी मेल में कहा है कि यह वास्तव में लावा अपने आप में एक बग की तरह प्रतीत होता है। मैं अपने जवाब को एक प्रभावी कामकाज के रूप में स्वीकार कर रहा हूं। – Cactus

संबंधित मुद्दे