You are on page 1of 23

BÀI TẬP FPGA VÀ VHDL

Đề Bài :
BÀ 1:
1. Mô tả quy trình

Sơ đồ quy trình bài toán


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 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 :

- Khai báo biến và kiểu dữ liệu của biến


- Khai báo Kiến trúc

-
- Thực hiện phép tính A5*(X1)^5

- Thực hiện phép tính A4*(X1)^4 và tính tổng A5*(X1)^5 + A4*(X1)^4

-
- 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.

3. Kết quả và nhận xét


- Với các giá trị đầu vào : A5 = 2, A4 = 3, A3 = -5, A2 = -1, A1 = 12, A0 = -3
- Khi X1 = 1 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=14

Kết quả mô phỏng là:

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

- Với các giá trị đầu vào : A5 = 2, A4 = 3, A3 = -5, A2 = -1, A1 = 12, A0 = -3


- Khi X1 = 2 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=89
Kết quả mô phỏng là:
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 89 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 = 3 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=618
Kết quả mô phỏng là:

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

- Với các giá trị đầu vào : A5 = 2, A4 = 3, A3 = -5, A2 = -1, A1 = 12, A0 = -3


- Khi X1 = 5 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=7532
Kết quả mô phỏng là:
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 7532 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 = 6 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=18393
Kết quả mô phỏng là:

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

- Với các giá trị đầu vào : A5 = 2, A4 = 3, A3 = -5, A2 = -1, A1 = 12, A0 = -3


- Khi X1 = 7 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=39134
Kết quả mô phỏng là:
Nhận xét : Ta thấy sau 3400ns, đầu ra cho ra kết quả Y = 39134 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 = 8 => kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=75293
Kết quả mô phỏng là:

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

- Với các giá trị đầu vào : A5 = 2, A4 = 3, A3 = -5, A2 = -1, A1 = 12, A0 = -3


- Khi X1 = 10=> kết quả phép tính : y = A5*X15 + A4*X14 + A3*X13 + A2*X12 + A1*X1 + A0
=225017
Kết quả mô phỏng là:

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;

ARCHITECTURE SoP_arch OF bai2 IS

SIGNAL mula,mulb :STD_LOGIC_VECTOR(31 downto 0):=(others=>'0');

SIGNAL mulr :STD_LOGIC_VECTOR(63 downto 0):=(others =>'0');

SIGNAL adda,addb,addr :STD_LOGIC_VECTOR(31 downto 0):=(others =>'0');

SIGNAL T11, T12, T13, T21, T22, T23, T31, T32, T33 : STD_LOGIC_VECTOR(31 downto 0):=(others =>'0');

SIGNAL CNT :STD_LOGIC_VECTOR(7 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)

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

T11 <= A11; T12 <= A12; T13 <= A13; T21 <= A21; T22 <= A22; T23 <= A23; T31 <= A31; T32 <= A32; T33
<= A33;

ELSIF CNT=X"01" THEN

mula <= A11;


mulb <= T11;

ELSIF CNT=X"03" THEN

adda <= mulr(31 downto 0);

mula <= A12;

mulb <= T21;

ELSIF CNT=X"05" THEN

addb <= mulr(31 downto 0);

mula <= A13;

mulb <= T31;

ELSIF CNT=X"07" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"09" THEN

ram11<=addr;

ELSIF CNT=X"0B" THEN

mula <= A11;

mulb <= T12;

ELSIF CNT=X"0D" THEN

adda <= mulr(31 downto 0);

mula <= A12;

mulb <= T22;

ELSIF CNT=X"0F" THEN

addb <= mulr(31 downto 0);

mula <= A13;

mulb <= T32;

ELSIF CNT=X"11" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"13" THEN

ram12<=addr;
ELSIF CNT=X"15" THEN

mula <= A11;

mulb <= T13;

ELSIF CNT=X"17" THEN

