Не могу выразить словами на VHDL

Программируемая логика - это не так уж и сложно. Разберемся вместе.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Не могу выразить словами на VHDL

Сообщение uldemir »

А может кто поможет с такой проблемой: описываю константу, но хочу, чтобы эта константа имела другое значение, если переменная объявленная через generic имеет значение отличное от 0.

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

entity device is
	 generic (tailless : integer := 0);
    Port ( clk : in  STD_LOGIC;
           anode : out  STD_LOGIC_VECTOR (3 downto 0);
           cathode : out  STD_LOGIC_VECTOR (7 downto 0));
end device;

architecture Behavioral of device is

signal clk_div : std_logic_vector (9 downto 0) := (others => '0');
signal data    : std_logic_vector (3 downto 0) := (others => '0');

constant digit_0:std_logic_vector := "0111111";
constant digit_1:std_logic_vector := "0000110";
constant digit_2:std_logic_vector := "1011011";
constant digit_3:std_logic_vector := "1001111";
constant digit_4:std_logic_vector := "1100110";
constant digit_5:std_logic_vector := "1101101";
constant digit_6:std_logic_vector := "1111101";
constant digit_7:std_logic_vector := "0000111";
Так вот хочется, чтобы константа digit_7 имела другое значение, если tailless равно, скажем, 1.

объявить еще одну константу и дальше делать подмену, тоже как-то некузяво. Как тут вставить?

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

	with data select
	cathode(6 downto 0) <= digit_0 when "0000",
								  digit_1 when "0001",
								  digit_2 when "0010",
								  digit_3 when "0011",
								  digit_4 when "0100",
								  digit_5 when "0101",
								  digit_6 when "0110",
								  digit_7 when "0111",
								  digit_8 when "1000",
								  digit_9 when "1001",
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Не могу выразить словами на VHDL

Сообщение uldemir »

uldemir писал(а):У меня есть еще вопрос. Сделал пол-года назад проект - всё работает. Одно но - исходник содержит полторы тысячи строк. Нельзя ли как "уплотнить"? Дело в том, что куски однообразные. Здесь написана работа с устройством 1-wire. Модулю посылаются сигналы что передавать сброс, "1" или "0", а затем ожидается пока слот отработает, потом следующий бит. Беда в том, что сигнал state проходит почти все 256 состояний и в этом case каждое состояние расписать муторно. А еще муторнее это читать. Можно ли как-то объединить их циклом, что-ли?
Частичное решение нашел. Для совершенно одинаковых ветвей можно объединить одной строчкой:
Спойлер

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

-- Send 0xCC - Skip ROM		
		when X"22" =>
			dataout <= Skip_ROM(0);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"24" =>
			dataout <= Skip_ROM(1);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"26" =>
			dataout <= Skip_ROM(2);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"28" =>
			dataout <= Skip_ROM(3);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"2A" =>
			dataout <= Skip_ROM(4);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"2C" =>
			dataout <= Skip_ROM(5);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"2E" =>
			dataout <= Skip_ROM(6);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"30" =>
			dataout <= Skip_ROM(7);
			wr_res <= '1';
			ow_run <= '1';
			state <= state+1;

		when X"23" | X"25" | X"27" | X"29" | X"2B" | X"2D" | X"2F" | X"31" =>
			if ow_run = '0' then
				state <= state+1;
			end if;

В результате исходник усох до 8-ми сотен строк.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Ответить

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