Jump to content

    

Получить число из массива

Что то я запутался.

Есть массив байтов и я внего принимаю данные по UART

type str_t is array(integer range<>) of std_logic_vector(7 downto 0);
signal rx_uart_buf : str_t(0 to RX_BUF_SIZE-1);

Скажем мне послали 1234, и в буфере

rx_uart_buf(0) <= X"01";
rx_uart_buf(1) <= X"02";
rx_uart_buf(2) <= X"03";
rx_uart_buf(3) <= X"04";

а как мне преобразовать в число в VHDL? так можно?

signal reg_adr : std_logic_vector(31 downto 0);

reg_adr <= rx_uart_buf(0) & rx_uart_buf(1) & rx_uart_buf(2) & rx_uart_buf(3);

 

Edited by jenya7

Share this post


Link to post
Share on other sites

Тяжко вы формируете свои запросы.

Можно так записать 4 байта в 32-битный вектор.

Share this post


Link to post
Share on other sites
1 hour ago, quato_a said:

Тяжко вы формируете свои запросы.

Можно так записать 4 байта в 32-битный вектор.

ну...это то что я делаю?

но получается

reg_adr <= X"01020304";

это ведь не число 1234

Edited by jenya7

Share this post


Link to post
Share on other sites

Ну вам надо будет сложить x'4' + x'3'*10 + x'2'*100 + x'1'*1000... вот тока нафига такие сложности

Share this post


Link to post
Share on other sites

Всё зависит от того, что нужно делать дальше с этим числом - так и преобразуйте. По сути у вас простая байтовая кодировка, когда в каждом байте вмещается одна цифра числа. Нужна другая кодировка или другие действия играйтесь с кодировкой и преобразованиями.

Share this post


Link to post
Share on other sites
1 hour ago, Flip-fl0p said:

Ну вам надо будет сложить x'4' + x'3'*10 + x'2'*100 + x'1'*1000... вот тока нафига такие сложности

а как по другому?

Share this post


Link to post
Share on other sites

А может Вы со поделитесь с описанием задачи ?

Share this post


Link to post
Share on other sites
1 hour ago, Flip-fl0p said:

А может Вы со поделитесь с описанием задачи ?

запись-чтение в регистры

when ST_WORD_READ =>
  
    case (reg_addr) is
        when X"0020" => sspi_data_out <= FREQ_COUNT1(15 downto 0); 	
        when X"0021" => sspi_data_out <= FREQ_COUNT1(31 downto 16);	

        when X"0022" => sspi_data_out <= FREQ_COUNT2(15 downto 0); 	 
        when X"0023" => sspi_data_out <= FREQ_COUNT2(31 downto 16); 

        when others =>
    end case;


when ST_WORD_WRITE =>
   case (sspi_addr) is 
      when X"0120" => SMI_Wr_Add_reg <= sspi_data_in;
      when X"0122" => SMI_Wr_Data_reg <= sspi_data_in;
   end case;

раньше я получал байты по SPI в бинарном виде. теперь UART по терминалу.

Edited by jenya7

Share this post


Link to post
Share on other sites
4 минуты назад, jenya7 сказал:

запись-чтение в регистры


when ST_WORD_READ =>
  
    case (reg_addr) is
        when X"0020" => sspi_data_out <= FREQ_COUNT1(15 downto 0); 	
        when X"0021" => sspi_data_out <= FREQ_COUNT1(31 downto 16);	

        when X"0022" => sspi_data_out <= FREQ_COUNT2(15 downto 0); 	 
        when X"0023" => sspi_data_out <= FREQ_COUNT2(31 downto 16); 

        when others =>
    end case;


when ST_WORD_WRITE =>
   case (sspi_addr) is 
      when X"0120" => SMI_Wr_Add_reg <= sspi_data_in;
      when X"0122" => SMI_Wr_Data_reg <= sspi_data_in;
   end case;

раньше я получал байты по SPI в бинарном виде. теперь UART по терминалу.

 

Хреновое ТЗ - результат - ХЗ. Понятнее не стало...

Share this post


Link to post
Share on other sites
1 hour ago, Flip-fl0p said:

Хреновое ТЗ - результат - ХЗ. Понятнее не стало...

я получаю ОПКОД АДРЕС1 АДРЕС2 ДАТА1 ДАТА2

ОПКОД - ST_WORD_READ \ ST_WORD_WRITE

reg_addr<= АДРЕС2 & АДРЕС1 ;

sspi_data_in <= ДАТА2 & ДАТА1 ;

 

Share this post


Link to post
Share on other sites
27 минут назад, jenya7 сказал:

 

теперь UART по терминалу

Видимо здесь нам надлежит дотелепатировать, что речь о тексте ASCII.

Share this post


Link to post
Share on other sites
1 hour ago, Plain said:

Видимо здесь нам надлежит дотелепатировать, что речь о тексте ASCII.

принимаю так

GET_UART_BUFF: process(CLK)
variable rx_idx : integer range 0 to 255 := 0;
variable rx_rdy_count : integer range 0 to 255 := 0;
begin
    if (rising_edge(CLK)) then
	 
     if (rx_rdy3 = '1') then
	     if (RX_DATA = X"0D") then  --\r - end of command
			rx_uart_buf(rx_idx) <= X"0D"; 
			rx_idx := 0;
			rx_data_ready <= '1';
		else
			if(RX_DATA > X"2F" and RX_DATA < X"3A") then  --0 to 9
				rx_uart_buf(rx_idx) <= RX_DATA - X"30"; --convert to number
			else
				rx_uart_buf(rx_idx) <= RX_DATA; 
			end if;
					 
			if (rx_idx < RX_BUF_SIZE-1) then
				 rx_idx := rx_idx + 1;
			 end if;
		end if;
	end if;
		  
	if (rx_data_ready = '1') then
		rx_idx := 0;
				
		rx_rdy_count := rx_rdy_count + 1; --for signal to last x tacts
				
		if (rx_rdy_count > 1) then
			rx_rdy_count := 0;
			rx_data_ready <= '0'; 	 
		end if;
			
	end if;
		   
 end if;
	 
end process GET_UART_BUFF;

но я тут подумал. а может сказать чтоб слали в бинарном виде. тогда проблема как бы отпадет.

Share this post


Link to post
Share on other sites

Пошёл за покорном :popcorm2:. Сочетание ТС и ТЗ обещает много весёлых минут (даже скорее часов)

 

Share this post


Link to post
Share on other sites
51 минуту назад, jenya7 сказал:

 

раньше ... в бинарном виде ... теперь

К сожалению, после последнего слова у Вас случился сбой передачи данных на форум, который грозит перерасти на нём в простыню с десяток страниц. Просьба предотвратить данную катастрофу.

Share this post


Link to post
Share on other sites

Представьте, что Вы заказчик, который нанимает человека проект делать, час работы которого стоит  много денег.  Так вот опишите Вашу задачу таким образом, будто Вы выдаете ТЗ для наемного работника. Ибо в Ваших же интересах описать задачу таким образом, чтобы никаких вопросов касаемо поставленной задачи у работника не возникало, поскольку кривое ТЗ=потеря $. Сейчас мне совсем непонятно что Вы делаете, и что хотите сделать. Уважайте других участников форума, ибо их советы бесплатные и они тратят своё время на помощь, не требуя ничего взамен. И не забывайте, что форум - это отличная база знаний, вклад в которую вносит каждый участник форума 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now