CAD 宿題3 クリップ・ラウンド乗算器

CAD 宿題 3
クリップ・ラウンド乗算器
035740F 根保光秀
1
MULT の処理のクリップ部の
if (var vrnd(9 downto 7) /= (var vrnd(9)&var vrnd(9)&var vrnd(9)))
then
var vovflo := (7=>var vrnd(9),others=>(not var vrnd(9)));
end if;
のコードを削除した場合、どのような問題点が生じているか説明
し、それが生じている scirocco シミュレーション波形を示せ。
• scirocco の正常動作波形
図 1: 問題点 scirocco 動作波形
• 問題点の説明
クリップ部の処理を消去しているので、上図のように (-1.0)*(-1.0) の乗算の結果が-1 になっ
てしまい、正常に動作していない。
2 前回やった、16ポイント平均回路と、今回の乗算器を用い
て、信号パワーを16ポイント平均する回路を設計せよ。以下を
提出せよ。
• 信号入力は < 8, 0, t > であるとして、おおよその信号の平均パワーはいくらか?実数で答え
よ。
図 2 の scirocco 波形から REALAVGOUT の値は 0.5 と 0.49 の間を交互に出力しているので
おおよその信号の平均パワーは 0.5 である。
1
• scirocco の正常動作波形
図 2: scirocco 動作波形
• なるべくサイクル時間が小さくなるように合成した回路の、回路図、面積レポート、最小サ
イクル時間
図 3: 回路図
表 1: レポート
Combinational Area
2545
NonCombinational Area
952
Total Cell Area
3497
clock CLK (rise edge)
16.00
data arrival time
15.20
次ページに VHDL 記述を示す。
2
¶
VHDL 記述 : テストベンチ
³
1 library STD, IEEE;
2 use STD.TEXTIO.all;
3 use IEEE.std logic 1164.all;
4 use IEEE.std logic textio.all;
5 use IEEE.std logic arith.all;
6
7 entity TESTBENCH MULT is
8 end TESTBENCH MULT;
9
10 architecture SIM DATA of TESTBENCH MULT is
11
12 component MULT
13 port(CLK : in std logic;
14 in1 : in std logic vector(7 downto 0);
15 in2 : in std logic vector(7 downto 0);
16 outp : out std logic vector(7 downto 0);
17 AVGOUT : out std logic vector(7 downto 0));
18 end component;
19
20 signal FMINPUT : std logic vector(7 downto 0); – <8,0,t>
21 signal MULTOUT : std logic vector(7 downto 0); – <8,0,t>
22
23 signal FMINPUT I : integer;
24 signal FMINPUT R : real;
25 signal FMINPUT R2 : real;
26 signal MULTOUT I : integer;
27 signal MULTOUT R : real;
28 signal MULTOUT R2 : real;
29 signal REALAVGOUT : real;
30
31 signal AVGOUT : std logic vector(7 downto 0);
32 signal CLK : std logic := ’0’;
33
34 begin
35
36 – Sysetem CLK generation
37 CLK <= not CLK after 5 ns;
38
39 – DUT
40 U1: MULT port map (CLK,FMINPUT, FMINPUT, MULTOUT,AVGOUT);
41
42 – TEST VECTOR
43 P1: process
44 file TEST IN : text is in ”fm.txt”;
45 variable LINE IN : line;
46 variable V FMINPUT : std logic vector(7 downto 0);
47 begin
48 readline(TEST IN, LINE IN);
49 read(LINE IN, V FMINPUT);
50 FMINPUT <= V FMINPUT;
51 wait for 10 ns;
52 if endfile(TEST IN) then
53 wait;
54 end if;
55 end process;
56
57 FMINPUT I <= CONV INTEGER(signed(FMINPUT)) ;
58 FMINPUT R <= real(FMINPUT I) /128.0;
59 FMINPUT R2<= real(CONV INTEGER(signed(FMINPUT))) /128.0;
60 MULTOUT I <= CONV INTEGER(signed(MULTOUT)) ;
61 MULTOUT R <= real(MULTOUT I) /128.0;
62 MULTOUT R2<= real(CONV INTEGER(signed(MULTOUT))) /128.0;
63 REALAVGOUT<= real(CONV INTEGER(signed(AVGOUT)))/128.0;
64
65 end SIM DATA;
66
67 configuration CFG MULT of TESTBENCH MULT is
68 for SIM DATA
69 end for;
70 end CFG MULT;
µ
´
3
¶
VHDL 記述 : mult.vhd
³
1 library IEEE;
2 use IEEE.STD LOGIC 1164.all;
3 use IEEE.STD LOGIC ARITH.all;
4
5 entity MULT is
6 port(CLK : in std logic;
7 in1 : in std logic vector(7 downto 0);
8 in2 : in std logic vector(7 downto 0);
9 outp : out std logic vector(7 downto 0);
10 AVGOUT : out std logic vector(7 downto 0));
11 end MULT;
12
13 architecture RTL of MULT is
14 –subtype JK is std logic vector(7 to 0);
15 –type F is array ( 0 to 15 ) of JK;
16 –signal FF : F;
17 signal FF1, FF2, FF3, FF4,FF5,FF6,FF7,FF8,FF9,FF10,FF11,FF12,FF13,FF14,FF15,FF16 : std logic vector(7
downto 0);
18 signal SUM : std logic vector(11 downto 0);
19 begin
20
21 – SIGNED CLIP ROUND MULTIPLIER
22 – in1 <8,0,t>
23 – in2 <8,0,t>
24 – outp <8,0,t>
25 MULT : process(in1,in2,CLK)
26 variable var outp : std logic vector(7 downto 0); – <8,0,t>
27 variable var tprod : std logic vector(15 downto 0); – <16,1,t> 28 variable var vtrun : std logic vector(8 downto
0); – <9,1,t>
29 variable var rndbit : std logic; – <1,1,u>
30 variable var vext : std logic vector(9 downto 0); – <10,2,t>
31 variable var vext 1 : std logic vector(9 downto 0); – <10,2,t>
32 variable var tinc : std logic vector(9 downto 0); – <10,2,t>
33 variable var vrnd : std logic vector(9 downto 0); – <10,2,t>
34 variable var vovflo : std logic vector(7 downto 0); – <8,0,t>
35 begin
36 var tprod := signed(in1) * signed(in2);
37 var vtrun := var tprod(15 downto 7);
38 – ROUND
39 var rndbit := ’0’;
40 if (var tprod(6) = ’1’) then
41 var rndbit := ’1’;
42 end if;
43 var vext := var vtrun(8) & var vtrun;
44 var vext 1 := var vtrun(8) & var vtrun;
45 var tinc := signed(var vext 1) + ’1’;
46 if (var rndbit = ’1’) then
47 var vrnd := var tinc;
48 else
49 var vrnd := var vext;
50 end if;
51 – CLIP (IF OVERFLOW then take MAXVALUE)
52 – (IF UNDERFLOW then take MINVALUE)
53 var vovflo := var vrnd(7 downto 0);
54 if (var vrnd(9 downto 7) /= (var vrnd(9)&var vrnd(9)&var vrnd(9))) then
55 var vovflo := (7=>var vrnd(9),others=>(not var vrnd(9)));
56 end if;
57
58 –平均を求める
59 if (CLK’event and CLK = ’1’) then
60 FF1 <= var vovflo;
61 FF2 <= FF1;
62 FF3 <= FF2;
63 FF4 <= FF3;
64 FF5 <= FF4;
65 FF6 <= FF5;
66 FF7 <= FF6;
67 FF8 <= FF7;
68 FF9 <= FF8;
69 FF10 <= FF9;
70 FF11 <= FF10;
71 FF12 <= FF11;
72 FF13 <= FF12;
73 FF14 <= FF13;
74 FF15 <= FF14;
75 FF16 <= FF15;
76 end if;
77
78 – generate output
79 var outp := var vovflo;
80 outp <= var outp;
81 end process MULT;
82
83 SUM <= signed(FF1(7)&FF1(7)&FF1(7)&FF1(7)&FF1)+signed(FF2(7)&FF2(7)&FF2(7)&FF2(7)&FF2)
84 +signed(FF3(7)&FF3(7)&FF3(7)&FF3(7)&FF3)+signed(FF4(7)&FF4(7)&FF4(7)&FF4(7)&FF4)
85 +signed(FF5(7)&FF5(7)&FF5(7)&FF5(7)&FF5)+signed(FF6(7)&FF6(7)&FF6(7)&FF6(7)&FF6)
86 +signed(FF7(7)&FF7(7)&FF7(7)&FF7(7)&FF7)+signed(FF8(7)&FF8(7)&FF8(7)&FF8(7)&FF8)
87 +signed(FF9(7)&FF9(7)&FF9(7)&FF9(7)&FF9)+signed(FF10(7)&FF10(7)&FF10(7)&FF10(7)&FF10)
88 +signed(FF11(7)&FF11(7)&FF11(7)&FF11(7)&FF11)+signed(FF12(7)&FF12(7)&FF12(7)&FF12(7)&FF12)
89 +signed(FF13(7)&FF13(7)&FF13(7)&FF13(7)&FF13)+signed(FF14(7)&FF14(7)&FF14(7)&FF14(7)&FF14)
90 +signed(FF15(7)&FF15(7)&FF15(7)&FF15(7)&FF15)+signed(FF16(7)&FF16(7)&FF16(7)&FF16(7)&FF16);
91
92 process(CLK) begin
93 if (CLK’event and CLK=’1’) then
94 AVGOUT <= SUM(11 downto 4);
95 end if;
96 end process;
97 end RTL;
µ
´
4