adda <= mulr(31 downto 0);

mula <= A12;

mulb <= T23;

ELSIF CNT=X"19" THEN

addb <= mulr(31 downto 0);

mula <= A13;

mulb <= T33;

ELSIF CNT=X"1B" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"1D" THEN

ram13<=addr;

ELSIF CNT=X"1F" THEN

mula <= A21;

mulb <= T11;

ELSIF CNT=X"21" THEN

adda <= mulr(31 downto 0);

mula <= A22;

mulb <= T21;

ELSIF CNT=X"23" THEN

addb <= mulr(31 downto 0);

mula <= A23;

mulb <= T31;

ELSIF CNT=X"25" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"27" THEN


ram21<=addr;

ELSIF CNT=X"29" THEN

mula <= A21;

mulb <= T12;

ELSIF CNT=X"2B" THEN

adda <= mulr(31 downto 0);

mula <= A22;

mulb <= T22;

ELSIF CNT=X"2D" THEN

addb <= mulr(31 downto 0);

mula <= A23;

mulb <= T32;

ELSIF CNT=X"2F" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"31" THEN

ram22<=addr;

ELSIF CNT=X"33" THEN

mula <= A21;

mulb <= T13;

ELSIF CNT=X"35" THEN

adda <= mulr(31 downto 0);

mula <= A22;

mulb <= T23;

ELSIF CNT=X"37" THEN

addb <= mulr(31 downto 0);

mula <= A23;

mulb <= T33;

ELSIF CNT=X"39" THEN

adda<=addr;
addb<=mulr(31 downto 0);

ELSIF CNT=X"3B" THEN

ram23<=addr;

ELSIF CNT=X"3D" THEN

mula <= A31;

mulb <= T11;

ELSIF CNT=X"3F" THEN

adda <= mulr(31 downto 0);

mula <= A32;

mulb <= T21;

ELSIF CNT=X"41" THEN

addb <= mulr(31 downto 0);

mula <= A33;

mulb <= T31;

ELSIF CNT=X"43" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"45" THEN

ram31<=addr;

ELSIF CNT=X"47" THEN

mula <= A31;

mulb <= T12;

ELSIF CNT=X"49" THEN

adda <= mulr(31 downto 0);

mula <= A32;

mulb <= T22;

ELSIF CNT=X"4B" THEN

addb <= mulr(31 downto 0);

mula <= A33;


mulb <= T32;

ELSIF CNT=X"4D" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"4F" THEN

ram32<=addr;

ELSIF CNT=X"51" THEN

mula <= A31;

mulb <= T13;

ELSIF CNT=X"53" THEN

adda <= mulr(31 downto 0);

mula <= A32;

mulb <= T23;

ELSIF CNT=X"55" THEN

addb <= mulr(31 downto 0);

mula <= A33;

mulb <= T33;

ELSIF CNT=X"57" THEN

adda<=addr;

addb<=mulr(31 downto 0);

ELSIF CNT=X"59" THEN

ram33<=addr;

ELSIF CNT=X"5B" THEN

T11<=ram11; T12<=ram12; T13<=ram13; T21<=ram21; T22<=ram22; T23<=ram23; T31<=ram31;


T32<=ram32; T33<=ram33;

NC<=NC+1;

ELSIF CNT=X"5D" THEN

IF NC<(N-1) THEN CNT<=X"01";

ELSE Y11<=ram11; Y12<=ram12; Y13<=ram13; Y21<=ram21; Y22<=ram22; Y23<=ram23; Y31<=ram31;


Y32<=ram32; Y33<=ram33;CNT<=X"00"; END IF;
END IF;

END IF;

END PROCESS;

END BLOCK GEN;

END SoP_arch;

Giải thích code :


- Khai báo thư viện :

- 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

3.Kết quả và nhận xét :


Ta tính được kết quả của ma trận mũ n=5
Kết quả mô phỏng là:

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

You might also like