Project:
Thiết kế mạch nhân: nhân 2 số 8 bit có dấu cho kết quả 16-bit
Số âm được biểu diễn ở dạng bù 2
Phương pháp:
+ Lấy bù 1 của số nhân và số bị nhân nếu chúng là số âm
+ Nhân 2 số dương và lấy bù của tích nếu cần thiết
Pre-laboratory:
Trước đó mình đã có làm qua về thiết kế mạch nhân, nhưng chỉ dùng 2 số ko dấu 4-bit- dùng phương pháp dịch và cộng. Nay chuyển sang dùng có dấu thì bị vấn đề trong việc chuyển đổi bù 2, làm sao phân biệt số nhân và số bị nhân trong trường hợp nó âm. Bởi vì có đến 4 trường hợp để mà xét, mình chỉ mới học VHDL nên kĩ thuật lập trình còn ‘non’, nên không thể trình bày ý tưởng bằng lập trình, mong anh em giúp đỡ.
Last project: Thiết kế mạch nhân 2 số 4-bit không dấu
Diagram như sau: (do thầy đưa) – mình cũng băn khoăn chỗ này, thường thường phương pháp dịch bit và cộng thì mình phải dịch trái, sao đằng này lại dịch phải
Trong đó:
Ad – Add signal // ngõ ra của bộ 4-bit Adder được lưu trữ trong ACC (Accumulator)
Sh – Shift signal // shift 9-bit ACC sang bên phải (mình còn thắc mắc tại sao chỗ này ông thầy lại dùng 9 bit mà không phải 8-bit, 4-bit x 4-bit product phải 8-bit mới đúng)
Ld – Load signal // load số bị nhân (multiplier) vào 4-bit thấp của bộ ACC và clear 5-bit trên
State Diagram:
FSM:
Trong đó:
M là bit 0 của ACC (thông qua việc kiểm tra bit cuối của ACC mà ta tiến hành dịch bit hay là cộng)
CODE VHDL:
Anh em có thể giúp mình ý tưởng phép nhân có dấu được không?
Mới được bổ sung thêm cái block diagram
Thiết kế mạch nhân: nhân 2 số 8 bit có dấu cho kết quả 16-bit
Số âm được biểu diễn ở dạng bù 2
Phương pháp:
+ Lấy bù 1 của số nhân và số bị nhân nếu chúng là số âm
+ Nhân 2 số dương và lấy bù của tích nếu cần thiết
Pre-laboratory:
Trước đó mình đã có làm qua về thiết kế mạch nhân, nhưng chỉ dùng 2 số ko dấu 4-bit- dùng phương pháp dịch và cộng. Nay chuyển sang dùng có dấu thì bị vấn đề trong việc chuyển đổi bù 2, làm sao phân biệt số nhân và số bị nhân trong trường hợp nó âm. Bởi vì có đến 4 trường hợp để mà xét, mình chỉ mới học VHDL nên kĩ thuật lập trình còn ‘non’, nên không thể trình bày ý tưởng bằng lập trình, mong anh em giúp đỡ.
Last project: Thiết kế mạch nhân 2 số 4-bit không dấu
Diagram như sau: (do thầy đưa) – mình cũng băn khoăn chỗ này, thường thường phương pháp dịch bit và cộng thì mình phải dịch trái, sao đằng này lại dịch phải
Trong đó:
Ad – Add signal // ngõ ra của bộ 4-bit Adder được lưu trữ trong ACC (Accumulator)
Sh – Shift signal // shift 9-bit ACC sang bên phải (mình còn thắc mắc tại sao chỗ này ông thầy lại dùng 9 bit mà không phải 8-bit, 4-bit x 4-bit product phải 8-bit mới đúng)
Ld – Load signal // load số bị nhân (multiplier) vào 4-bit thấp của bộ ACC và clear 5-bit trên
State Diagram:
FSM:
Trong đó:
M là bit 0 của ACC (thông qua việc kiểm tra bit cuối của ACC mà ta tiến hành dịch bit hay là cộng)
CODE VHDL:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_bit.all;
entity mult4X4 is
port (Clk, St : in std_logic;
Mplier,Mcand : in std_logic_vector(3 downto 0);
Done : out std_logic;
result : out std_logic_vector(7 downto 0));
end mult4X4;
architecture behave1 of mult4X4 is
signal State : integer range 0 to 9;
signal ACC : std_logic_vector(8 downto 0); --accumulator
alias M : std_logic is ACC(0); --M la bit 0 cua ACC
begin
process
begin
wait until Clk = '1'; --thuc hien o canh len cua xung clk
case State is
when 0=> --State ban dau
if St='1' then
ACC(8 downto 4) <= "00000"; --clear 5-bit tren cua ACC
ACC(3 downto 0) <= Mplier; --load multiplier vao 4-bit duoi ACC
State <= 1;
end if;
when 1 | 3 | 5 | 7 => --"add/shift" State
if M = '1' then --Add multiplicand
ACC(8 downto 4) <= ('0'&ACC(7 downto 4)) + ('0'&Mcand);
State <= State+1;
else
ACC <= '0' & ACC(8 downto 1); --Shift ACC sang ben phai
State <= State + 2;
end if;
when 2 | 4 | 6 | 8 => --"shift" State
ACC <= '0' & ACC(8 downto 1); --shift sang bên ph?i
State <= State + 1;
when 9 =>
State <= 0;
end case;
end process;
Done <= '1' when State = 9 else '0';
result <= ACC (7 downto 0) when state = 9 else "00000000";
end behave1;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_bit.all;
entity mult4X4 is
port (Clk, St : in std_logic;
Mplier,Mcand : in std_logic_vector(3 downto 0);
Done : out std_logic;
result : out std_logic_vector(7 downto 0));
end mult4X4;
architecture behave1 of mult4X4 is
signal State : integer range 0 to 9;
signal ACC : std_logic_vector(8 downto 0); --accumulator
alias M : std_logic is ACC(0); --M la bit 0 cua ACC
begin
process
begin
wait until Clk = '1'; --thuc hien o canh len cua xung clk
case State is
when 0=> --State ban dau
if St='1' then
ACC(8 downto 4) <= "00000"; --clear 5-bit tren cua ACC
ACC(3 downto 0) <= Mplier; --load multiplier vao 4-bit duoi ACC
State <= 1;
end if;
when 1 | 3 | 5 | 7 => --"add/shift" State
if M = '1' then --Add multiplicand
ACC(8 downto 4) <= ('0'&ACC(7 downto 4)) + ('0'&Mcand);
State <= State+1;
else
ACC <= '0' & ACC(8 downto 1); --Shift ACC sang ben phai
State <= State + 2;
end if;
when 2 | 4 | 6 | 8 => --"shift" State
ACC <= '0' & ACC(8 downto 1); --shift sang bên ph?i
State <= State + 1;
when 9 =>
State <= 0;
end case;
end process;
Done <= '1' when State = 9 else '0';
result <= ACC (7 downto 0) when state = 9 else "00000000";
end behave1;
Mới được bổ sung thêm cái block diagram
Comment