- 3 вопроса по VHDLу
-
? Kisser - 13.09.2009 22:13
По настоянию anonymousa принялся за сабж, даже есть успехи некоторые - почти сделал контроллер видеоОЗУ и просто памяти на ПЛИС (использую кварутс от альтеры). Сразу предупреждаю, что в VHDLе полный чайник. Хотя некоторые узлы удалось описать .Но одна вещь не дает покоя. Это Х-состояние сигнала.
Началось с того, что захотел сделать регистр.
Вот текст для регистра 662:
¤
entity reg662_1 is
port (
AD: inout Std_logic_vector (15 downto 0):="ZZZZZZZZZZZZZZZZ";
DIN: in bit;
DOUT: in bit;
CE: in bit;
VRAMPAGE: inout bit:='1';
Palette: inout bit_vector (3 downto 0):="1111";
TimerENB: inout bit:='0'
);
end reg662_1;
¤
architecture reg662beh of reg662_1 is
begin
¤
process (DIN,DOUT,CE)
begin
AD<="ZZZZZZZZZZZZZZZZ";
IF (DOUT'event) and (DOUT='1') and (CE='0') then VRAMPAGE<=to_bit(AD(15));
Palette(0)<=to_bit(AD(8));
Palette(1)<=to_bit(AD(9));
Palette(2)<=to_bit(AD(10));
Palette(3)<=to_bit(AD(11));
TimerENB<=to_bit(AD(14));
elsif (CE='0') and (DIN='0') then AD(15)<=to_stdulogic(VRAMPAGE);
AD(8)<=to_stdulogic(Palette(0));
AD(9)<=to_stdulogic(Palette(1));
AD(10)<=to_stdulogic(Palette(2));
AD(11)<=to_stdulogic(Palette(3));
AD(14)<=to_stdulogic(TimerENB);
end if;
¤
end process;
end;
¤
Так вот, при компиляции выдается ошибка:
Error (10818): Can't infer register for "AD[8]" at 662reg-1.vhd(22) because it does not hold its value outside the clock edge
Многое перепробывал, делал сторонние переменные, задавал значения сигналам в разных местах. Ну никак. Посему вопрос 1 - каков должен быть листинг, чтобы работало?
¤
Далее, учитывая безысходность, сделал в виде схемы на стандартной логике с использованием 74373. При моделировании выползает следующая штука:
http://s58.radikal.ru/i159/0909/bd/739ada16196b.gif
Т.е. пока в него не запишут что-нибудь, на выходе будет "Х". Этот "Х" и смущает. В реальной схеме если есть неопределенность можно подтянуть резисторами к питанию, что же будет здесь? Вопрос №2 - чем грозит и как отразится на реальной работе устройства, например если в качестве текущей видеостраницы вместо бита поползет "Х"? как в реальности его расценят вышестоящие устройства, и, в конце концов, на ножке микросхемы что будет?
И вопрос №3 - можно ли убрать эту необределенность руками, т.е. какая функция преобразует "Х" в "1"? Попробывал в VHDLе, например:
¤
entity Func0 is
port (
A: in std_ulogic;
B: out bit:='1');
end FUNC0;
¤
architecture func0beh of Func0 is
shared variable S: bit:='1';
begin
B<=S;
process (A)
begin
S:='1';
IF (A='0') or (A='L') then S:='0';
else S:='1';
end if;
end process;
end;
А также схемными методами, перепробывав разные встроенные функции, в т.ч. и триггеры, при "Х" на входе и на выходе "Х".
-
? anonymous - 15.09.2009 15:19
Пойдем по порядку.
1. Если некто хочет сделать регистр, то у него должен быть тактовый сигнал для синхронного изменения состояния схемы,
иначе какой это тогда регистр, асинхронная защелка - это латч. Строка PROCESS(DIN,DOUT,CE) означает буквально, что
процесс, описанный ниже, выполняется по любому изменению любого из трех перечисленных сигналов. Где клок-то?
2. Лучше использовать для всех сигналов тип std_logic и std_logic_vector, тогда не нужны всякие преобразования.
3. Если порт inout, то по умолчанию лучше указывать 'H' или 'Z', а не '1'. Хотя при синтезе все эти значения по умолчанию все равно
проигнорируются.
4. 'X' в '1' преобразовать невозможно. Надо искать, почему получилось 'X'. Как отразится на реальной работе неизвестно, опять же,
потому, что неизвестна причина.
5. Например: два входа DIN0 и DIN1 мультиплексируются сигналом SEL, выход мультиплексора защелкивается в триггере по фронту
0→1 клока CLK при единичном значении разрешающего сигнала CE, выход триггера выводится на порт DOUT через тристейт буфер,
управляемый сигналом OEn.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY PRIMER IS
PORT (
RST : IN STD_LOGIC;
CLK : IN STD_LOGIC;
DIN0 : IN STD_LOGIC;
DIN1 : IN STD_LOGIC;
SEL : IN STD_LOGIC;
CE : IN STD_LOGIC;
OEn : IN STD_LOGIC;
DOUT : OUT STD_LOGIC
);
END PRIMER;
¤
ARCHITECTURE ARCH OF PRIMER IS
SIGNAL Q: STD_LOGIC;
BEGIN
P: PROCESS(RST,CLK)
BEGIN
IF (RST = '1') THEN
Q <= '0';
ELSIF (CLK = '1') AND (CLK'EVENT) THEN
IF (CE = '1') THEN
IF (SEL = '0') THEN
Q <= DIN0;
ELSE
Q <= DIN1;
END IF;
END IF;
END IF;
END PROCESS;
DOUT <= Q WHEN (OEn = '0') ELSE 'Z';
END ARCH;
¤
Что касается предуснановки, RST. Это асинхронный сброс всей схемы. Или, если угодно, включение питания. В xilinx'е есть
такой сигнал GSR (global set reset), не знаю, как с этим в alter'е. Так вот наш RST это и есть тот самый GSR.
-
? kisser - 15.09.2009 21:36
Спасибо! Я кажется допер. Нужно евент и уровень загнать в одно условие, а затем сделать несколько условий, столько, сколько нужно. Попробывал, работает, и неопределенности нет, и по умолчанию сигналы присваиваются. Тогда перепишу регистр 664 и 716 на vhdle. До этого выход нашел в применении 174го триггера вместо 373го лэтча. Осталась только схема управления видео озу...
-
? Kisser - 18.09.2009 21:25
при использовании на входе-выходе Std_logic возникла проблема перевода в integer и обратно. to_bitvector нашел, а как теперь integer сделать? Собственно требуется конструкция типа if D>8#300# then D:=D-8#22#... где D-std_logic, которая c std_logic не работает (((
-
? kisser - 18.09.2009 21:37
имелось ввиду std_logic_vector конечно...
-
? anonymous - 22.09.2009 13:28
IF (D > "011000000") THEN D <= D - "000010010"; END IF;
Или так: IF (D > O"300") THEN D <= D - 8#22#; END IF;
-
? kisser - 24.09.2009 14:39
Спасибо! Еще есть проблема. Собрал все в кучу, и все бы ничего, но не хватило места в EPM7160, и, ради интреса перешел на EP10k10. Сразу оговорюсь, что м/с в корпусах не PLCC не рассматривал, потому как не вижу простого способа пайки в домашних условиях. Но не в этом дело. По-отдельности все работало нормально, а в сборе - с глюками. Начал разбираться, и вот что получается - ВГА-счетчик в EPM7160 c таймингом 15 выдает нормальную картину:
http://s59.radikal.ru/i166/0909/f6/89917b06ef97.gif
А ЕРА10K10 с таймингом 4 -
http://s40.radikal.ru/i087/0909/07/b7903a3917e9.gif
Откуда берутся эти выпады, и как с ними бороться? Причем при уменьшении тайминга у EPM7160 до 6, такие заскоки также проявляются, но в меньших количествах.
Текст горизонтального счетчика вот такой (не все сигналы идут напрямую, но структура вертикального счетчика такаяже, + обвязка из нескольких логических элементов после):
¤
entity Hsync_new is
port(clk: in bit;
A: out integer range 0 to 31:=31;
-- B: out integer range 0 to 327;
Hsync: out bit:='1';
MRead: out bit:='1';
CPUacc: out bit:='0';
VCNTRenc: out bit:='0';
SHIFTreg: out bit:='1';
H_blank_H: out bit:='0'
);
end Hsync_new;
¤
architecture Hsyncbeh of Hsync_new is
signal N: integer range 0 to 327:=0;
¤
begin
process (clk) is
begin
VCNTRenc<='0';
Hsync<='1';
Mread<='1';
CPUacc<='0';
SHIFTreg<='1';
H_blank_H<='0';
if (clk'event) and (clk='0') then N<=N+1;
else null;
end if;
¤
if N<48 then Hsync<='0';
else null;
end if;
¤
if N<=64 or N>322 then H_blank_H<='1';
else null;
end if;
¤
IF (N>=64) and (N<317) and (((N/8)*8)=N) then Mread<='0'; A<=39-(N/8);
elsif (N>=64) and (N<317) and ((((N-1)/8)*8)=(N-1)) then SHIFTreg<='0';
elsif ((N>=64) and (N<316) and ((((N-3)/8)*8)=(N-3))) or (N<59) or (N>=316) then CPUacc<='1';
else null;
end if;
¤
IF N>=325 then VCNTRenc<='1';
else null;
end if;
¤
IF N=327 then N<=0;
else null;
end if;
¤
end process;
end;
¤
Вообщем как побороть супер-шуструю логику для работы на низких скоростях?
-
? kisser - 28.09.2009 15:22
Разобрался... криво написано было... Теперь таймер по вектору 100 хочу реализовать, но его наверное в отдельную тему вынесу, есть ряд вопросов.
-
? hdc - 29.09.2009 16:36
немного не по теме, а с ВМ2 на чем закончилось? а то я уже и вм2 себе купил под это дело..
¤
-
? Kisser - 29.09.2009 18:34
to hdc: а ничем - так и не запустился, лежит на плате вместе с часами ))) К нему видимо нужно загрузчик приделать, и еще написать часть обслуживания halt-режима. А поскольку менять ПЗУ без перехода на современную элементную базу не представляется возможным (для меня уж точно, поскольку нет ни 1801рр1 ни программатора к ним) то сейчас пытаюсь делать обвязку бк11м под ВМ1 на ПЛИС, а дальше уже по обстоятельствам...
- << Форум