Gọi ch−ơng trình con song song

Một phần của tài liệu Nghiên cứu ứng dụng CPLD9500 thiết kế modul điều khiển vị trí (Trang 81)

Phép gọi ch−ơng trình con song song t−ơng đ−ơng với các quá trình

process bao gồm các phép gọi ch−ơng trình con tuần tự t−ơng ứng. Mỗi phép gọi ch−ơng trình con song song t−ơng đ−ơng với một quá trình

process không chứa dNy danh sách các tín hiệu tác động, phần khai báo rỗng và phần thân chứa một phép gọi ch−ơng trình con, tiếp theo là một câu lệnh wait.

3.8. Ch−ơng trình con

Trong VHDL có hai dạng ch−ơng trình con là thủ tục (procedure) và hàm (function). Các ch−ơng trình con có thể sử dụng tại mọi vị trí trong mô tả VHDL.

Các thủ tục procedure sẽ đ−ợc gọi đến nh− một câu lệnh và có thể trả lại nhiều giá trị. Một thủ tục procedure đ−ợc phép thay đổi giá trị các đối t−ợng t−ơng ứng với tham số hình thức của thủ tục, các tham số của thủ tục có thể là các dạng in, out và inout.

Các hàm sẽ đ−ợc sử dụng nh− một biểu thức và chỉ đ−ợc phép trả lại duy nhất một giá trị. Hàm đ−ợc sử dụng để thực hiện tính toán trên các giá

trị của tham số và không có mục đích thay đổi giá trị của các đối t−ợng đ−ợc gắn kết với tham số. Các tham số phải có dạng in và thuộc nhóm dữ liệu signal hoặc constant.

Cú pháp khai báo ch−ơng trình con nh− sau:

procedure <tên thủ tục> [<danh sách các tham số> ]

function <tên hàm> [<danh sách các tham số> ] return <kiểu giá trị trả lại>

Ví dụ về ch−ơng trình con:

function byte_to_int(byte : word_8) return

integer is

variable result : integer := 0;

begin

for index in 0 to 7 loop

result := result*2 + bit'pos(byte(index));

end loop;

return result;

Ch−ơng 4

Thiết kế modul thực hành cpld sử dụng họ cpld XC9500 của Xilinx

4.1. tổng quan về họ cpld xc9500.

Mọi chip của họ CPLD XC9500 cung cấp khả năng lập trình và kiểm tra ngay trên hệ thống. Các thành viên của họ XC9500 đều đ−ợc hỗ trợ lập trình thông qua chuẩn JTAG.

4.1.1. Đặc điểm chung của họ CPLD XC9500.

+ Hiệu suất caọ + Mật độ tích hợp lớn.

+ Khả năng lập trình/xoá ngay trên hệ thống. + Kiến trúc điều khiển khóa chân cảI tiến.

+ Khối chức năng FB (Function block) linh hoạt.

4.1.2. Mô tả kiến trúc.

Mỗi chip của họ XC9500 là một hệ thống con bao gồm nhiều khối chức năng FB, và nhiều khối vào ra IOB đ−ợc liên kết nối hoàn toàn bởi ma trận chuyển mạch Fast Conector (kết nối nhanh). Kiến trúc của họ CPLD XC9500 đ−ợc mô tả ở hình 4.1:

Khối xuất nhập IOB (IO block) cung cấp khả năng đệm cho các ngõ vào và mạch kích ngõ ra của chip. Khối IOB giao diện giữa mạch logic bên trong và các chân I/O của chip. Khối vào ra IOB của XC9500 hình 4.2.

Hình 4.2:Khối vào ra IOB của XC9500

Ma trận chuyển mạch kết nối nhanh (Fast Conector) kết nối tất cả các tín hiệu đến các ngõ vào của FB. Các ngõ ra của của IOB và ngõ ra của FB đều kích ma trận Fast Conector.Ma trận chuyển mạch có khả năng kết hợp nhiều kết nối bên trong tạo thành một ngõ ra AND nối dây duy nhẩtt−ớc khi kích FB đích. Ma trận chuyển mạch Fast Conector hình 4.3. Khối chức năng FB cung cấp khả năng mạch logic lập trình đ−ợc. Hình vẽ 4.4

Hình 4.2: Khối vào ra IOB của XC9500

4.2. Trình tự thiết kế cpld

