Liebe Kollegen!
Ich würde gerne Daten in den Intel Flash (siehe Anhang) von der RS232
schreiben und auf Knopfdruck wieder ausgeben. Leider scheitere ich immer
wieder am schreiben. Das Lesen funktioniert.
Egal was ich eingebe, es kommt nicht an.
Für den Code schäme ich mich etwas, er ist nicht (mehr) sehr schön. Ich
bastel schon länger dran rum und er wird immer fürchterlicher.
Herrichten uns auskommentieren wollte ich ihn erst wenn das Ding läuft.
Hier der nicht funktionierende Teil.
Ich habe eine Einheit davorgehängt, die mit 1/8 des Takts (50MHz) ein
Enable Signal gibt (nur eine Taktlänge lang). Das Timins sollte also
passen.
1 | entity mem_ctrl is
|
2 | port( clk : in std_logic;
|
3 | rst : in std_logic;
|
4 | led : out std_logic;
|
5 | EN : in std_logic; --Enable (from Flash_slow.vhd)
|
6 | -- ***RS232***
|
7 | RDA : in std_logic; --Read Data Available
|
8 | RST232 : out std_logic; --Master Reset
|
9 | RD : out std_logic; --Read RS232
|
10 | WR : out std_logic; --Write RS232
|
11 | DBIN : in std_logic_vector (7 downto 0);
|
12 | -- ***I/O***
|
13 | DBOUT: out std_logic_vector (15 downto 0);
|
14 | -- ***Intel Flash***
|
15 | RP : out std_logic := '1'; -- Reset Flash
|
16 | DR : out std_logic; -- data redy
|
17 | addr : out std_logic_vector (23 downto 1);
|
18 | data : inout std_logic_vector (15 downto 0);
|
19 | OE : out std_logic; -- Output Enable active low
|
20 | WE : out std_logic; -- Write Enable active low
|
21 | --STS : out std_logic; -- Status
|
22 | CE : out std_logic -- Chip Enable active low
|
23 | );
|
24 | end mem_ctrl;
|
25 |
|
26 | type t_state is (IDLE, wri, wri2, red, red2);
|
27 | signal s_state : t_state;
|
28 | signal cnt : std_logic_vector (23 downto 1); -- connect to addr
|
29 | signal toggle : std_logic; -- switch between high an low word
|
30 | signal s_led : std_logic; -- to read the output
|
31 |
|
32 | ...
|
33 | ...
|
34 | ...
|
35 |
|
36 | --*************************************************************
|
37 | -- State: Reset RS232
|
38 | --*************************************************************
|
39 | when wri =>
|
40 | RD <= '1';
|
41 | s_state <= wri2;
|
42 | OE <= '1';
|
43 | WE <= '0';
|
44 | CE <= '0';
|
45 | --*************************************************************
|
46 | -- State: write to Flash
|
47 | --*************************************************************
|
48 | when wri2=>
|
49 | s_led <= '1';
|
50 | WE <= '1';
|
51 | CE <= '0';
|
52 | RD <= '0';
|
53 | if DBIN = "00110001" then --ASCII: 1
|
54 | cnt <= (others => '0');
|
55 | toggle<= '0';
|
56 | OE <= '1';
|
57 | s_state <= red2;
|
58 | --elsif (used later to control the FPGA via RS232
|
59 | elsif DBIN = "00110010" then --ASCII: 2
|
60 | s_state <= IDLE;
|
61 | cnt <= (others => '0');
|
62 | RD <= '0';
|
63 | WR <= '0';
|
64 | else
|
65 | if RDA = '1' then
|
66 | s_state <= wri;
|
67 | --RD <= '1';
|
68 | if toggle = '0' then
|
69 | data (7 downto 0) <= DBIN;
|
70 | OE <= '1';
|
71 | --WE <= '1';
|
72 | --CE <= '1';
|
73 | toggle <= not toggle;
|
74 | else
|
75 | data (15 downto 8) <= DBIN;
|
76 | OE <= '1';
|
77 | --WE <= '1';
|
78 | --CE <= '1';
|
79 | toggle <= not toggle;
|
80 | if cnt = "11111111111111111111111" then -- End of Memory
|
81 | cnt <= (others => '0');
|
82 | else
|
83 | cnt <= unsigned(cnt) + 1;
|
84 | end if;
|
85 | --RD <= '1';
|
86 | end if;
|
87 | else
|
88 | s_state <= wri2;
|
89 | end if;
|
90 | end if;
|
Vielleicht kann mir jemand einen Tip geben oder eine Idee was ich
probieren sollte.
Wenn ich nicht auf RDA von der RS232 warte kann ich reinschreiben.
DANKE
CYREX
P.S.: Nexys II mit Spartan 3E (1200K)