You are on page 1of 15

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA ĐIỆN

CÔNG NGHỆ FPGA VÀ NGÔN NGỮ VHDL

NGÀNH: KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HOÁ

ĐỀ TÀI:
BÀI TẬP GIỮA KÌ

Giảng viên hướng dẫn: TS. Nguyễn Khánh Quang

Đà Nẵng, tháng 3/2022


I. Yêu cầu cần đạt:
- Hoàn thành 2 bài tập đã giao.
- Biết, hiểu và vận dụng về cách lập trình ngôn ngữ VHDL với hai bộ cộng và nhân.
- Biết cách mô phỏng sau khi lập trình.
- Nhận xét sơ đồ mô phỏng.
II. Các bước hoàn thành bài tập
1. Phân tích đề:

- Thông qua đề bài, ta nhận định được sẽ dùng 2 chương trình cơ bản của 2 bộ logic là
bộ cộng (add) và bộ nhân (multiplier).
- Đối với bài 1, ta sẽ dùng phương pháp tính toán tuần tự các bước.
- Đối với bài 2, ta sẽ dùng phương pháp …
2. Bài 1
2.1. Phân tích yêu cầu
- Đối với bài 1, ta xác định có 2 phép tính cần phải thực hiện là phép nhân bao gồm 2
phần:
Các biến ‘’a’’ nhân ‘’x’’
Các biến ‘’x’’ nhân nhau
- Với các phép biến đổi tuần tự ta lập bảng xử lí tuần tự như sau:

2.2. VHDL code

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 step IS
port(
CLK, CLK_40n: IN STD_LOGIC;
x: IN STD_LOGIC_VECTOR (7 downto 0);
y: OUT STD_LOGIC_VECTOR (31 downto 0));
end step;

ARCHITECTURE step_arch OF step IS