Tuỳ theo sản phẩm CPLD của các hNng mà có trình tự thiết kế khác nhau, nh−ng nói chung trình tự thiết kế tuân theo sơ đồ hình 4.6.

Hình 4.4: Khối chức năng FB

Các b−ớc chính khi thiết kế nh− sau:

B−ớc 1: Từ yêu cầu của thiết kế viết ch−ơng trình mô tả mạch logic cần thiết kế bằng ngôn ngữ mô tả phần cứng hoặc ta cũng có thể dùng ch−ơng trình vẽ mạch để mô tả thiết kê.

B−ớc 2: Sử dụng ch−ơng trình tổng hợp logic (Logic synthesizer) để chuyển đổi HDL hoặc schematic thành “netlist”. Netlist chỉ là sự mô tả của các cổng logic và sự kết nối giữa chúng.

B−ớc 3: Chúng ta sử dụng những công cụ thực hiện (Implementation tools) đặt các chân chức năng cho CPLD

Yêu cầu của thiết kế Mô tả Thiết kế

Tổng hợp mạch logic (Logic synthesizer)

Đặt chân chức năng Tạo chuỗi bit (BITSTREAM hoặc file

*JED)

Nạp chuỗi bit vào CPLDvà chạy thử

B−ớc 4: Tạo ra một chuỗi bit (Bitstream) hoặc file *jed trong đó 1 và 0 lần l−ợt t−ơng ứng với trạng thái mở hoặc đóng của các chuyển mạch.

B−ớc 5: Chuỗi bit đN đ−ợc tạo ra đ−ợc nạp (Download) vào chip CPLD Các chuyển mạch điện tử trong CPLD mở hoặc đóng t−ơng ứng với giá trị của các bit nhị phân (Binary bit) trong chuỗi bit. Khi công việc nạp chuỗi bit vào CPLD hoàn tất, ta có thể chạy thử để kiểm tra chức năng của mạch theo yêu cầu của thiết kế.

4.3. Những công cụ sử dụng khi thiết kế CPLD.

4.3.1. Phần mềm

Việc lập trình cho CPLD sử dụng ngôn ngữ VHDL, Verilog, ABEL. Xilinx cung cấp công cụ thiết kế là phần mềm WebPACK để lập trình cho họ CPLD và FPGẠ Chúng ta có thể download WebPACK từ vị trí sau:

Máy vi tính có cấu hình phù hợp để cài đ−ợc ch−ơng phần mềm WebPACK 6.3, cổng song song hoạt động ở chế độ ECP.

4.3.2. Phần cứng +Sơ đồ +Sơ đồ +Sơ đồ ghép nối: Hình 4.7: Sơ đồ kết nối giữa CPLD

với máy tính

Với các thiết bị CPLD của Xilinx, chúng ta có thể ghi dữ liệu từ máy vi tính xuống mạch chức năng thông qua giao diện chuẩn JTAG. Hình vẽ 4.7 là sơ đồ kết nối giữa CPLD với máy tính qua mạch JTAG.

Hình 4.9:

Hình 4.8: Sơ đồ mạch JTAG.

Cáp JTAG nối với máy tính qua cổng song song 25 chân. Và CPLD XC9500 cung cấp các chân tín hiệu cho JTAG (TMS, TCK, TDI and TDO).

4.4. Thiết kế modul thực hành CPLD

4.4.1. Nhiệm vụ và yêu cầu của modul

Hiện nay các môn học về thiết kế hệ thống số đN và đang đ−ợc đ−a vào giảng dạy tại các tr−ờng Cao đẳng và Đại học. Việc tiếp cận môn học này t−ơng đối khó và trừu t−ợng, để môn học trực quan và dễ tiếp cận việc thực hành lập trình số là rất cần thiết.

Modul thực hành CPLD đ−ợc sử dụng để giảng dạy tại tr−ờng Đại học công nghiệp hà nội, yêu cầu:

-Trực quan

-Thuận lợi trong việc thực hiện bài giảng.

-Có thẩm mỹ cao

4.4.2. Sơ đồ nguyên lý của modul

Modul đ−ợc chia thành 3 modul nhỏ là: Mạch tổ hợp, bộ đếm và giải mN bàn phím. Cả 3 modul này đ−ợc kết nối với máy tính qua cổng LPT để có thể điều khiển và thay đổi các tham số của mạch một cách linh hoạt.

