Лекции
Практические
Лабораторные
Табель
Доп. материалы
- Заголовок
- Цифровые блоки RFID
- Автор
- Зайцев В.С.
- Нижний колонтитул
- Спец курс (Избранные главы VHDL)/Реализация описания цифровых блоков RFID-меток
- Дополнительный нижний колонтитул
- Зайцев В.С., 13:16, 2 декабря 2013
Слайд: Блок декодирования
Слайд: Входные последовательности
Протокол записи и чтения данных ISO11784/785
Параметр
|
Примечание
|
Обозначение
|
не менее
|
не более
|
Единица
|
Стартовый интервал
|
|
Sgap
|
10
|
50
|
периодов частоты
|
Интервал между данными
|
в режиме записи
|
Wgap
|
8
|
30
|
периодов частоты
|
Запись данных в обычном режиме
|
данные «0»
|
d0
|
16
|
31
|
периодов частоты
|
данные «1»
|
d1
|
48
|
63
|
периодов частоты'
|
|
architecture beh of decoder is
signal count : unsignaed (8 downto 0);
begin -- beh
rst <= dm;
aa: process (clk, rst)
begin -- process aa
if rst = '0' then
count <= (others => '0');
get_data <= '0';
elsif clk'event and clk = '1' then
count <= count + 1;
if 8 < count and count < 16 then
get_data <= '0';
elsif 48 < count and count < 63 then
get_data <= '1';
else
get_data <= '0';
end if;
end if;
end process aa;
end beh;
|
|
architecture beh of decoder is
signal count : unsignaed (8 downto 0);
signal dmi : std_logic;
signal dmij : std_logic;
signal delimiter : unsigned (8 downto 0);
signal tari : unsigned (8 downto 0);
signal rtcal : unsigned (8 downto 0);
begin -- beh
rst_c <= rst or rst_count_when_end_pause;
aa : process (clk, rst_c)
begin -- process aa
if rst_c = '1' then
count <= (others => '0');
get_data <= '0';
elsif clk'event and clk = '1' then
count <= count + 1;
if first_pause then
delimiter <= count;
elsif second_pause then
tari <= count;
elsif 3_pause then
rtcal <= count;
elsif next_pause then
if count > rtcal_div_2 then
get_data <= '1';
else
get_data <= '0';
end if;
end if;
end if;
end process aa;
end beh;
|
|
architecture beh of decoder is
signal count : unsignaed (7 downto 0);
signal count_bit : unsignaed (7 downto 0);
begin -- beh
aa: process (clk, rst)
begin -- process aa
if rst = '0' then
count <= (others => '0');
get_data_byte <= '0';
elsif clk'event and clk = '1' then
count <= count + 1;
if count = div_freq then
count <= x"00";
count_bit <= count_bit + '1';
if dm = '0' then
get_data_byte <= count_bit;
end if;
end if;
end if;
end process aa;
end beh;
|
Слайд: Блок обработки данных по протоколу
Сигнал на катушке RFID считывателя
architecture beh of fms is
type st_answ_type is (
stanswer_pre,
stanswer_start,
stanswer_data,
stanswer_stop,
stanswer_end
);
signal sta : st_answ_type;
begin -- beh
--=====================================
-- автомат переключения во время ответа
--=====================================
answer_proc: process (clk_answer, rst)
begin -- process answer_proc
if rst = '1' then
sta <= stanswer_pre;
dischargei <= '0';
sta_change <= '0';
elsif clk_answer'event and clk_answer = '0' then
case sta is
when stanswer_pre =>
if st = stanswer then
if count_bit_16 then
sta_change <= not sta_change;
if dischargei = '0' then
sta <= stanswer_start;
else
sta <= stanswer_pre;
--пока включен разряд не выходим из этого состояния
end if;
end if;
end if;
|
when stanswer_start =>
if count_bit_8 then
sta <= stanswer_data;
sta_change <= not sta_change;
end if;
when stanswer_data =>
if count_bit_80 then
sta <= stanswer_stop;
sta_change <= not sta_change;
end if;
when stanswer_stop =>
if count_bit_8 then
sta <= stanswer_end;
sta_change <= not sta_change;
end if;
when stanswer_end =>
if count_bit_16 then
dischargei <= '1';
-- если включается разряд то в начало и
sta <= stanswer_pre;
sta_change <= not sta_change;
end if;
when others => sta <= stanswer_pre;
end case;
end if;
end process answer_proc;
--===============================
-- контрольные значения счетчика
--===============================
count_bit_0 <= count_bit = 0;
count_bit_8 <= count_bit = 7;
count_bit_15 <= count_bit = 14;
count_bit_16 <= count_bit = 15;
count_bit_80 <= count_bit = 79;
cmd_BB <= cmd = x"BB";
pwd_EB <= pwd = x"EB";
cmd_cap_write <= cmd(0) = '1';
cmd_cap_read <= cmd(1) = '1';
cmd_write_bc <= cmd(2) = '1';
cmd_readlock <= cmd(3) = '1';
cmd_tst_write <= cmd(4) = '1';
cmd_read_4_8 <= cmd(5) = '1';
cmd_read_0 <= cmd(6) = '1';
cmd_read_1 <= cmd(7) = '1';
end beh;
|
Слайд: Блок чтения из накопителя
Стандартная конструкция блока хранения информации для RFID
- Схематическое отображение блока накопителя
|
library ieee;
-- PACKAGE STATEMENT
use ieee.std_logic_1164.all;
entity xe80x1v2 is
-- GENERIC LIST
generic(
g_mem_init : std_logic_vector(0 to 79) := X"FF962000077900B63467"
);
-- PORT LIST
port(
vpp : inout std_logic;
cp_on : out std_logic;
do : out std_logic;
adr : in std_logic_vector(6 downto 0);
clk : in std_logic;
di : in std_logic;
load : in std_logic;
prog : in std_logic
);
end xe80x1v2;
|
Временные диаграммы описывающие протокол записи в накопитель
Пример поведенческой модели накопителя (VHDL)
architecture beh of xe80x1v2 is
signal mem : std_logic_vector(0 to 79) := g_mem_init;
signal invmem : std_logic_vector(79 downto 0) := g_mem_init;
signal addr : std_logic_vector(6 downto 0);
signal write_buffer : std_logic_vector(0 to 79) := (others => '0');
signal rd_nn, wr_n : std_logic;
begin -- beh
vpp <= 'Z' ;
wr_n <= clk and load;
rd_nn <= not ((not prog) and clk and (not load));
cp_on <= not prog;
p1 : process ( wr_n, prog, vpp)
begin -- process p1
if wr_n = '1' then
write_buffer(to_integer(unsigned(adr(6 downto 0)))) <= di;
end if;
if prog = '1' and vpp = 'H' then
mem <= write_buffer after 2 ms;
end if;
end process p1;
do <= mem(to_integer(unsigned(adr))) after 10 ns when (rd_nn = '0') else
'1' after 2 ns ;
inv_gen: for i in 0 to 79 generate
invmem(i) <= mem (i);
end generate inv_gen;
end beh;
|
Пример поведенческой модели накопителя (Verilog)
always @(row or col) begin
k=0;
si=0;
sj=0;
i=0;
j=0;
for (i=0; i<14; i=i+1)
for (j=0; j<4; j=j+1)
if (col[i] && row[j])
begin
$display("true decoder data");
k=k+1;
si=i;
sj=j;
end
if (k == 0) #(Tacc) do <= 1'b1;
else if (k == 1) #(Tacc) do <= mem[si][sj];
else do <= 1'bX;
|
Слайд: Блок кодирования