Last up date: Monday, 08-Oct-2012 23:12:40 JST

秀和システム「FPGA入門」 正誤表


P.125 図4.13〜図4.16中
誤:SW0
正:PSW0

下記、表5.35〜表5.48までは回路としての誤りはありませんが、UCF(表5.37, 5.38)との対応が取れていません。従って修正量としては、UCFの方をHDL内の信号名に変更する方が少なく簡単ですが、回路図および説明との統一を取るためにHDLの修正内容を記載します。

P.192 表5.35 FA3_VHDL.vhd
誤:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3: use IEEE.std_logic_unsigned.all;
 4:
 5: entity FA3_VHDL is
 6:
 7:     port (
 8:         A  : in std_logic_vector(2 downto 0);
 9:         B  : in std_logic_vector(2 downto 0);
10:         S  : out std_logic_vector(2 downto 0);
11:         CO : out std_logic);
12:
13: end FA3_VHDL;
14:
15: architecture RTL of FA3_VHDL is
16:
17:     signal sum : std_logic_vector(3 downto 0);
18:
19: begin
20:
21:     sum <= ('0' & A) + ('0' & B);
22:     S <= sum(2 downto 0);
23:     CO <= sum(3);
24:
25: end RTL;

正:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3: use IEEE.std_logic_unsigned.all;
 4:
 5: entity FA3_VHDL is
 6:   
 7:    port (
 8:        SW0 : in std_logic;
 9:        SW1 : in std_logic;
10:        SW2 : in std_logic;
11:        SW3 : in std_logic;
12:        SW4 : in std_logic;
13:        SW5 : in std_logic;
14:
15:        LED0 : out std_logic;
16:        LED1 : out std_logic;
17:        LED2 : out std_logic;
18:        LED3 : out std_logic);
19:
20: end FA3_VHDL;
21:
22: architecture RTL of FA3_VHDL is
23:
24: signal a : std_logic_vector(2 downto 0);
25: signal b : std_logic_vector(2 downto 0);
26: signal s : std_logic_vector(3 downto 0);
27:
28: begin
29:
30:    a <= SW2 & SW1 & SW0;
31:    b <= SW5 & SW4 & SW3;
32:    s <= ('0' & a) + ('0' & b);
33:
34:    LED0 <= s(0);
35:    LED1 <= s(1);
36:    LED2 <= s(2);
37:    LED3 <= s(3); -- s(3) is CO
38: 
39: end RTL;
(FA3_VHDL20121003.vhd)

P.193 表5.36 FA3_VERILOG.v
誤:
 1: module FA3_VERILOG(CO, S, A, B);
 2: 
 3:     input [2:0]  A;
 4:     input [2:0]  B;
 5:     output       CO;
 6:     output [2:0] S;
 7: 
 8:     assign {CO, S} = A + B;
 9: 
10: endmodule

正:
 1: module FA3_VERILOG(SW0, SW1, SW2, SW3, SW4, SW5, LED0, LED1, LED2, LED3);
 2:
 3:    input SW0;
 4:    input SW1;
 5:    input SW2;
 6:    input SW3;
 7:    input SW4;
 8:    input SW5;
 9:    output LED0;
10:    output LED1;
11:    output LED2;
12:    output LED3;
13:
14:    assign {LED3, LED2, LED1, LED0} = {SW2, SW1, SW0} + {SW5, SW4, SW3};
15:
16: endmodule
(FA3_VERILOG20121003.v)

P.200 表5.42 FS3_VHDL.vhd
誤:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3: use IEEE.std_logic_unsigned.all;
 4: 
 5: entity FS3_VHDL is
 6:     
 7:     port (
 8:         A  : in  std_logic_vector(2 downto 0);
 9:         B  : in  std_logic_vector(2 downto 0);
10:         BO : out std_logic;
11:         D  : out std_logic_vector(2 downto 0));
12: 
13: end FS3_VHDL;
14: 
15: architecture RTL of FS3_VHDL is
16: 
17:     signal sub : std_logic_vector(3 downto 0);
18: 
19: begin
20: 
21:     sub <= ('0' & A) - ('0' & B);
22:     BO <= sub(3);
23:     D  <= sub(2 downto 0);
24: 
25: end RTL;

正:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3: use IEEE.std_logic_unsigned.all;
 4:
 5: entity FS3_VHDL is
 6:   
 7:    port (
 8:        SW0 : in std_logic;
 9:        SW1 : in std_logic;
10:        SW2 : in std_logic;
11:        SW3 : in std_logic;
12:        SW4 : in std_logic;
13:        SW5 : in std_logic;
14:
15:        LED0 : out std_logic;
16:        LED1 : out std_logic;
17:        LED2 : out std_logic;
18:        LED3 : out std_logic);
19:
20: end FS3_VHDL;
21:
22: architecture RTL of FS3_VHDL is
23:
24:  signal a : std_logic_vector(2 downto 0);
25:  signal b : std_logic_vector(2 downto 0);
26:  signal d : std_logic_vector(3 downto 0);
27:
28: begin
29:
30:    a <= SW2 & SW1 & SW0;
31:    b <= SW5 & SW4 & SW3;
32:    d <= ('0' & a) - ('0' & b);
33:
34:    LED0 <= d(0);
35:    LED1 <= d(1);
36:    LED2 <= d(2);
37:    LED3 <= d(3); -- d(3) is BO
38: 
39: end RTL;
(FS3_VHDL20121004.vhd)

P.201 表5.43 FS3_VERILOG.v
誤:
 1: module FS3_VERILOG(A, B, BO, D);
 2: 
 3:     input [2:0]  A;
 4:     input [2:0]  B;
 5:     output       BO;
 6:     output [2:0] D;
 7: 
 8:     assign {BO, D} = A - B;
 9: 
10: endmodule

正:
 1: module FS3_VERILOG(SW0, SW1, SW2, SW3, SW4, SW5, LED0, LED1, LED2, LED3);
 2:
 3:    input SW0;
 4:    input SW1;
 5:    input SW2;
 6:    input SW3;
 7:    input SW4;
 8:    input SW5;
 9:    output LED0;
10:    output LED1;
11:    output LED2;
12:    output LED3;
13:
14:    assign {LED3, LED2, LED1, LED0} = {SW2, SW1, SW0} - {SW5, SW4, SW3};
15:
16: endmodule
(FS3_VERILOG20121004.v)

P.208 表5.47 FS3_SIGN_VHDL.vhd
誤:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3: use IEEE.std_logic_unsigned.all;
 4: 
 5: entity FS3_SIGN_VHDL is
 6:     
 7:     port (
 8:         A  : in  std_logic_vector(2 downto 0);
 9:         B  : in  std_logic_vector(2 downto 0);
10:         BO : out std_logic;
11:         D  : out std_logic_vector(2 downto 0));
12: 
13: end FS3_SIGN_VHDL;
14: 
15: architecture RTL of FS3_SIGN_VHDL is
16: 
17:     signal sub : std_logic_vector(3 downto 0);
18: 
19: begin
20: 
21:     sub <= ('0' & A) - ('0' & B);
22:     BO  <= sub(3);
23:     D   <= not sub(2 downto 0) + '1' when sub(3) = '1' else
24:            sub(2 downto 0);
25: 
26: end RTL;

正:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3: use IEEE.std_logic_unsigned.all;
 4:
 5: entity FS3_SIGN_VHDL is
 6:   
 7:    port (
 8:        SW0 : in std_logic;
 9:        SW1 : in std_logic;
10:        SW2 : in std_logic;
11:        SW3 : in std_logic;
12:        SW4 : in std_logic;
13:        SW5 : in std_logic;
14:
15:        LED0 : out std_logic;
16:        LED1 : out std_logic;
17:        LED2 : out std_logic;
18:        LED3 : out std_logic);
19:
20: end FS3_SIGN_VHDL;
21:
22: architecture RTL of FS3_SIGN_VHDL is
23:
24:  signal a : std_logic_vector(2 downto 0);
25:  signal b : std_logic_vector(2 downto 0);
26:  signal d : std_logic_vector(2 downto 0);
27:  signal sub : std_logic_vector(3 downto 0);
28:
29: begin
30:
31:    a <= SW2 & SW1 & SW0;
32:    b <= SW5 & SW4 & SW3;
33:    sub <= ('0' & a) - ('0' & b);
34:    d <= not sub(2 downto 0) + '1' when sub(3) = '1' else
35:         sub(2 downto 0);
36:
37:    LED0 <= d(0);
38:    LED1 <= d(1);
39:    LED2 <= d(2);
40:    LED3 <= sub(3); -- sub(3) is BO
41: 
42: end RTL;
(FS3_SIGN_VHDL20121004.vhd)

P.208 表5.48 FS3_SIGN_VERILOG.v
誤:
 1: module FS3_SIGN_VERILOG(A, B, BO, D);
 2: 
 3:     input [2:0]  A;
 4:     input [2:0]  B;
 5:     output       BO;
 6:     output [2:0] D;
 7: 
 8:     wire [3:0]   sub;
 9: 
10:     assign sub = {1'b0, A} - {1'b0, B};
11:     assign BO = sub[3];
12:     assign D = sub[3] ? (~sub[2:0] + 1'b1) : sub[2:0];
13: 
14: endmodule

正:
 1: module FS3_SIGN_VERILOG(SW0, SW1, SW2, SW3, SW4, SW5, LED0, LED1, LED2, LED3);
 2:
 3:    input SW0;
 4:    input SW1;
 5:    input SW2;
 6:    input SW3;
 7:    input SW4;
 8:    input SW5;
 9:    output LED0;
10:    output LED1;
11:    output LED2;
12:    output LED3;
13: 
14:    wire [3:0] sub;
15:
16:    assign sub = {1'b0, SW2, SW1, SW0} - {1'b0, SW5, SW4, SW3};
17:    assign LED3 = sub[3];
18:    assign {LED2, LED1, LED0} = sub[3] ? (~sub[2:0] + 1'b1) : sub[2:0];
19:
20: endmodule
(FS3_SIGN_VERILOG20121004.v)

P.222 表5.57 DFF_VHDL.vhd
誤:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3: 
 4: entity DFF_VHDL is
 5:     
 6:     port (
 7:         SW0   : in  std_logic;
 8:         SW1   : in  std_logic;
 9:         LED0 : out std_logic);
10: 
11: end DFF_VHDL;
12: 
13: architecture RTL of DFF_VHDL is
14: 
15:     signal led0_reg : std_logic;
16: 
17: begin
18: 
19:     process (SW1)
20:     begin
21:         if (SW1'event and SW1 = '1') then
22:             led0_reg <= SW0;
23:         end if;
24:     end process;
25: 
26:     LED0 <= led0_reg;
27:     
28: end RTL;

正:
 1: library IEEE;
 2: use IEEE.std_logic_1164.all;
 3:
 4: library UNISIM;
 5: use UNISIM.vcomponents.all;
 6:
 7: entity DFF_VHDL is
 8:    
 9:    port (
10:        SW0   : in  std_logic;
11:        SW1   : in  std_logic;
12:        LED0 : out std_logic);
13:
14: end DFF_VHDL;
15:
16: architecture RTL of DFF_VHDL is
17:
18:  signal led0_reg : std_logic;
19:  signal clk : std_logic;
20:
21: begin
22:
23:  IBUFG0 : IBUFG
24:  port map (
25:   O => clk,
26:   I => SW1
27:  );
28:
29:    process (clk)
30:    begin
31:        if (clk'event and clk = '1') then
32:            led0_reg <= SW0;
33:        end if;
34:    end process;
35:
36:    LED0 <= led0_reg;
37:    
38: end RTL;
(DFF_VHDL20121002.vhd)

補足: 23行目〜27行目で、IBUFGというXilinxプリミティブを直接呼び出して、SW1入力をIBUFG経由でD-FFのクロック信号(clk)となるように変更しています。これはP.221の回路図、図5.97に示す通りです。IBUFGを追加したことに伴い、内部信号として19行目でclkという信号を追加しています。また、Xilinxプリミティブを使用するためには、4行目〜5行目のlibrary UNISIM; use UNISIM.vcomponents.all; という記述が必要です。


P.222 表5.58 DFF_VERILOG.v
誤:
 1: module DFF_VERILOG(SW0, SW1, LED0);
 2: 
 3:     input  SW0;
 4:     input  SW1;
 5:     output LED0;
 6: 
 7:     reg    LED0;
 8: 
 9:     always @(posedge SW1) begin
10:         LED0 <= SW0;
11:     end
12: 
13: endmodule

正:
 1: module DFF_VERILOG(SW0, SW1, LED0);
 2:
 3:    input  SW0;
 4:    input  SW1;
 5:    output LED0;
 6:
 7:    reg    LED0;
 8:    wire   clk;
 9:
10:    IBUFG IBUFG0(
11:     .O(clk),
12:     .I(SW1)
13:    );
14:
15:    always @(posedge clk) begin
16:        LED0 <= SW0;
17:    end
18:
19: endmodule
(DFF_VERILOG20121002.v)

補足: 前述のVHDLの場合と同様に、10行目〜13行目でIBUFGを呼び出しています。またIBUFG追加に伴い、8行目で内部信号としてclkも追加しています。ただし、VHDLのときのようなライブラリの宣言はありません。


P.229 図5.110 DFF2_SCH.sch
誤:IBUFG
正:IBUF

補足: 図5.110ではD-FFプリミティブを使用しているわけではないため、IBUFGを使用する必要はありません。


P.317 5行目
誤:'S'と'R'が同時に'1'となった場合は不定となりますが図7.47の回路ではこの状態はありません
正:'S'と'R'が同時に'1'となった場合はP.213の表5.51に示す通り、出力Qは'0'となりますが図7.47の回路ではプルダウン入力となっているため、同時に'1'が入力されることはありません
P.324 図7.54
誤:DIFF_TIME_OLD
正:DIFF_TIME_FIXED

補足: 信号DBが反転しています。信号DAはD-FFで1CLK遅れて取り込まれます。従って、信号DBは信号DAが1CLK遅れたものとなります。この信号DBを反転したものと信号DAとのANDを取ったものが信号DCです。
CLK信号に付いている矢印は、その立ち上がりエッジでイベントが発生していることを示しています。「誤」の方では3つ目の立ち上がりエッジにも矢印が付いていましたが、このタイミングでは信号DA〜DCに変化は起こらないので削除しました。
また、信号DAは入力信号ですが、これはCLKの立ち上がりエッジに掛からないタイミングで変化することが前提です(詳細はP.231「セットアップ時間とホールド時間」を参照のこと)。完全同期式回路内であれば、入力信号DAは同じCLK信号で変化するフリップ・フロップの出力となるため、変化点は図のようにCLK信号の立ち上がりエッジの直後となります。


P.532 4行目
誤:「8dに加算して、8dの桁が一つ上がる最小の数」なので3dです。
正:「8dに加算して、8dの桁が一つ上がる最小の数」なので2dです。

P.532 下から8行目
誤:Comp_OLD
正:Comp_FIX

補足: ここでは2進数の一般式を挙げずに、単に 「2進数1011の1の補数」は各桁の値を反転して「0100b」(通常は頭の'0'は省略)となります。 とした方がわかり易かったかもしれません。