Hình 4.9: Sơ đồ nguyên lý của modul

Bảng 4.1: Bảng các khối chức năng

DIP switch 12 ON : L level, OFF : H level

Square wave oscillator 1 1-Hz square wave

BCD switch 1 ON bit : L level, OFF bit : open

LED 10 Each LED lights up by the H level

7 segment LED 1 Each segment lights up by the L level

Modul mạch tổ hợp

Với modul mạch tổ hợp ta có bảy đầu vào tử D0 - D6 có thể thay đổi đ−ợc tín hiệu vàọ Sau khi viết ch−ơng trình và nạp vào CPLD ta có thể thử hoạt động của mạch bằng việc quan sát tín hiệu ra bằng 8 LED tử LED 1 tới LED 8 khi thay đổi tín hiệu đầu vào

4.5. Thiết kế một số ch−ơng trình VHDL chạy thử trên modul

4.5.1. Bộ đếm nhị phân thuận nghịch 4 bit.

H: High level L: Low level X: Don't care

Bảng 4.2: Bảng trạng thái của bộ đếm nhị phân thuận nghịch 4 bit. Input Outp ut CLEAR LOAD CE UP CLK Q3,Q2,Q1,Q0 Operation H X X X X 0,0,0,0 Counter clear L H X X D3,D2,D1,D0 Counter preset L L L X Q = Q Count stop L L H H Q = Q+1 Count up L L H L Q = Q-1 Count down

- Ch−ơng trình điều khiển:

********************************************************************** library ieee; -- Library declaration

use ieeẹstd_logic_1164.all; use ieeẹstd_logic_unsigned.all; entity UD_COUNTER1 is

port ( CLK,CLEAR,LOAD,CE,UP : in std_logic; -- INPUT and OUTPUT declaration

Q : out std_logic_vector(3 downto 0));

attribute pin_assign : string; -- Pin assign attribute pin_assign of CLK : signal is "1";

attribute pin_assign of CLEAR : signal is "2"; attribute pin_assign of LOAD : signal is "3"; attribute pin_assign of CE : signal is "4"; attribute pin_assign of UP : signal is "8";

attribute pin_assign of DIN:signal is "38,37,36,35"; attribute pin_assign of Q : signal is "14,13,12,11"; end UD_COUNTER1;

architecture UD_COUNTER_ARCH of UD_COUNTER1 is -- Internal counter signal

signal Q_IN : std_logic_vector(3 downto 0) begin

Q <= Q_IN; -- Set output process( CLEAR, CLK, LOAD, CE, UP ) begin if CLEAR='1' then -- CLEAR = ON ?

Q_IN <= "0000"; -- Yes. Counter clear elsif CLK='1' and CLK'event then -- Clock in ? if LOAD='1' the -- Yes. LOAD = ON ? Q_IN <= DIN; -- Set Input to Output else -- LOAD = OFF

H : High level L : Low level X : Don't care

if UP='1' th -- Yes. Up count ?

Q_IN <= Q_IN + '1'; -- Yes. Count-up else -- Not count-up Q_IN <= Q_IN - '1'; -- Count-down end if;

end if; -- Not CE = 1 end if; end if; end process; end UD_COUNTER_ARCH; ************************************************************ 4.5.2. Bộ đếm nhị phân 5 bit.

Bảng 4.3: Bảng trạng thái bộ đếm nhị phân 5 bit.

Input Output CLEA R CE CLK Q2,Q1,Q0 Operation L X X 0,0,0 Counter clear H L Q = Q Count stop

H H

Q = Q+1

Count up

- Ch−ơng trình điều khiển:

********************************************************** library ieee; -- Defines std_logic types use ieeẹstd_logic_1164.all;

use ieeẹstd_logic_unsigned.all; entity Counter5 is

port ( CLK,CLEAR,CE : in std_logic; -- Defines ports

Q5 : out std_logic_vector(2 downto 0));

attribute pin_assign : string; -- Pin Assign attribute pin_assign of CE : signal is "1";

attribute pin_assign of Q5 : signal is "13,12,11"; attribute bufg: string;

attribute bufg of CLK : signal is "CLK"; attribute bufg of CLEAR : signal is "SR"; end Counter5;

architecture Counter5_ARCH of Counter5 is

signal Q5_IN : std_logic_vector(2 downto 0); - Defines internal signals

begin

