hm, passt doch nicht so 100% :/
Die Sache ist jetzt folgende:
Ich möchte die lowtime nur in 100µs-Steps einstellen.
Der Bereich in der sich die lowtime befindet, soll zwischen 100µs bis
10ms einstellbar sein.
Das würde aber bei CLK=40MHz->10ms/25ns=400.000 clockcycles entsprechen,
wofür ich ein 19bit-Register benötigen würde, was ich aber definitiv
nicht möchte (16bit Registertiefe is absolutes max.) und ich benötige so
eine große Auflösung auch garnicht.
Mein Ziel ist es also, über das low-Register die lowtime in 100µs-Steps
einstellen zu können.
Meine Idee war jetzt, ich multipliziere einfach den Registerwert mit
4.000.
Steht also im Register eine "1"=0001, würde diese mit 4000 multipliziert
werden, was wiederum eine lowtime von 100µs bedeuten würde
(4000x25ns=100µs), bei einer "2"=0010 wären es 200µs,... bei
"100"=1100100 wäre das maximum=10ms erreicht. Das Register müsste also
max. 7bit tief sein.
Allerdings scheint mich diese Multiplikation NULL weiterzubringen, sie
funktioniert zwar in der Theorie (Modelsim), auf meinem CPLD ist aber
nicht genügend Platz für diese Berechnung...verbraucht extrem viele
Marcozellen, ich habe nur 144 :)
Hier mein Code:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.NUMERIC_STD.ALL;
|
4 |
|
5 | entity topModule_19 is
|
6 | Port ( CLK : in STD_LOGIC;
|
7 | MSP : out STD_LOGIC;
|
8 | DATA7 : in std_logic;
|
9 | DATA6 : in std_logic;
|
10 | DATA5 : in std_logic;
|
11 | DATA4 : in std_logic;
|
12 | DATA3 : in std_logic;
|
13 | DATA2 : in std_logic;
|
14 | DATA1 : in std_logic;
|
15 | DATA0 : in std_logic;
|
16 | --hightime=41580MCLK
|
17 | hi : in STD_LOGIC_VECTOR (15 downto 0):="1010001001101100";
|
18 | --lowtime=100µs=4000x1x25ns
|
19 | lo : in STD_LOGIC_VECTOR (6 downto 0):="0000001");
|
20 | end topModule_19;
|
21 |
|
22 | architecture Behavioral of topModule_19 is
|
23 | signal cnt : integer range 0 to 65535 := 1;
|
24 | signal o : std_logic := '0';
|
25 | begin
|
26 | process begin
|
27 | wait until rising_edge(clk);
|
28 | cnt <= cnt+1;
|
29 | --Auflösung high=itime=100µs (25ns*4000=100µs)
|
30 | if (o='0' and cnt=4000 * to_integer(unsigned(lo))) then
|
31 | cnt <= 1; -- bei 1 beginnen wegen Latency
|
32 | o <= '1';
|
33 | end if;
|
34 | if (o='1' and cnt=to_integer(unsigned(hi))) then
|
35 | cnt <= 1; -- bei 1 beginnen wegen Latency
|
36 | o <= '0';
|
37 | end if;
|
38 | end process;
|
39 | MSP <= o;
|
40 | end Behavioral;
|
Wie bekomme ich eine Auflösung von 100µs für die lowtime ohne das das
meinen CPLD sprengt?