РОН: переключение контекста VHDL (Quartus)

Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить
Аватара пользователя
serg130191
Родился
Сообщения: 7
Зарегистрирован: Вт мар 27, 2012 21:13:19

РОН: переключение контекста VHDL (Quartus)

Сообщение serg130191 »

Написал, регистр общего назначения для АЛУ, потом дописал переключение контекста при прерывании: при переходе входного сигнала INTA в высокое состояние - значение регистров сохраняется в дополнительном регистре (reg_buff), при спаде сигнала - наоборот, данные из буферного регистра записываются в РОНы.
Код РОН:

Код: Выделить всё

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.all;

ENTITY ron IS
	PORT
  (
		clk     	: IN	std_logic;
		INTA		: IN	std_logic;
		DATA_IN		: IN	std_logic_vector (11 DOWNTO 0);
		ADR_REG1	: IN	std_logic_vector (3 DOWNTO 0);
		ADR_REG2	: IN	std_logic_vector (3 DOWNTO 0);
		WE			: IN	std_logic;
		DATA_OUT1	: OUT	std_logic_vector (11 DOWNTO 0);
		DATA_OUT2	: OUT	std_logic_vector (11 DOWNTO 0)
  );
END ron;
ARCHITECTURE arh OF ron IS
	type registr is array (0 to 15) of std_logic_vector(11 downto 0);
	signal reg : registr;
	signal reg_buff : registr;
BEGIN
PROCESS(clk)
BEGIN		
IF (clk'event AND clk = '1') THEN
	IF (WE = '1') THEN
		reg(to_integer(unsigned(ADR_REG2)))<=DATA_IN;
	ELSE
		DATA_OUT1<=reg(to_integer(unsigned(ADR_REG1)));
		DATA_OUT2<=reg(to_integer(unsigned(ADR_REG2)));		
	END IF;		
END IF;	
		if(rising_edge(INTA)) then
			reg_buff<=reg;
		end if; 
		if(FALLING_EDGE(INTA)) then
			reg<=reg_buff;
		end if;
END PROCESS;

END arh;
Но к моему сожалению переключение не работает, Quartus выдаёт след. ошибки:
Что можно с этим сделать?
  • Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][0] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][1] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][2] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][3] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][4] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][5] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][6] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][7] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][8] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][9] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][10] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[15][11] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[14][0] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[14][1] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[14][2] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[14][3] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[14][4] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[14][5] because its behavior depends on the edges of multiple distinct clocks
    Error (10820): Netlist error at ron.vhd(36): can't infer register for reg[14][6] because its behavior depends on the edges of multiple distinct clocks
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: РОН: переключение контекста VHDL (Quartus)

Сообщение Meteor »

Первое, что бросилось - два разных фронта
PROCESS(clk)
BEGIN
IF (clk'event AND clk = '1') THEN
Тут реакция на тактовый сигнал.
if(rising_edge(INTA)) then
А тут на фронт. В процессе Вы не указали что INTA является "отслеживаемым", только CLK.
На вашем бы месте я сделал так. Назначил буфер variable inta_v:std_logic_vector(1 downto 0);
Далее описал реакцию.
inta_v(1):=inta_v(0);
inta_v(0):=INTA;
if(inta_v="01")then
Вот тут реакция на событие.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
Аватара пользователя
serg130191
Родился
Сообщения: 7
Зарегистрирован: Вт мар 27, 2012 21:13:19

Re: РОН: переключение контекста VHDL (Quartus)

Сообщение serg130191 »

Meteor, да полностью с вами согласен, но приведённая вами реакция на событие не подойдёт для моего случая, т.к. я забыл упомянуть, что сигнал INTA "висит" на протяжении всего прерывания.
Попробую задать переменную которая будет хранить предыдущее значение сигнала INTA, а затем сравнивать его с текущим.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: РОН: переключение контекста VHDL (Quartus)

Сообщение uldemir »

А кто мешает ввести еще один сигнал, с помощью которого контролировать перепады INTA?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «ПЛИС»