Q5 <= Q5_IN; -- Set output process( CLEAR, CLK, CE ) begin

if CLEAR='0' then -- Clear counter ?

Q5_IN <= "000"; - Yes. Clear counter

elsif CLK='1' and CLK'event then

-- Clock rising edge ?

if CE='1' then -- Yes. Count Enable ? if Q5_IN=4 then -- Yes. Count = 4 ? Q5_IN <= "000"; -- Yes. Clear counter else -- No

Q5_IN <= Q5_IN + '1'; -- Count-up end if;

end if; b -- Count Disable(Stop) end if; end process; end Counter5_ARCH; ********************************************************************* 4.5.3. Bộ giải mã 4-16. Bảng 4.3: Bảng trạng thái bộ giải mN 4-16. Input Output D C B A Q15 - Q0

0 0 0 0 0000000000000001 0 0 0 1 0000000000000010 0 0 1 0 0000000000000100 0 0 1 1 0000000000001000 0 1 0 0 0000000000010000 0 1 0 1 0000000000100000 0 1 1 0 0000000001000000 0 1 1 1 0000000010000000 1 0 0 0 0000000100000000 1 0 0 1 0000001000000000 1 0 1 0 0000010000000000 1 0 1 1 0000100000000000 1 1 0 0 0001000000000000 1 1 0 1 0010000000000000 1 1 1 0 0100000000000000 1 1 1 1 1000000000000000

- Ch−ơng trình điều khiển:

*********************************************************************

library ieee; -- Defines std_logic types use ieeẹstd_logic_1164.all;

entity Decoder2 is

ort ( A, B, C, D : in std_logic; -- Defines ports Q : out std_logic_vector(15 downto 0));

end Decoder2;

architecture Decoder2_arch of Decoder2 is

Signal IN_DATA : std_logic_vector(3 downto 0); -- Defines internal signals

begin

IN_DATA <= D & C & B & A; -- Binding vector

process( IN_DATA ) begin

case IN_DATA is -- Decode with input data when "0000" => Q <= "0000000000000001"; when "0001" => Q <= "0000000000000010"; when "0010" => Q <= "0000000000000100"; when "0011" => Q <= "0000000000001000"; when "0100" => Q <= "0000000000010000"; when "0101" => Q <= "0000000000100000"; when "0110" => Q <= "0000000001000000"; when "0111" => Q <= "0000000010000000"; when "1000" => Q <= "0000000100000000"; when "1001" => Q <= "0000001000000000"; when "1010" => Q <= "0000010000000000"; when "1011" => Q <= "0000100000000000"; when "1100" => Q <= "0001000000000000"; when "1101" => Q <= "0010000000000000"; when "1110" => Q <= "0100000000000000";

when "1111" => Q <= "1000000000000000"; when others => Q <= "XXXXXXXXXXXXXXXX"; -- Illegal condition end case; end process; end Decoder2_arch; ********************************************************** 4.5.4. Bộ chốt 8 bit.

Bảng 4.4: Bảng trạng thái của bộ chốt 8 bit.

Input Output

CLK Q7 - Q0

Q = DIN

- Ch−ơng trình điều khiển:

library ieee; -- Defines std_logic types use ieeẹstd_logic_1164.all;

entity Latch1 is

port ( DIN : in std_logic_vector(7 downto 0); -- Defines ports

Q : out std_logic_vector(7 downto 0)); end Latch1;

architecture Latch1_arch of Latch1 is begin

process( CLK ) begin

if CLK='1' and CLK'event then -- Clock rising edge ? Q <= DIN; -- Latch data

end if;

end process; end Latch1_arch;

**********************************************************

4.5.5. Mạch ngoại vi cho đồng hồ hiển thị số.

Sau đây là mạch ngoại vi sử dụng cho đồng hồ hiện số với độ chính xác cao SR flip-flop

3-8 decoder

Bảng 4.5 Bảng trạng thái của decoder

Input Output

0 0 0 11111110 0 0 1 11111101 0 1 0 11111011 0 1 1 11110111 1 0 0 11101111 1 0 1 11011111 1 1 0 10111111 1 1 1 01111111 Bộ chia tần 1/200000

Ch−ơng trình điều khiển:

*********************************************************************

library IEEE; -- Library declaration use IEEẸSTD_LOGIC_1164.ALL;

use IEEẸSTD_LOGIC_ARITH.ALL; use IEEẸSTD_LOGIC_UNSIGNED.ALL; entity clock2 is

Port ( S,R : in std_logic_vector(1 downto 0); -- SR-FF INPUT

Q : out std_logic_vector(1 downto 0);-- SR-FF OUTPUT CLK_10M : in std_logic; -- 1/200000 counter INPUT CLK_50:out std_logic;

-- 1/200000 counter OUTPUT A,B,C:in std_logic; -- 3-8 Decoder INPUT DEC : out std_logic_vector(7 downto 0)); -- 3-8 Decoder OUTPUT

attribute pin_assign : string; -- Pin assign

attribute pin_assign of S : signal is "6,2"; attribute pin_assign of R : signal is "4,44"; attribute pin_assign of Q : signal is "42,40"; attribute pin_assign of CLK_10M : signal is "7"; attribute pin_assign of CLK_50 : signal is "39"; attribute pin_assign of A : signal is "37";

attribute pin_assign of B : signal is "35"; attribute pin_assign of C : signal is "33";

attribute pin_assign of DEC : signal is

"27,25,28,26,22,20,18,24"; end clock2;

architecture clock2_arch of clock2 is

signal SI,RI,QI,QRI : std_logic_vector(1 downto 0); -- SR-FF signals

signal Q100K : std_logic_vector(16 downto 0); -- 1/100000 counter

signal QCLK : std_logic_vector(0 downto 0); -- 1/2 counter

signal IN_DATA : std_logic_vector(2 downto 0); -- 3-8 Decoder signals

begin

-- ** SR-FF **

Q <= QI; -- Set OUTPUT QI <= S nand SI; -- Make NAND QRI <= R nand RI; -- Make NAND

SI <= QRI; -- Connect QRI and SI RI <= QI; -- Connect QI and RI -- ** 1/200000 counter **

CLK_50 <= QCLK(0); -- Set OUTPUT process( CLK_10M ) begin

if CLK_10M='1' and CLK_10M'event then -- Clock rising edge ?

if Q100K=99999 then -- Count = 100000 ?

Q100K <= "00000000000000000";-- YES. Clear counter QCLK <= QCLK + '1'; -- Set 1/200000 counter else -- Nọ Q100K <= Q100K + '1'; -- Count-up end if; end if; end process; -- ** 3-8 Decoder **

IN_DATA <= C & B & A; -- Binding vector process( IN_DATA ) begin

case IN_DATA is -- Decode with input data when "000" => DEC <= "11111110"; when "001" => DEC <= "11111101"; when "010" => DEC <= "11111011"; when "011" => DEC <= "11110111"; when "100" => DEC <= "11101111"; when "101" => DEC <= "11011111"; when "110" => DEC <= "10111111"; when "111" => DEC <= "01111111";

when others => DEC <= "XXXXXXXX";

-- Illegal condition

end case; end process; end clock2_arch;

Kết luận

Sau thời gian nghiên cứu và tìm hiểu về các thiết bị logic lập trình đ−ợc, cụ thể là thiết bị CPLD của hNng Xilinx, tôi đN đạt đ−ợc một số kết quả sau:

- Nắm đ−ợc ph−ơng pháp thiết kế mới cho các mạch logic lập trình đ−ợc. - Có kỹ năng sử dụng ngôn ngữ mô tả phần cứng HDL, cụ thể là ngôn ngữ VHDL

- Tìm hiểu đ−ợc cấu trúc, nguyên lý hoạt động của các thiết bị CPLD, sử họ CPLD XC9500 làm đối t−ợng nghiên cứu cụ thể.

- Thiết kế thành công modul điều khỉên vị trí phục vụ công tác giảng dạy tại Tr−ờng Cao đẳng Công nghiệp Hà nộị

Với những kết quả đN đạt đ−ợc trong thời gian nghiên cứu vừa qua, tôi nhận thấy mình hoàn toàn có khả năng làm chủ các thiết bị CPLD của Xilinx cũng nh− các thiết bị logic lập trình đ−ợc của các hNng khác.

Tôi xin chân thành cảm ơn:

TS .Đặng Văn Chuyết đN trực tiếp h−ớng dẫn và giúp đỡ tôi trong thời

Một phần của tài liệu Nghiên cứu ứng dụng CPLD9500 thiết kế modul điều khiển vị trí (Trang 81)

Tải bản đầy đủ (PDF)

(112 trang)