Hallo, hier hatte ja vor kurzen jemand eine Hausaufgabe geposted.
Dieser Thread wurde aber leider gelöscht (eventuell weil er Geld dafür
wollte?)
Da ich schon länger nichts mehr in VHDL gemacht hatte und mal wieder
Lust drauf hatte hab ich mal angefangen das zu bearbeiten.
Ich habe zu dieser Aufgabe 1 mal eine Teillösung geschrieben. Leider
habe ich jetzt die Aufgabe nicht mehr.
Aber Sie besagte ungefähr, dass man ein "FlipFlop" mit delay schreiben
sollte.
Vielleicht erinnert sich noch jemand daran. Oder der Poster liest hier
noch und könnte wenigstens die Aufgabe nochmal posten.
Mich hätte interessiert, wie ihr die seltsamen Delay Wünsche umgesetzt
hättet.
Man sollte ein Delay von 80 ps und eine clockrate von 336? ps machen.
Wenn man die clockrate nicht künstlich runtersetzt, sondern nur das
delay beachtet hätte meine Lösung bis jetzt so ausgesehen:
1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 | entity aufgabe1 is
|
6 | generic(
|
7 | TCO : integer := 8;
|
8 | N : integer := 32
|
9 | );
|
10 | port(
|
11 | clk : in std_logic;
|
12 |
|
13 | ld : in std_logic;
|
14 | clr : in std_logic;
|
15 | din : in std_logic_vector(N-1 downto 0);
|
16 |
|
17 | dout : out std_logic_vector(N-1 downto 0)
|
18 | );
|
19 | end aufgabe1;
|
20 |
|
21 | architecture behavior of aufgabe1 is
|
22 |
|
23 | type DIN_TYPE is array (0 to TCO-1) of std_logic_vector(N-1 downto 0);
|
24 |
|
25 | type register_file is record
|
26 | din : DIN_TYPE;
|
27 | counter : integer range 0 to TCO;
|
28 | end record;
|
29 |
|
30 | signal r : register_file;
|
31 | signal rin : register_file := ((others => (others => '0')), 0);
|
32 |
|
33 | begin
|
34 |
|
35 | comb: process(r, ld, clr, din)
|
36 | variable v : register_file;
|
37 | begin
|
38 | v := r;
|
39 |
|
40 | -- increase counter
|
41 | if (v.counter < TCO-1) then
|
42 | v.counter := v.counter + 1;
|
43 | else
|
44 | v.counter := 0;
|
45 | end if;
|
46 |
|
47 | -- read in
|
48 | if (clr = '0') then
|
49 | if (ld = '1') then
|
50 | v.din(v.counter) := din;
|
51 | else
|
52 | v.din(v.counter) := (others => '0');
|
53 | end if;
|
54 | else
|
55 | dout <= (others => '0');
|
56 | end if;
|
57 |
|
58 | -- output
|
59 | if (v.counter >= TCO-1) then
|
60 | dout <= v.din(0);
|
61 | else
|
62 | dout <= v.din(v.counter + 1);
|
63 | end if;
|
64 |
|
65 | rin <= v;
|
66 |
|
67 | end process;
|
68 |
|
69 | regs : process(clk)
|
70 | begin
|
71 | if rising_edge(clk) then
|
72 | r <= rin;
|
73 | end if;
|
74 | end process;
|
75 |
|
76 | end architecture;
|