SIGNAL A0, A1, A2, A3, A4, A5: STD_LOGIC_VECTOR (7 downto 0);
SIGNAL mula, mulb: STD_LOGIC_VECTOR (15 downto 0);
SIGNAL mulr: STD_LOGIC_VECTOR (31 downto 0);
SIGNAL adda, addb, addr: STD_LOGIC_VECTOR (31 downto 0);
SIGNAL CNT: STD_LOGIC_VECTOR (7 downto 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 <= x;
ELSIF CNT = X"01" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"02" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"03" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"04" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"05" THEN
adda <= mulr;
mula <= A4;
mulb <= x;
ELSIF CNT = X"06" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"07" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"08" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"09" THEN
addb <= mulr;
mula <= A3;
mulb <= x;
ELSIF CNT = X"0A" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"0B" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"0C" THEN
adda <= addr;
addb <= mulr;
mula <= A2;
mulb <= x;
ELSIF CNT = X"0D" THEN
mula <= mulr;
mulb <= x;
ELSIF CNT = X"0E" THEN
adda <= addr;
addb <= mulr;
mula <= A1;
mulb <= x;
ELSIF CNT = X"0F" THEN
adda <= addr;
addb <= mulr;
ELSIF CNT = X"10" THEN
adda <= addr;
addb <= A0;
ELSIF CNT = X"11" THEN
y <= addr;
CNT <= X"00";
END IF;
END IF;
END PROCESS;
END block GEN;
END step_arch;
2.3. Giải mã code
- Khai báo thư viện:

- Khai báo các biến:

+ Với các biến x,y, A0-5 là 32 bit để thực hiện các phép nhân ko bị tràn dữ liệu khi
hiển thị
+ Các cổng nhân đầu vào mula, mulb đặt giá trị 32 bit, và đầu ra mulr 64 bit
+ Các cổng cộng đầu vào và ra khai báo 32 bit.
- Gán các giá trị xung:

- Thực hiện tuần tự các phép toán


+ Ở phép toán 1: ta thực hiện phép nhân A5 và x => A5x
+ Ở phép toán 2: ta thực hiện phép nhân A5x và x => A5x2

+ Ở các phép toán sau, tương tự như vậy nhân giá trị x vào A5 để có A5x5
+ Ở phép toán thứ 5, ta thực hiện 2 phép toán: Phép nhân A4 với x và phép toán
cộng với A5x5

- Các phép toán còn lại làm tương tự để đạt được giá trị cuối.

2.4. Kết quả mô phỏng:


- Với giá trị a5 = 2, a4 = 3, a3 = -5, a2 = -1, a1 = 18, a0 = -3
- Khi x = 1 => y = 14, kết quả mô phỏng là:

- Khi x= 2 => y = 101, kết quả mô phỏng là:


2.4. Nhận xét
- Sau khi tính tuần tự 18 bước, với mỗi bước là 20 ns thì sau khoảng 360 ns đã cho ra kết
quả ‘’y’’.
- Với kết quả y của mô phỏng bằng với kết quả tính toán bằng tay, chương trình hoạt
động ổn
3. Bài 2
3.1. Phân tích yêu cầu
- Với ma trận mũ, ta nhân tuần tự các ma trận với nhau. Chẳng hạn ma trận mũ A2 thì ta
sẽ làm phép nhân 2 ma trận, sau đó lấy kết quả nhân với ma trận A một lần nữa để có ma
trận A3 .
- Ta lập được bảng tuần tự sau:
3.2. VHDL code
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 bai2giuakipro IS
Port (
CLK,CLK_40n : IN STD_LOGIC:='0';
N: IN STD_LOGIC_VECTOR(7 downto 0);
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 bai2giuakipro;
ARCHITECTURE bai2giuakipro_arch OF bai2giuakipro 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,NC :STD_LOGIC_VECTOR(7 downto 0):=(others =>'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_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
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"02" THEN
adda <= mulr(31 downto 0);
mula <= A12;
mulb <= T21;
ELSIF CNT=X"03" THEN
addb <= mulr(31 downto 0);
mula <= A13;
mulb <= T31;
ELSIF CNT=X"04" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"05" THEN
ram11<=addr;
ELSIF CNT=X"06" THEN
mula <= A11;
mulb <= T12;
ELSIF CNT=X"07" THEN
adda <= mulr(31 downto 0);
mula <= A12;
mulb <= T22;
ELSIF CNT=X"08" THEN
addb <= mulr(31 downto 0);
mula <= A13;
mulb <= T32;
ELSIF CNT=X"09" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"0A" THEN
ram12<=addr;
ELSIF CNT=X"0B" THEN
mula <= A11;
mulb <= T13;
ELSIF CNT=X"0C" THEN
adda <= mulr(31 downto 0);
mula <= A12;
mulb <= T23;
ELSIF CNT=X"0D" THEN
addb <= mulr(31 downto 0);
mula <= A13;
mulb <= T33;
ELSIF CNT=X"0E" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"0F" THEN
ram13<=addr;
ELSIF CNT=X"10" THEN
mula <= A21;
mulb <= T11;
ELSIF CNT=X"11" THEN
adda <= mulr(31 downto 0);
mula <= A22;
mulb <= T21;
ELSIF CNT=X"12" THEN
addb <= mulr(31 downto 0);
mula <= A23;
mulb <= T31;
ELSIF CNT=X"13" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"14" THEN
ram21<=addr;
ELSIF CNT=X"15" THEN
mula <= A21;
mulb <= T12;
ELSIF CNT=X"16" THEN
adda <= mulr(31 downto 0);
mula <= A22;
mulb <= T22;
ELSIF CNT=X"17" THEN
addb <= mulr(31 downto 0);
mula <= A23;
mulb <= T32;
ELSIF CNT=X"18" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"19" THEN
ram22<=addr;
ELSIF CNT=X"1A" THEN
mula <= A21;
mulb <= T13;
ELSIF CNT=X"1B" THEN
adda <= mulr(31 downto 0);
mula <= A22;
mulb <= T23;
ELSIF CNT=X"1C" THEN
addb <= mulr(31 downto 0);
mula <= A23;
mulb <= T33;
ELSIF CNT=X"1D" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"1E" THEN
ram23<=addr;
ELSIF CNT=X"1F" THEN
mula <= A31;
mulb <= T11;
ELSIF CNT=X"20" THEN
adda <= mulr(31 downto 0);
mula <= A32;
mulb <= T21;
ELSIF CNT=X"21" THEN
addb <= mulr(31 downto 0);
mula <= A33;
mulb <= T31;

ELSIF CNT=X"22" THEN


adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"23" THEN
ram31<=addr;
ELSIF CNT=X"24" THEN
mula <= A31;
mulb <= T12;
ELSIF CNT=X"25" THEN
adda <= mulr(31 downto 0);
mula <= A32;
mulb <= T22;
ELSIF CNT=X"26" THEN
addb <= mulr(31 downto 0);
mula <= A33;
mulb <= T32;
ELSIF CNT=X"27" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"28" THEN
ram32<=addr;
ELSIF CNT=X"29" THEN
mula <= A31;
mulb <= T13;
ELSIF CNT=X"2A" THEN
adda <= mulr(31 downto 0);
mula <= A32;
mulb <= T23;
ELSIF CNT=X"2B" THEN
addb <= mulr(31 downto 0);
mula <= A33;
mulb <= T33;
ELSIF CNT=X"2C" THEN
adda<=addr;
addb<=mulr(31 downto 0);
ELSIF CNT=X"2D" THEN
ram33<=addr;
ELSIF CNT=X"2E" 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"2F" 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; END IF;
END IF;
END IF;
END PROCESS;
END BLOCK GEN;
END bai2giuakipro_arch;
3.3. Phân tích code
- Khai báo thư viện

- Khai báo các biến

- Khai báo các tín hiệu:

- Gán các giá trị sau tính toán vào T để tiếp tục tính toán
- Ở phép toán 1,2,3: ta nhân hàng 1 với cột 1

- Ở phép toán 4, 5: ta cộng các giá trị vừa nhân với nhau và gán nó với giá trị vị trí 1 của
ma trận kết quả:

- Tương tự như vậy với hàng 1 cột 2 cho vị trí 2, hàng 1 cột 3 cho vị trí 3, …. Hàng 3 cột
3 cho vị trí 9.
3.4. Kết quả mô phỏng
- Ta có ma trận A là

Suy ra:

- Ta có kết quả mô phỏng:


(Bổ sung sau) :v
3.4. Nhận xét
- Giá trị mô phỏng trả về hợp với kết quả đã cho

You might also like