Hej
Håller på med lite digitalteknik, närmare bestämmt försöker jag programmera en PALCE16V8 i VHDL. Med betoning på *försöker*, eftersom jag inte lyckas så bra. Jag har skrivit VHDL-kod för en sekvenskrets (tillståndsmaskin), och allt (syntes och optimering m.m) fungerar bra förutom när programmet (Cypress Warp/Galaxy) slutligen försöker sig på "device fitting" för PALCE16V8. Den säger "Logic equation has too many product terms" för fyra signaler (de som bygger upp next_state-tillståndet).
Rapportfilen visar följande om felen: Error: Logic equation has too many product terms on signal next_state_IBV_3. Found = 17 , Maximum = 7 Error: Logic equation has too many product terms on signal next_state_IBV_2. Found = 17 , Maximum = 7 Error: Logic equation has too many product terms on signal next_state_IBV_1. Found = 12 , Maximum = 7 Error: Logic equation has too many product terms on signal next_state_IBV_0. Found = 8 , Maximum = 7
Vad kan man göra för att få plats med koden i PALCE16V8? Jag har provat med att kompilera till en annan, större krets, och då gick det utmärkt och simulering visade sen att koden är korrekt. Kan det vara så att koden är ooptimalt skriven så att uttrycken blir onödigt stora? Man tycker ju att Warp ska klara av sånt vid optimeringen.
Nedan finns hela VHDL-koden. "Programmet" i fråga är en "fäktautomat", dvs en maskin som registrerar träffar under en fäktning, och ger utsignalen RED=1 om röd fick en träff och GREEN=1 om grön fick en träff. Och om båda får in träff (inom 40ms) blir både RED och GREEN 1.
Tacksam för alla synpunkter/åsikter!
Hälsningar /Jimi
--
--Jimi Hullegård 2003
--
--GF2
--VHDL-kod för fäktautomaten.
--
--Målkrets: PALCE16V8
--Pinnar:
--CLK=1,RHIT=4,GHIT=5,RESET=6,GREEN=18,RED=17
library IEEE; use IEEE.std_logic_1164.all;
entity fencingmachine is port(CLK,RHIT,GHIT,RESET: in std_logic; RED,GREEN: out std_logic); end entity;
architecture beteende of fencingmachine is subtype state_type is integer range 0 to 11; signal present_state, next_state: state_type; begin state_diagram: process(present_state, RHIT, GHIT) begin case present_state is when 0 => if RHIT='1' and GHIT='1' then next_state