2013-12-11 5 views
0

У меня возникли проблемы с получением простой математики, сделанной в VHDL. Я ужасен на этом языке, поэтому, если мой синтаксис глуп или что-то еще, у меня есть предлог: P. Я пытаюсь реализовать очень простой генератор случайных чисел, который вычисляет псевдослучайные числа по формуле:Операторы векторов битовых векторов VHDL

семян = (семена * 1103515245) + 12345

Как я пытаюсь сделать это:

Signalss здесь

signal seed: std_logic_vector(31 downto 0) := x"2B4C96B9"; 
signal multiply: std_logic_vector(31 downto 0) := x"41C64E6D"; 
signal add: std_logic_vector(31 downto 0) := x"00003039"; 
signal temp1: std_logic_vector(63 downto 0); 
signal temp2: std_logic_vector(31 downto 0); 

Исчисление здесь (сделано в государстве, в государственной машине)

temp2 <= seed; 
temp1 <= std_logic_vector((unsigned(temp2)*unsigned(multiply))); 
seed <= std_logic_vector(unsigned(temp1(31 downto 0)) + unsigned(add)); 

temp2 всегда заканчивается неопределенным. Кроме того, семена заканчиваются и не определены. Я пробовал это несколько разных способов, но все они ошибались в основном из-за размеров и порядка векторов или операций. Я чувствую, что сейчас делаю это правильно, основываясь на том, что я нашел в полуразрушенном Googling, но я просто не могу понять это.

Самое лучшее, что я могу сейчас придумать, это сделать каждый шаг расчета в своем собственном состоянии на конечной машине. Может ли кто-нибудь увидеть, что я здесь делаю неправильно?

ответ

2

VHDL отличается от других языков в этом сигнале назначить на <= не вступает в силу для чтения только после задержки дельты, таким образом, если вы:

temp2 <= seed; 
temp1 <= std_logic_vector((unsigned(temp2)*unsigned(multiply))); 
seed <= std_logic_vector(unsigned(temp1(31 downto 0)) + unsigned(add)); 

то temp2 фактически не обновляется для чтения в выражение, используемое для назначения temp1 до тех пор, пока не пройдет дельта-задержка.

В зависимости от деталей о вашей конструкции, вы можете рассмотреть вопрос об объявлении промежуточных переменных в качестве переменных:

variable temp1: std_logic_vector(63 downto 0); 
variable temp2: std_logic_vector(31 downto 0); 

, а затем назначить как:

temp2 := seed; 
temp1 := std_logic_vector((unsigned(temp2)*unsigned(multiply))); 
seed <= std_logic_vector(unsigned(temp1(31 downto 0)) + unsigned(add)); 

В этом случае промежуточных переменных temp1 и temp2 будет готов к чтению сразу после назначения, а значение seed будет иметь значение после задержки дельты, предполагая, что вы не будете выполнять следующую итерацию до следующего цикла ле.

Он уточнит намерения в коде, если константы объявляются как таковые, делают:

constant MULTIPLY : std_logic_vector(31 downto 0) := x"41C64E6D"; 
constant ADD  : std_logic_vector(31 downto 0) := x"00003039"; 

Комментарий на вас расчет, то дизайн VHDL обрезает результат умножения, что делает:

семян = (семя * 1103515245) по модулю (2 ** 32) + 12345

+0

Я думаю, что семя должно было быть 32 бита вектора (должен был отметить, что), так что усечение было к сож необходимость. Я просто хочу получить задание, и ваше предложение исправило все мои проблемы! Огромное спасибо! – SkylineAddict

+0

И объявляйте их «неподписанными», видя, как вы так или иначе закончите использовать их, нет смысла, если все время переходите к 'std_logic_vector' ... –

Смежные вопросы