Professional Documents
Culture Documents
Đề Bài :
BÀ 1:
1. Mô tả quy trình
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_arith.all;
USE IEEE.std_logic_signed.all;
LIBRARY lpm;
USE lpm.LPM_COMPONENTS.ALL;
ENTITY bai1 IS
Port (CLK,CLK_40n : IN STD_LOGIC:='0';
X1 : IN STD_LOGIC_VECTOR(15 downto 0):=(others =>'0');
A1, A2, A3, A4, A5 : IN STD_LOGIC_VECTOR(15 downto 0):=(others =>'0');
A0: IN STD_LOGIC_VECTOR(31 downto 0):=(others =>'0');
Y : OUT STD_LOGIC_VECTOR(31 downto 0):=(others =>'0')
);
END bai1;
ARCHITECTURE SoP_arch OF bai1 IS
SIGNAL mula,mulb :STD_LOGIC_VECTOR(15 downto 0):=(others=>'0');
SIGNAL mulr :STD_LOGIC_VECTOR(31 downto 0):=(others =>'0');
SIGNAL adda,addb,addr :STD_LOGIC_VECTOR(31 downto 0):=(others =>'0');
SIGNAL CNT :STD_LOGIC_VECTOR(7 downto 0):=(others =>'0');
BEGIN
mull: lpm_mult
generic
map(LPM_WIDTHA=>16,LPM_WIDTHB=>16,LPM_WIDTHS=>16,LPM_WIDTHP=>32,
LPM_REPRESENTATION=>"SIGNED",LPM_PIPELINE=>1)
port map(dataa=> mula,datab=>mulb,clock=> clk,result=> mulr);
adder1: lpm_add_sub
generic map(lpm_width=>32,LPM_REPRESENTATION=>"SIGNED",lpm_pipeline=>1)
port map(dataa=>adda,datab=>addb,clock=> clk,result=>addr);
GEN:block
BEGIN
PROCESS(CLK_40n)
BEGIN
IF CLK_40n'EVENT and CLK_40n='1' THEN
CNT<=CNT+1;
IF CNT=X"00" THEN
mula<=A5;
mulb<=X1;
ELSIF CNT=X"02" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"04" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"06" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"08" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"0A" THEN
adda<=mulr;
mula<=A4;
mulb<=X1;
ELSIF CNT=X"0C" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"0E" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"10" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"12" THEN
addb<=mulr;
mula<=A3;
mulb<=X1;
ELSIF CNT=X"14" THEN
adda<=addr;
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"16" THEN
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"18" THEN
addb<=mulr;
mula<=A2;
mulb<=X1;
ELSIF CNT=X"1A" THEN
adda<=addr;
mula<=mulr(15 downto 0);
mulb<=X1;
ELSIF CNT=X"1C" THEN
addb<=mulr;
mula<=A1;
mulb<=X1;
ELSIF CNT=X"1E" THEN
adda<=addr;
addb<=mulr;
ELSIF CNT=X"20" THEN
adda<=addr;
addb<=A0;
ELSIF CNT=X"22" THEN
Y<=addr;
CNT <=X"00";
END IF;
END IF;
END PROCESS;
END BLOCK GEN;
END SoP_arch;
Giải thích Code :
- Khai báo thư viện :
-
- Thực hiện phép tính A5*(X1)^5
-
- Thực hiện phép tính A3*(X1)^3 và tính tổng A5*(X1)^5 + A4*(X1)^4 + A3*(X1)^3
- Thực hiện phép tính A2*(X1)^2 và tính tổng A5*(X1)^5 + A4*(X1)^4 + A3*(X1)^3 +
A2*(X1)^2
- Thực hiện phép tính A1*X1 và tính tổng A5*(X1)^5 + A4*(X1)^4 + A3*(X1)^3 + A2*(X1)^2 +
A1*X1 + A0. Gán kết quả phép tính tổng cho đầu ra Y và kết thúc chương trình.
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 14 giống với kết quả tính toán.
Vậy phép tính được thực hiện đúng
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 618 giống với kết quả tính toán.
Vậy phép tính được thực hiện đúng
- Với các giá trị đầu vào : A5 = 2, A4 = 3, A3 = -5, A2 = -1, A1 = 12, A0 = -3
- Khi X1 = 4 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=2525
Kết quả mô phỏng là:
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 2525 giống với kết quả tính
toán. Vậy phép tính được thực hiện đúng
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 18393 giống với kết quả tính
toán. Vậy phép tính được thực hiện đúng
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 75293 giống với kết quả tính
toán. Vậy phép tính được thực hiện đúng
- Với các giá trị đầu vào : A5 = 2, A4 = 3, A3 = -5, A2 = -1, A1 = 12, A0 = -3
- Khi X1 = 9 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=134160
Kết quả mô phỏng là:
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 134160 giống với kết quả tính
toán. Vậy phép tính được thực hiện đúng
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 225017 giống với kết quả tính
toán. Vậy phép tính được thực hiện đúng
Bài 2 :
1. Mô tả quy trình :
Với ma trận mũ, ta nhân tuần tự các ma trận với nhau. Quy trình sau thực hiện để
tính các thành phần của ma trận sau mỗi phép nhân, kết quả của phép nhân phía
trước sẻ được tiếp tục dùng để tính ra các kết quả của thành phần của ma trận kết
quả cuối cùng.
2.Code VHDL
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_arith.all;
USE IEEE.std_logic_signed.all;
LIBRARY lpm;
USE lpm.LPM_COMPONENTS.ALL;
ENTITY bai2 IS
Port (
CLK,CLK_40n : IN STD_LOGIC:='0';
N: IN INTEGER ;
A11, A12, A13, A21, A22, A23, A31, A32, A33 : IN STD_LOGIC_VECTOR(31 downto 0):=(others =>'0');
Y11, Y12, Y13, Y21, Y22, Y23, Y31, Y32, Y33 : OUT STD_LOGIC_VECTOR(31 downto 0):=(others =>'0'));
END bai2;
SIGNAL T11, T12, T13, T21, T22, T23, T31, T32, T33 : STD_LOGIC_VECTOR(31 downto 0):=(others =>'0');
SIGNAL NC : INTEGER:=0;
SIGNAL ram11, ram12, ram13, ram21, ram22, ram23, ram31, ram32, ram33 : STD_LOGIC_VECTOR(31
downto 0):=(others =>'0');
BEGIN
mull: lpm_mult
generic
map(LPM_WIDTHA=>32,LPM_WIDTHB=>32,LPM_WIDTHS=>32,LPM_WIDTHP=>64,LPM_REPRESENTA
TION=>"SIGNED",LPM_PIPELINE=>1)
adder1: lpm_add_sub
generic map(lpm_width=>32,LPM_REPRESENTATION=>"SIGNED",lpm_pipeline=>1)
GEN:block
BEGIN
PROCESS(CLK_40n)
BEGIN
CNT<=CNT+1;
IF CNT=X"00" THEN
T11 <= A11; T12 <= A12; T13 <= A13; T21 <= A21; T22 <= A22; T23 <= A23; T31 <= A31; T32 <= A32; T33
<= A33;
adda<=addr;
ram11<=addr;
adda<=addr;
ram12<=addr;
ELSIF CNT=X"15" THEN
adda<=addr;
ram13<=addr;
adda<=addr;
adda<=addr;
ram22<=addr;
adda<=addr;
addb<=mulr(31 downto 0);
ram23<=addr;
adda<=addr;
ram31<=addr;
adda<=addr;
ram32<=addr;
adda<=addr;
ram33<=addr;
NC<=NC+1;
END IF;
END PROCESS;
END SoP_arch;
- Khai báo biến, kiểu dữ liệu của biến và phần kiến trúc. Trong đó N là số mũ, A là các phần tử của ma trận ban
đầu , Y là các phần tử của ma trận mũ N
- Thực hiện tính toán phần tử hàng 1 cột 1 ( ram11) của kết quả phép mũ 2 của ma
trận . Sử dụng biến tạm T để gán các giá tri phần tử ma trận ban đầu.
ram11 = A11*T11+ A12*T21 + A13 * T31
- Tương tự ta tiếp tục tính được các phần tử còn lại của kết quả phép mũ 2 của ma trận
(ram12, ram13, ram21, ram22, ram23, ram31, ram32, ram33)
- Các biến ram sẽ được gán lại vào các biến T và CNT được đặt về lại X”01” để thực hiện
tiếp tục phép mũ 3 của ma trận. Quy trình cứ lặp lại như vậy cho đến khi đạt số mũ N
tương ứng
Nhận xét : Ta thấy sau 37200ns, đầu ra cho ra kết quả Y11, Y12, Y13, Y21, Y22, Y23,
Y31, Y32, Y33 giống với kết quả tính toán với ma trận trên. Vậy phép tính được thực
hiện đúng