nickita startcev (nicka_startcev) wrote,
nickita startcev
nicka_startcev

Categories:

тупой вопрос по vhdl

я не настоящий сварщик. :)
но я таки немного разбираюсь в электронике (на уровне "спроектировать и развести ардуино нано, или стм-дискавери"), отЛУТить результат, спаять, прошить.
разбираюсь в около-эмбеддед программировании (на уровне типа сделать модбас-клиента (который собирает телеметрию по температурам-токам, в нужном порядке включает подопечных, итп), или генератор сетки частот, в рабочем режиме поддерживать одновременно дюжину такого рода проектов в рабочее время)
ну, еще умею писать мэйкфайлы. умеренно. то есть, представляю отличия парадигм всего вышеперечисленного (и фигею когда длина мэйкфайла почти линейно зависит от числа компилируемых единиц, а не от числа их типов)
ну и опыт промышленного железячно-драйверного программирования на с/с++ около 20 лет.


vhdl - немного знаю. примерно как в (пост)советское время про английский в анкетах писали "могу читать и писать со словарем".

а теперь собственно вопрос. покритикуйте, плиз, код:

и подскажите как и почему его стОит поправить, чтоб потом не было мучительно больно
generic (
  addr_width: natural:= 16;
  data_width: natural:= 8;
  mem_size: natural:= 2**addr_width
);

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

entity mem is
  port (clk  : in  std_logic;
        Wn_R : in  std_logic;
        addr : in  std_logic_vector(addr_width-1 downto 0);
        Di   : in  std_logic_vector(data_width-1 downto 0);
        Do0  : out std_logic_vector(data_width-1 downto 0);
        Do1  : out std_logic_vector(data_width-1 downto 0);
        Do2  : out std_logic_vector(data_width-1 downto 0)
       );
end mem;

architecture syn of mem is
  type ram_type is array ( mem_size-1 downto 0) of std_logic_vector (7 downto 0);
  signal RAM : ram_type;
begin process (clk, CSn)
  begin
    if (clk'event and clk = '1') then
      if (Wn_R = '0') then
        RAM(to_integer(unsigned(addr))) <= Di;
        Do0 <= ( others => 'Z' );
        Do1 <= ( others => 'Z' );
        Do2 <= ( others => 'Z' );
      else
        Do0 <= RAM( (to_integer(unsigned(addr)) + 0) );
        Do1 <= RAM( (to_integer(unsigned(addr)) + 1) % mem_size );
        Do2 <= RAM( (to_integer(unsigned(addr)) + 2) % mem_size );
    end if;
  else
    Do0 <= ( others => 'Z' );
    Do1 <= ( others => 'Z' );
    Do2 <= ( others => 'Z' );
  end if;
end process;
end syn;



ps: что чуток напрягает в вхдл, так это то, что он не допускает пустых блоков.
то есть, нельзя написать
  port (
        Do0  : out std_logic_vector(data_width-1 downto 0);
        Do1  : out std_logic_vector(data_width-1 downto 0);
        Do2  : out std_logic_vector(data_width-1 downto 0);
       );

точка с запятой после Do2 даст ошибку.
Subscribe

  • (no subject)

    если подумать, если с нуля при современных возможностях спроектировать а не по мелочи подпатчить, то очень многое в жизни станет резко дешевле и…

  • а вот я бы, если бы был вчера таким умным как ?? сегодня..

    а вот любопытно. допустим, вы попали в на 20-30-40-50 лет назад. помните-знаете про пейсбук, ютуб, жж и прочие блоги. как бы вы описали тенденции и…

  • электрофобийное

    внезапно, я боюсь стандартного напряжения 220/240в. осмысленно боюсь. оно неприятно бьёт и рикошетит дергающимися мышцами. итого, при любом…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments