Hallo, mein Ziel ist es ein generisches Modul zu schreiben, welches einen multiplier mit einem preadder in eine Struktur abbildet mit so wenig wie möglich dsp slices (konkret im xilinx spartan6) dsp slices haben neben den multipliziereingängen noch pre- und post-add eingänge und diverse andere Leider spuckt mir die Synthese mit dem vorliegenden vhdl code eine struktur mit 2 dsp slices aus. im ersten dsp slice wird addiert und im zweiten multipliziert. hat jemand eine idee wie ich der synthese klarmachen kann, dass sie auch den preadd eingang benutzten soll, ohne das ich den dsp slice direkt instantiieren muss? für jeden tipp bin ich sehr dankbar
1 | entity dsp is |
2 | generic( |
3 | WIDTH_G : integer := 17 |
4 | );
|
5 | Port(clk_i : in std_logic; |
6 | a_i : in unsigned(WIDTH_G - 1 downto 0); |
7 | b_i : in unsigned(WIDTH_G - 1 downto 0); |
8 | d_i : in unsigned(WIDTH_G - 1 downto 0); |
9 | result_o : out unsigned(2 * WIDTH_G - 1 downto 0) |
10 | );
|
11 | attribute USE_DSP48 : string; |
12 | attribute USE_DSP48 of dsp : entity is "YES"; |
13 | end dsp; |
14 | |
15 | architecture syn of dsp is |
16 | signal a_q, b_q, d_q : unsigned(WIDTH_G - 1 downto 0) := (others => '0'); |
17 | signal result : unsigned(2 * WIDTH_G - 1 downto 0) := (others => '0'); |
18 | |
19 | |
20 | begin
|
21 | process(clk_i) |
22 | begin
|
23 | if rising_edge(clk_i) then |
24 | a_q <= a_i; |
25 | b_q <= b_i; |
26 | d_q <= d_i; |
27 | |
28 | result <= a_q * (b_q + d_q) |
29 | end if; |
30 | end process; |
31 | result_o <= result; |
32 | |
33 | end syn; |