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

 
 
> Покритикуйте проект
D-Luxe
сообщение Jan 24 2011, 14:59
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 24-02-10
Из: Пенза
Пользователь №: 55 642



Подскажите как можно покрасивее написать. Какие косяки?

Код
                                
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity ip_header is
  generic
  (
   C_IP_ADDR_DST                      : std_logic_vector        := X"ac1e69bf"
  );
  port
  (
  RFF_WR_CLK_IN                     : in std_logic;
  RFF_DATA_IN                       : in std_logic_vector(0 to 31);
  RFF_WR_REQ_IN                     : in std_logic;

  RFF_DATA_OUT                       : out std_logic_vector(0 to 31);
  RFF_WR_REQ_OUT                     : out std_logic
--  RFF_FULL_OUT                     : out std_logic
  );
end entity ip_header;

architecture IMP of ip_header is
  signal remove34_cnt : std_logic_vector(0 to 34) := "000" & X"00000000";
  
  signal ip_addr_dst : std_logic_vector(0 to 31) := X"00000000";
  
  signal ip_src_wrong : std_logic := '0';
  
  signal write_cnt : std_logic_vector(0 to 1) := "00";
  
begin


  RFF_DATA_OUT <= X"000008" & RFF_DATA_IN(24 to 31) when ( write_cnt(0) and RFF_WR_REQ_IN ) = '1' else
          X"000000" & RFF_DATA_IN(24 to 31) when ( write_cnt(1) and RFF_WR_REQ_IN ) = '1' else
          X"00000000";
  
  RFF_WR_REQ_OUT <= ( write_cnt(0) or write_cnt(1) ) and RFF_WR_REQ_IN;

  process( RFF_WR_CLK_IN )
  begin
    if ( RFF_WR_CLK_IN='1' and RFF_WR_CLK_IN'event ) then
      if ( RFF_DATA_IN(20)='1' and RFF_WR_REQ_IN='1' ) then
        remove34_cnt <= "100" & X"00000000";
      elsif ( RFF_DATA_IN(20)/='1' and RFF_WR_REQ_IN='1' ) then
        remove34_cnt <= '0' & remove34_cnt(0 to 33);
      end if;
      
      if ( remove34_cnt(25)='1' or remove34_cnt(26)='1' or remove34_cnt(27)='1' or remove34_cnt(28)='1' ) then
        ip_addr_dst <= ip_addr_dst(8 to 31) & ip_addr_dst(0 to 7);
      elsif ( ( remove34_cnt(25) or remove34_cnt(26) or remove34_cnt(27) or remove34_cnt(28) ) = '1' and ( ip_addr_dst(0 to 7) /= RFF_DATA_IN(24 to 31) ) ) then
        ip_src_wrong <= '1';
      elsif ( remove34_cnt(24)='1' ) then
        ip_addr_dst <= C_IP_ADDR_DST;
        ip_src_wrong <= '0';
      end if;

     if ( ip_src_wrong='0' and remove34_cnt(32)='1' ) then
          write_cnt <= "10";
     elsif ( ip_src_wrong='0' and remove34_cnt(33)='1' ) then
          write_cnt <= "01";
     elsif ( RFF_DATA_IN(20)='1' ) then
          write_cnt <= "00";
     else
          write_cnt <= "00";
      end if;
      
    end if;
  end process;

end IMP;


--------------------
Нелегко оказаться на верном пути, но куда труднее его пройти.
(с) Уилл Роджерс
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Victor®
сообщение Jan 26 2011, 07:47
Сообщение #2


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(D-Luxe @ Jan 24 2011, 18:59) *
Подскажите как можно покрасивее написать. Какие косяки?

Код
                                
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity ip_header is
  generic
  (
   C_IP_ADDR_DST                      : std_logic_vector        := X"ac1e69bf"
  );
  port
  (
  RFF_WR_CLK_IN                     : in std_logic;
  RFF_DATA_IN                       : in std_logic_vector(0 to 31);
  RFF_WR_REQ_IN                     : in std_logic;

  RFF_DATA_OUT                       : out std_logic_vector(0 to 31);
  RFF_WR_REQ_OUT                     : out std_logic
--  RFF_FULL_OUT                     : out std_logic
  );
end entity ip_header;

architecture IMP of ip_header is
  signal remove34_cnt : std_logic_vector(0 to 34) := "000" & X"00000000";
  
  signal ip_addr_dst : std_logic_vector(0 to 31) := X"00000000";
  
  signal ip_src_wrong : std_logic := '0';
  
  signal write_cnt : std_logic_vector(0 to 1) := "00";
  
begin


  RFF_DATA_OUT <= X"000008" & RFF_DATA_IN(24 to 31) when ( write_cnt(0) and RFF_WR_REQ_IN ) = '1' else
          X"000000" & RFF_DATA_IN(24 to 31) when ( write_cnt(1) and RFF_WR_REQ_IN ) = '1' else
          X"00000000";
  
  RFF_WR_REQ_OUT <= ( write_cnt(0) or write_cnt(1) ) and RFF_WR_REQ_IN;

  process( RFF_WR_CLK_IN )
  begin
    if ( RFF_WR_CLK_IN='1' and RFF_WR_CLK_IN'event ) then
      if ( RFF_DATA_IN(20)='1' and RFF_WR_REQ_IN='1' ) then
        remove34_cnt <= "100" & X"00000000";
      elsif ( RFF_DATA_IN(20)/='1' and RFF_WR_REQ_IN='1' ) then
        remove34_cnt <= '0' & remove34_cnt(0 to 33);
      end if;
      
      if ( remove34_cnt(25)='1' or remove34_cnt(26)='1' or remove34_cnt(27)='1' or remove34_cnt(28)='1' ) then
        ip_addr_dst <= ip_addr_dst(8 to 31) & ip_addr_dst(0 to 7);
      elsif ( ( remove34_cnt(25) or remove34_cnt(26) or remove34_cnt(27) or remove34_cnt(28) ) = '1' and ( ip_addr_dst(0 to 7) /= RFF_DATA_IN(24 to 31) ) ) then
        ip_src_wrong <= '1';
      elsif ( remove34_cnt(24)='1' ) then
        ip_addr_dst <= C_IP_ADDR_DST;
        ip_src_wrong <= '0';
      end if;

     if ( ip_src_wrong='0' and remove34_cnt(32)='1' ) then
          write_cnt <= "10";
     elsif ( ip_src_wrong='0' and remove34_cnt(33)='1' ) then
          write_cnt <= "01";
     elsif ( RFF_DATA_IN(20)='1' ) then
          write_cnt <= "00";
     else
          write_cnt <= "00";
      end if;
      
    end if;
  end process;

end IMP;



Код
...
if ( remove34_cnt(25)='1' or remove34_cnt(26)='1' or remove34_cnt(27)='1' or remove34_cnt(28)='1' ) then
...


Эквивалентно
Код
...
if ( remove34_cnt(28 downto 25) /="0000"  then
...



P.S.
а вообще я бы ввел сигнал

Код
remove_vec <= '1' when remove34_cnt(28 downto 25) /="0000" else '0';


remove34_cnt(25)='1' or remove34_cnt(26)='1' or remove34_cnt(27)='1' or remove34_cnt(28)='1'
в Вашем описании повторяется, и если надо что-то менять - надо менять в 2-х местах, что не есть хорошо.

P.P.S.

Код
if ( remove34_cnt(25)='1' or remove34_cnt(26)='1' or remove34_cnt(27)='1' or remove34_cnt(28)='1' ) then
        ip_addr_dst <= ip_addr_dst(8 to 31) & ip_addr_dst(0 to 7);
      elsif ( ( remove34_cnt(25) or remove34_cnt(26) or remove34_cnt(27) or remove34_cnt(28) ) = '1' and ( ip_addr_dst(0 to 7) /= RFF_DATA_IN(24 to 31) ) ) then
        ip_src_wrong <= '1';
      elsif ( remove34_cnt(24)='1' ) then
        ip_addr_dst <= C_IP_ADDR_DST;
        ip_src_wrong <= '0';
      end if;


Что-то кажется мне, что латчей тут будет...
Получается что-то вида
Код
if a='1' then
       sig1 <= ...;
elsif a = '1' and b = '1' then
       sig2 <= ...;
elsif c = '1' then
       sig1 <= ...;
       sig2 <= ...;
end if;


Что будет с sig2 в первом условии? И с sig1 во втором?
И с условиями плохо....
второе условие будет проверяться, когда a не равно '1', но во втором
условии есть a='1'...
Вообщем переделать надо, мутно как-то все.
А косяки будет видно, если промоделируете... и чем раньше - тем лучше.


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post



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

 


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


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