Error de controlador múltiple en VHDL

0

Hola, estoy escribiendo un código para el procesamiento de imágenes que incluye una memoria RAM a / desde la cual se escribirán y leerán los datos. Sin embargo, estoy recibiendo 15 errores como el que se muestra a continuación.

[DRC MDRV-1] Multiple Driver Nets: Net address_ram[10] has multiple drivers: 
address_ram_reg[10]/Q, and address_ram_reg[10]__0/Q.

Creé este ram utilizando el generador block ram en Vivado 2017.2. Es un ram de puerto único y se inicializa con algún archivo .coe. Mi conocimiento sobre los carneros es limitado. Lo que sé o lo que asumo firmemente que es verdad es que cuando write_enable es 1, los datos se escribirán en la ubicación descrita por address_ram. No importa si write_enable es 1, los datos se leerán desde la ubicación descrita por address_ram. Por cierto, el ram está siempre habilitado.

Aquí lo que tengo

Leo en el flanco ascendente del reloj y escribo en el flanco descendente del reloj para evitar algunos choques.

Reading_from_Ram: process(clk) is
begin
if rising_edge(clk) then
if (pos_x < PICTURE_WIDTH_HEIGHT) and (pos_y <PICTURE_WIDTH_HEIGHT) and 
(pos_x >= 0) and (pos_y >= 0) then
address_ram <= (conv_std_logic_vector((pos_x + 
pos_y*PICTURE_WIDTH_HEIGHT),16));
end if;
end if;
end process;

Writing_to_Ram: process(clk) is
begin
if falling_edge(clk) then
if (pos_x < PICTURE_WIDTH_HEIGHT) and (pos_y <PICTURE_WIDTH_HEIGHT) and 
(pos_x 
>= 0) and (pos_y >= 0) then
write_enable <= '1';
address_ram <= (conv_std_logic_vector((pos_x + 
pos_y*PICTURE_WIDTH_HEIGHT),16));
end if;
write_enable <= '0';
end if;
end process;

U4: Block_Ram port map(addra => address_ram,
                       clka => clk,
                       dina => data_in_ram,
                       douta => data_out_ram,
                       wea => write_enable);

data_out_ram y data_in_ram se utilizan para cambiar el brillo y el contraste.

U5: Brightness_Contrast port map(clk_in => clk,
                                 operation => operation,
                                 pos_x => pos_x,
                                 pos_y => pos_y,
                                 data_in => data_out_ram,
                                 cursor_pos_x => cursor_pos_x,
                                 cursor_pos_y => cursor_pos_y,
                                 length => length,
                                 output_of_operation => data_in_ram,
                                 mode => mode);

Esto es todo lo que puedo decir. ¿Cómo puedo deshacerme de estos errores?

editar:

Reading_Writing_Ram: process(clk) is
begin
if rising_edge(clk) then
if (pos_x < PICTURE_WIDTH_HEIGHT) and (pos_y <PICTURE_WIDTH_HEIGHT) and 
(pos_x >= 0) and (pos_y >= 0) then -- if within picture
address_ram <=(conv_std_logic_vector((pos_x + 
pos_y*PICTURE_WIDTH_HEIGHT),16));
if ( pos_x > cursor_pos_x - 1) and (pos_x < cursor_pos_x + length) and ( 
pos_y > cursor_pos_y - 1) and (pos_y < cursor_pos_y + length) then --if 
within cursor
write_enable <= '1';
else
write_enable <= '0';
end if;
end if;
end if;
end process;

Lo reescribí de nuevo (código anterior) y resolví el problema. Gracias a todos los que ayudaron

    
pregunta runo

1 respuesta

0

Estás escribiendo address_ram desde dos procesos separados. Simplemente colóquelos en el mismo proceso y debería funcionar bien.

Como nota general, cuando se asigna una señal en un proceso, la última asignación del proceso anula todas las asignaciones anteriores. En muchos casos, esto se usa para establecer un valor predeterminado para una señal que se cambia más adelante en el proceso.

    
respondido por el crj11

Lea otras preguntas en las etiquetas