VHDL - hloupe otazky 2.0

Draček Fráček dracek.fracek na gmail.com
Pátek Leden 3 22:40:21 CET 2014


Jsem asi ten posledni , dko tu muze radit ve VHDL, neb je to pro me
pueblo español,
presto.
Ono zalezi na jakem HW to pak pojede a predevsim jak haklivy jste na
presnsot a stridu hodin.
Pokud nejste cimprlich tak, timhle by pri M=13 a D=20 mohlo jit udelat 65 z
100

-- =======
--
-- Given:
--
--   Fi = input frequency Hz
--   M  = multiplier
--   D  = divisor
--   Fo = output frequency Hz
--
-- Where:
--
--   M ≤ D
--
-- Then:
--
--        ⎧    M
--        ⎪ Fi·—        if M <= D
--   Fo = ⎨    D
--        ⎪
--        ⎩ undefined   if M > D
--
--
-- If (M/D) is greater than 0.5, only the clock enable is valid.
-- If (M/D) is greater than 1.0, both outputs are invalid.

entity Clock_Divider is
  generic (
    operand_width : positive
    );
  port (
    clock : in bit;
    reset : in bit;

    multiplier : in unsigned(operand_width-1 downto 0);
    divisor    : in unsigned(operand_width-1 downto 0);

    out_enable : buffer bit;
    out_clock  : buffer bit
    );
end entity;

architecture any of Clock_Divider is
  signal enable_2x : bit;
begin

  -- Divide the clock by accumulating phase using the mulitplier and
  -- subtracting when we pass the divisor value.

  proc_enable : process is
    variable phase : unsigned(operand_width downto 0);
  begin
    wait until rising_edge(clock);
    phase := phase + multiplier;
    if phase >= divisor then
      phase := phase - divisor;
      out_enable <= '1';
    else
      out_enable <= '0';
    end if;
    if reset = '1' then
      phase := (others => '0');
      out_enable <= '0';
    end if;
  end process;

  proc_enable : process is
    variable phase : unsigned(operand_width downto 0);
  begin
    wait until rising_edge(clock);
    phase := phase + (multiplier & '0');
    if phase >= divisor then
      phase := phase - divisor;
      enable_2x <= '1';
    else
      enable_2x <= '0';
    end if;
    if reset = '1' then
      phase := (others => '0');
      enable_2x <= '0';
    end if;
  end process;


  proc_out_clock : process is
  begin
    wait until rising_edge(clock);
    if enable_2x = '1' then
      out_clock <= not out_clock;
    end if;
  end process;

end architecture;


Dne 3. ledna 2014 21:14 <hw na itherm.cz> napsal(a):

> Mam dalsi otazku ;-)
>
> Potreboval bych generovat 65MHz a 100MHz hodiny, da se to udelat pomoci
> jednech hodin z venku?
>
> Pavel
>
>
> -----Original Message-----
> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Marek Peca
> Sent: 2. ledna 2014 10:13
> To: HW-news
> Subject: RE: VHDL - hloupe otazky
>
> > Me pri otazce slo hlavne o to jestli neni nejaky jeste lepsi postup
> > nez stavovy automat.
>
> To je velmi zapeklita otazka. Z hlediska Turingovske ekvivalence automatu
> je
> v synchronnim svete uplne *kazdy* obvod na spolecnem hodinovem signalu
> stavovym automatem...
>
> Prakticky zajimave jsou tedy 2 rozdilne dusledky zpusobu psani v HDL:
> a) co vyjde dobre na cas, popr. spotrebu hradel
> b) co se dobre cte a pise
>
> > Premyslel jsem nad tim to udelat i jako velky posuvny registr a proste
> > to precist najednou ;-)
>
> V a) to pro vetsinu uloh vyjde nevyhodne, velmi brzo pomine i zdanlive b),
> obavam se.
>
>
> ZdraviMP
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20140103/ede9d72f/attachment.html>


Další informace o konferenci Hw-list