FPGA, VHDL & Co.
›
Thread
Es wird nicht beim Sync_Ram auf "we<='0' geschaltet.
P
peter
Gast
30.09.2014 15:11
#3822994
Hallo, guten Tag.
Ich habe hier ein Sync_ram erstellt und möchte damit neue Daten
reinscheiben über RS232.
Es funktioniert soweit, das ich die Datenübertragung an der LED_G sehen
kann.
Ich fülle Daten von 1-255 rein. Die LED_G zählt hoch.
Hiermit werden die Daten geladen:
------------------------------
if RX_en = '1' then
we<='1';
address <= conv_std_logic_vector(conv_integer(addr),8);
addr <= addr+1;
datain <= RX_Data;
end if;
------------------------------
Wenn we<='1' ist gesetzt werden Daten übertragen.
Frage: Wie komme ich in den neuen we<='0' Status?
Wenn ich hiermit setze :
---------------------------
if sw(1)='1' then
addr<=0;
we<='0';
end if;
--------------------------
kommt keine Reaktion, auch kann ich weiterhin Daten laden von RS232, es
ist kein we<='0'.
Wo liegt der Fehler im VHDL ?
Danke.
Gruss
1 library ieee ;
2 use ieee . std_logic_1164 . all ;
3 use ieee . numeric_std . all ;
4 use ieee . std_logic_arith . all ;
5
6 entity c_sync_ram is
7 Generic ( Quarz_Taktfrequenz : integer : = 50000000 ;
8 Baudrate : integer : = 19200
9 );
10
11 port (
12 clock : in std_logic ;
13 led_g : out STD_LOGIC_VECTOR ( 7 downto 0 );
14 sw : in STD_LOGIC_VECTOR ( 2 downto 0 );
15 RXD : in STD_LOGIC
16 );
17 end c_sync_ram ;
18
19 architecture Behavioral of c_sync_ram is
20
21 type rx_state_t is ( IDLE , BUSY , READY );
22 signal rx_state : rx_state_t : = IDLE ;
23 signal rxd_sr : std_logic_vector ( 3 downto 0 ) : = "1111" ;
24 signal rxsr : std_logic_vector ( 7 downto 0 ) : = "00000000" ;
25 signal rxbitcnt : integer range 0 to 9 : = 9 ;
26 signal rxcnt : integer range 0 to ( Quarz_Taktfrequenz / Baudrate ) -1 ;
27 signal rx_en : STD_LOGIC : = '0' ;
28 signal RX_Data : STD_LOGIC_VECTOR ( 7 downto 0 );
29
30 signal we : STD_LOGIC ;
31 signal address : std_logic_vector ( 7 downto 0 );
32 signal datain : std_logic_vector ( 7 downto 0 );
33 signal dataout : std_logic_vector ( 7 downto 0 );
34
35 signal addr : integer range 0 to 255 : = 0 ;
36 signal data : integer range 0 to 255 : = 129 ;
37 signal cnt : integer range 0 to 50000000 : = 0 ;
38
39 component sync_ram port (
40 we : in STD_LOGIC ;
41 address : in std_logic_vector ( 7 downto 0 );
42 datain : in std_logic_vector ( 7 downto 0 );
43 dataout : inout std_logic_vector ( 7 downto 0 );
44 clock : in std_logic
45 );
46 end component ;
47
48 begin
49 io1 : sync_ram port map ( we , address , datain , dataout , clock );
50
51 process
52 begin
53 wait until rising_edge ( clock );
54 rxd_sr <= rxd_sr ( rxd_sr 'left -1 downto 0 ) & RXD ;
55 RX_en <= '0' ;
56
57 case rx_state is
58 when IDLE =>
59 if ( rxd_sr ( 3 downto 2 ) = "10" ) then
60 rxcnt <= (( Quarz_Taktfrequenz / Baudrate ) -1 ) / 2 ;
61 rxbitcnt <= 0 ;
62 rx_state <= BUSY ;
63 end if ;
64 when BUSY =>
65 if ( rxbitcnt < 9 ) then
66 if ( rxcnt < ( Quarz_Taktfrequenz / Baudrate ) -1 ) then
67 rxcnt <= rxcnt + 1 ;
68 else
69 rxcnt <= 0 ;
70 rxbitcnt <= rxbitcnt + 1 ;
71 rxsr <= rxd_sr ( rxd_sr 'left -1 ) & rxsr ( rxsr 'left downto 1 );
72 end if ;
73 else
74 rx_state <= READY ;
75 end if ;
76 when READY =>
77 RX_Data <= rxsr ;
78 rx_state <= IDLE ;
79 RX_en <= '1' ;
80 end case ;
81 end process ;
82
83 process ( clock )
84 begin
85 if rising_edge ( clock ) then
86 if RX_en = '1' then
87 we <= '1' ;
88 address <= conv_std_logic_vector ( conv_integer ( addr ), 8 );
89 addr <= addr + 1 ;
90 datain <= RX_Data ;
91 end if ;
92
93 if ( cnt < 20000000 ) and sw ( 0 ) = '1' then
94 cnt <= cnt + 1 ;
95 else
96 cnt <= 0 ;
97 if addr <= 255 then
98 addr <= addr + 1 ;
99 address <= conv_std_logic_vector ( conv_integer ( addr ), 8 );
100 end if ;
101 end if ;
102 end if ;
103
104 if sw ( 1 ) = '1' then
105 addr <= 0 ;
106 we <= '0' ;
107 end if ;
108
109 end process ;
110
111 led_g <= dataout ;
112 end Behavioral ;
113
114
115 --------------------------------------------------
116 library IEEE ;
117 use IEEE . STD_LOGIC_1164 . all ;
118 use IEEE . Numeric_Std . all ;
119
120 entity sync_ram is
121 port (
122 clock : in std_logic ;
123 we : in std_logic ;
124 address : in std_logic_vector ( 7 downto 0 );
125 datain : in std_logic_vector ( 7 downto 0 );
126 dataout : out std_logic_vector ( 7 downto 0 )
127 );
128 end entity sync_ram ;
129
130 architecture RTL of sync_ram is
131
132 type ram_type is array ( 0 to 255 ) of std_logic_vector ( 0 to 7 );
133 signal ram : ram_type : = (
134 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
135 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
136 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
137 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
138 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
139 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
140 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
141 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
142 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
143 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
144 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
145 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
146 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
147 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
148 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
149 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
150 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
151 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
152 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
153 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
154 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
155 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
156 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
157 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
158 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" , x"00" ,
159 x"00" , x"00" , x"00" , x"00" , x"00" , x"00" );
160
161 signal read_address : std_logic_vector ( 7 downto 0 );
162
163 begin
164
165 process ( clock ) is
166 begin
167 if rising_edge ( clock ) then
168 if we = '1' then
169 ram ( to_integer ( unsigned ( address ))) <= datain ;
170 end if ;
171 read_address <= address ;
172 end if ;
173 end process ;
174
175 dataout <= ram ( to_integer ( unsigned ( read_address )));
176 end architecture RTL ;
LM
Lothar M.
(lkmiller)
Moderator
(Firma: Titel)
Persönliche Seite
30.09.2014 15:31
#3823016
1 :
2 end if ;
3
4 if sw ( 1 ) = '1' then
5 addr <= 0 ;
6 we <= '0' ;
7 end if ;
8
9 end process ;
Huah!
Ein versteckter asynchroner Reset, das hat was. Machs doch wenigstens
so: 1 :
2 if sw ( 1 ) = '1' then
3 addr <= 0 ;
4 we <= '0' ;
5 end if ;
6 end if ;
7
8 end process ;
Das wird den Fehler nicht beheben, ergibt aber (abgesehen vom nicht
einsynchronisierten sw) ein synchrones Design.
zum eigentlichen "Problem":
Hast du dir mal dein we-Signal auf einer LED angezeigt? Wird das
tatsächlich nicht 0?
U
uwe
Gast
30.09.2014 15:36
#3823020
Probiers mal mit gemüt.. ner Statemachine.
peter schrieb:
> kommt keine Reaktion
Hast sw(1) denn im ucf-File überhaupt mit einem Schalter oder Button
verbunden? Das vergisst man schnell mal...
P
peter
Gast
30.09.2014 16:32
#3823089
-----------------------
Ein versteckter asynchroner Reset, das hat was. Machs doch wenigstens
----------------------
Danke. Das wars zum Teil. Hatte ich gar nicht gesehen das er ausserhalb
lag. Jetzt funktioniert es mit dem Schalten auf die 0-Adresse.
Habe jetzt die Abfrage :
"if addr <= 255 then" entfernt und da die "we<='0'" reingesetzt. Jetzt
funktioniert es das w<='0' angenommen wird.
Danke.
Gruss
P
peter
Gast
30.09.2014 16:36
#3823095
---------------------------
Jetzt funktioniert es das w<='0' angenommen wird.
--------------------------
Es werden jetzt die Daten gelesen und an der Led_G angezeigt.
Vorher war bei Zählen stillstand.
Gruss
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren