Jump to content

    
Sign in to follow this  
jenya7

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

Recommended Posts

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

Есть массив байтов и я внего принимаю данные по 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
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

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

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
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
51 минуту назад, jenya7 сказал:

 

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this