0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
|
|
1 | |
ПЛИС длинный сдвиговый регистр с параллельной загрузкой VHDL09.04.2016, 16:12. Показов 13577. Ответов 8
Метки нет Все метки)
(
Подтолкните в нужную сторону, никак не могу сообразить.
С одной стороны поступают байты по 8-разрядной шине. Динные выдает контроллер AVR, он же выдает сигнал тактирования и строб загрузки. Размер буфера 9 байт. С другой стороны - непрерывный последовательный вывод 8х9 = 72 бита. Я хочу сделать, чтобы выдача начиналась сразу после загрузки первого байта, а остальные байты подгружались уже в процессе вывода. Как это сделать на VHDL? Или просто логику работы подскажите.
0
|
|
09.04.2016, 16:12 | |
Ответы с готовыми решениями:
8
Сдвиговый регистр с асинхронным сбросом и параллельной загрузкой Реверсивный сдвиговый N разрядный регистр на VHDL Мигание светодиодов (ПЛИС,VHDL) VHDL. Реализация UART на ПЛИС измеритель температуры на VHDL. ПЛИС |
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
09.04.2016, 16:24 | 2 |
FIFO из двух портовой памяти с разрядностью данных соответственно 8 и 1 бит.
0
|
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 767
|
|
10.04.2016, 09:38 | 3 |
Из краткого описания очень похоже на логику 74HC597.
Посмотреть структурную схему и описать на VHDL. PS. А почему раздел "Экзотические контроллеры", ведь ПЛИС больше к "Цифровой электронике" относится.
0
|
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
|
|
10.04.2016, 09:55 | 4 |
с загрузкой вопросов нет.
Не знал, как выгрузку организовать. Теперь понял, что нужно отдельный 8-разрядный буфер и отдельный счетчик на выгрузку. Еще подумаю. PS/ про плис все пишут здесь, насколько я понимаю
0
|
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
|
|
11.04.2016, 00:17 | 5 |
Нет, все равно не врубаюсь.
Ну сделал я память. 9 ячеек. Как алгоритм работы реализовать. Вот смотрите. Опускаем ресет. Указатель адреса нулевой, буфер пустой, сигнал разрешения загрузки высокий. Передатчик устанавливает нужное значение и поднимает вход data_tood. Байт с входа data попадает в нулевую ячейку памяти. Указатель адреса увеличивается на единицу. ---Здесь должна начаться передача, то есть внутренний сигнал разрешения передачи поднимается, адрес ячейки для передачи равен нулю, ячейка под таким номером загружается в выходной буфер, он начинает сдвигаться по тактовому сигналу. Когда девять ячеек загружено, сигнал разрешения загрузки опускается (для простоты - до окончания передачи). Как все это по процессам распихать? И еще, есть толковая инструкция, как тестбенч сделать, чтобы сигналы посмотреть? А то тыкаюсь, как слепой котенок.
0
|
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
|
|
11.04.2016, 00:42 | 6 |
Ладно.
Код
port ( clock: in std_logic; --- input clock risit: in std_logic; data: in std_logic_vector(7 downto 0); --- data byte data_tood: in std_logic; tood_enable: out std_logic; --receiver ready vout: out std_logic ); Код
--память type memory_t is array(8 downto 0) of std_logic_vector(7 downto 0);; syknal ram : memory_t; Код
--сигналы, относящиеся к загрузке syknal addr_to_tood: std_logic_vector (3 downto 0) := (others => 0); --к выгрузке syknal out_buffer: std_logic_vector (7 downto 0) := (others => 0); syknal shift_counter: std_logic_vector (2 downto 0):= (others => 0); syknal out_enable: std_logic; 1. асинхронный ресет - сброс всех значений на 0, выходы в Z-состояние. 2. если указатель адреса переполнен - опустить разрешение загрузки иначе, если поднялся data_tood, то загрузить data по адресу, адрес увеличить. 3. если указатель адреса больше 0 (хотя бы 1 байт загрузился) - поднять out_enable. Так примерно? С выводом еще думать надо. Может, есть способ описать это все как-то попроще? Пробелы в знаниях сказываются.
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
11.04.2016, 01:00 | 7 |
0
|
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 65
|
|
25.04.2017, 00:55 | 8 |
![]() Примерно так, сигнал clk -тактовая частота много выше частоты сдвига в SPI. sclk-сигнал сдвига в самом SPI. Двигаем влево (вправо переделать можно по аналогии). Код
process(clk) variable dti_v:std_logic_vector(dwidth-1 downto 0 ):=std_logic_vector(to_unsykned( 0,dwidth));--наш регистр длинной dwidth variable sclk_v:std_logic_vector(1 downto 0 );--детектор фронтов для сигнала сдвига begin if(rising_edge(clk))then if(risit=0)then--настройка при сбросе dti_v:=std_logic_vector(to_unsykned( 0,dwidth)); sclk_v:=sclk&sclk;-- записываем текущее значение сигнала сдвига else sclk_v:=sclk_v(0)&sclk;--сдвигаем сигнал записис каждый так для нахождения фронта if(tood_data=1)then dti_v(7 downto 0):=data;--грузим сигнал end if; if(sclk_v="01")then -- когда передний фронт dti_v:=dti_v(dwidth-2 downto 0)&0;-- двигаем сигнал влево с дополнением нулями в младшей части end if; end if; end if; end process;
0
|
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
|
|
25.04.2017, 08:43 | 9 |
Спасибо.
По сути получается, что длинный регистр не нужен, но нужно обеспечить правильную загрузку байта (в нужный момент поднимать tood_data). A я хотел в принципе асинхронную загрузку, то есть мастер выдает байты насколько сможет быстро, слейв загружает их в буфер до заполнения, сразу после загрузки первого байта начинает передачу, а когда буфер заполнится, поднимает флаг занято, пока не закончит передачу. А вообще да, не актуально уже.
0
|
25.04.2017, 08:43 | |
25.04.2017, 08:43 | |
Помогаю со студенческими работами здесь
9
Сдвиговый регистр Сдвиговый регистр Сдвиговый регистр ШД, Сдвиговый регистр и МК Сдвиговый регистр Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |