реклама на сайте
подробности

 
 
> Помогите новичку с реализацией проекта, на Циклоне 2
MDI
сообщение Dec 9 2008, 07:32
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 9-12-08
Пользователь №: 42 312



Стоит примерно следующая задача: Имеется Cyclone II, SRAM, W5100. Необходимо реализовать устройство которое будет получать команды по езернету, складывать их в буфер, а по истечению определенного времени (значение передается в команде) писать в цапы. Устройство не сложное, если бы не одно но. Опыта работы с ПЛИС нет. Приступил к работе с создания части, которая пишет в цап. Вот код который я натоптал:
library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity shifter is

PORT(WR : IN STD_LOGIC;
SEND : IN STD_LOGIC;
data_in : IN STD_LOGIC_VECTOR(23 downto 0);
data_out : OUT STD_LOGIC;
CS : OUT STD_LOGIC;
shift_clk_out : OUT STD_LOGIC);


END entity shifter;

architecture a_shifter of shifter is

BEGIN

PROCESS(WR, SEND)
variable buf : STD_LOGIC_VECTOR(23 downto 0);
BEGIN
IF(WR'event and WR ='1') then
for A in 23 downto 0 loop
buf(A) := data_in(A);
end loop;
END IF;

IF(SEND'event and SEND ='1') then
CS <= '1';
for A in 23 downto 0 loop
shift_clk_out <= '1';
data_out <= buf(A) after 10 ns;
shift_clk_out <= '0';
end loop;
CS <= '0';

END IF;



END PROCESS;


END architecture a_shifter;

Естественно, он не работает в симуляторе. Алгоритм, который я пытался реализовать такой: Сначала я выставляю 23 бита на data_in, потом дергаю WR и по фронту это все дело пишется в buf. Потом дергаю SEND и биты должны из buf последовательно выдаваться на пин данных, при этом не забывая про цлк и выбор кристалла (shift_clk_out и CS). Помогите кто чем может, желательно по-существу.

Еще переделывал, задавая buf, как сигнал в начале архитектуры (до begin). Наверное так правильнее, но все равно не работало)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Alex11
сообщение Dec 9 2008, 08:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Как минимум, BUF должен быть не variable, а signal и в начале. Далее. конструкция after работает только в симуляторе, в синтезаторе - нет. Все временные соотношения должны задаваться от внешнего клока. Т.е. дожидаетесь фронта клока, затем выставляете сигнал, дожидаетесь следующего - выставляете следующий и т.д.
Go to the top of the page
 
+Quote Post
MDI
сообщение Dec 9 2008, 09:43
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 9-12-08
Пользователь №: 42 312



Ок, спасибо, как внешний клок сюда прикрутить?

Когда на SEND выдаю строб, то сигнал на дата_аут становится равен buf(0) и уже не меняется потом.

Почему не изменяется состояние shift_clk_out и CS?

Сообщение отредактировал MDI - Dec 9 2008, 09:55
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 9 2008, 10:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



У вас распространенная ошибка - VHDL это не язык програмирования, а язык ОПИСАНИЯ АППАРАТУРЫ. Поэтому обычные методы програмирования в нем непригодны. В частности, цикл
Цитата
for A in 23 downto 0 loop
shift_clk_out <= '1';
data_out <= buf(A) after 10 ns;
shift_clk_out <= '0';
end loop;
будет делать совсем не то, что вы ожидали. shift_clk_out будет константно привязан в 0, а на data_out попадет buf(0). Никакого последовательного вывода не получится. В частности 'after 10 ns' будет полностью проигнорированно
Go to the top of the page
 
+Quote Post
MDI
сообщение Dec 9 2008, 11:24
Сообщение #5





Группа: Новичок
Сообщений: 3
Регистрация: 9-12-08
Пользователь №: 42 312



Т.е. после использования оператора <= состояние вывода изменить уже нельзя? Интересно было бы узнать, каким образом, в таком случае, сделать последовательный вывод?
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 9 2008, 15:01
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(MDI @ Dec 9 2008, 14:24) *
Т.е. после использования оператора <= состояние вывода изменить уже нельзя? Интересно было бы узнать, каким образом, в таком случае, сделать последовательный вывод?


реализовать сдвигающий регистр. Или ввести счетчик, выходы которого пойдут на sel входы мультиплексора, который и будет определять из какого разряда буферного регистра выдавать однорязрядное данное.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016