Nạp ch−ơng trình cho FPGA

Một phần của tài liệu Nghiên cứu tìm hiểu công nghệ FPGA trong thiết kế mạch điện tử (Trang 70)

Có 4 cách để nạp ch−ơng trình cho FPGA

• Nạp trực tiếp vào FPGA thông qua cổng JTAG hay cổng USB.

• Nạp vào Platform Flash PROM XCF04S (4Mbit), rồi cấu hình cho FPGA ở chế độ Master Serial Mode.

• Nạp vào serial Flash PROM ST Microelectronics (16 Mbit), rồi cấu hình cho FPGA ở chế độ SPI Mode.

• Nạp vào StrataFlash parallel PROM Intel (128 Mbit), rồi cấu hình cho FPGA ở chế độ BPI Up Mode hay BPI Down Mode.

Để thiết lập các chế nạp cho FPGA, ta set jumper JP 30. Mỗi lần thay đổi chế độ cấu hình phải nhấn nút PROG để restart lại cấu hình.

4.2 Tổng quan về cấu trúc SPARTAN - 3E

Các thành phần:

- Input/Output Blocks (IOBs) : các khối vào ra

- Configurable Logic Blocks (CLBs) : Đ−ợc cấu tạo từ Look-Up Tables (LUTs). - Block RAM : Hỗ trợ 16 Kb RAM trên mỗi Block RAM, số l−ợng các Block RAM tuỳ thuộc vào mỗi chip , với XC3S500E có 20 Block RAM.

- Multiplier Blocks : Khối nhân hai đầu vào 18 bit.

- Digital Clock Manager (DCM) Blocks khối điều khiển xung clk. - Interconnect : Các kết nối.

4.2.1. Input/Output Blocks (IOBs) :

Bao gồm các khối vào ra 2 chiều I/O và các khối đầu vào input path (không thể làm đầu ra ). Đầu vào là một khối chức năng có tác dụng làm trì hoãn tín hiệu tr−ớc khi nó đ−ợc đ−a vào các khối bên trong

Sau khi cấu hình cho FPGA, các chân không sử dụng theo mặc định đ−ợc thiết lập thành điện trở nội pull-down.

Cấp nguồn cho IOBs :

VCCO : Cấp nguồn cho đầu ra, tức điện thế đầu ra sẽ bằng với VCCO. Khoảng 3.3 V

VCCINT : Cấp nguồn cho các khối bên trong FPGA. Khoảng 1.2 V. VCCAUX : Nguồn hỗ trợ khoảng 2.5 V.

4.2.2 Configurable Logic Blocks (CLBs): Khối chức năng logic

Khối này thực hiện các chức năng logic và l−u trữ. Mỗi CLBs có 8 bảng tìm kiếm LUTs và 8 phần tử nhớ. LUTs là khối có chức năng thực hiện các biểu thức logic, ngoài ra nó có thể cấu hình thành một RAM 16 bit hay thanh ghi 16 bit. Phần tử nhớ là một khối mà có thể chỉ định để trở thành một Flip-Flop hay Latch.

XC3S500E có 1164 CLBs t−ơng ứng với 9312 LUTs và 9312 Flip-Flop. Logic Cell: Mỗi LUTs kết hợp với một phần tử nhớ gọi là một logic cell.

Block RAM: Khối nhớ

Các LUTs có thể cấu hình nh− RAM nh−ng RAM này th−ờng dùng nh− một buffer dữ liệu, trong khi các Block RAM th−ờng dùng cho việc chứa dữ liệu trong khi các Block RAM th−ờng dùng cho việc chứa dữ liệu có kích th−ớc lớn hơn. XC3S500E chứa 20 Block RAM. Mỗi Block RAM có thể chứa 18 Kbit dữ liệu.

Dedicated Multipliers: Bộ nhân chuyên dụng

Các bộ nhân đ−ợc đặt cùng với các Block RAM thành một khối . Bộ nhân hỗ trợ hai đầu vào và 18 bit đẩu ra 36 bit. Có thể ghép chồng các bộ nhân để tăng số đầu vào.

Digital clock Managers(DCMs): Bộ quản lý xung Clock

Bộ quản lý xung clock là một khối có 3 chức năng chính :

- Loại bỏ sự lệch xung clock( Clock – skew Elimination): giúp tăng tốc độ chuyển mạch

- Tổng hợp tần số (Frequency Synthesis): Giúp thay đổi tần số đầu ra xung clock. 2 _ 1 _ * Integer Integer CLK CLKOUT = IN

Trong đó Integer_1 và Integer_2 tuỳ chọn từ 1-32 (adsbygoogle = window.adsbygoogle || []).push({});

- Dịch pha (Phase Shifting): thay đổi pha clock

Interconnect: Các kết nối

- Cung cấp các đ−ờng kết nối, các ma trận chuyển mạch để tạo thành mạng các đ−ờng tín hiệu giúp kết nối các thành phần với nhau.

4.3 Thiết kế một số mạch điện tử 4.3.1 Giới thiệu vi điều khiển PicoBlaze 4.3.1 Giới thiệu vi điều khiển PicoBlaze

Vi điều khiển PicoBlaze là vi điều khiển nhúng 8 bít có cấu RISC đ−ợc tối −u phát triển cho các họ FPGA Spartan 3, Virtex II và Virtex II Pro của Xilinx. Với vi điều khiển này chúng ta có thể thiết kế rất hiệu quả dựa trên nền vi điều khiển PicoBlaze và xử lý dữ liệu đơn giản. Vi điều khiển PicoBlaze đ−ợc tối −u về mặt hiệu suất và chi phí phát triển thấp nó chiếm khoảng 96 FPGA slices, hay chỉ 12.5% của XC3S50 FPGA và chiếm một phần rất nhỏ ở mức 0.3% của XC3S5000 FPGA . Bình th−ờng mỗi RAM của FPGA có thể l−u trữ tới 1024 câu lệnh ch−ơng trình và các lệnh này đ−ợc tự động load trong khi cấu hình FPGA khi đó Vi điều khiển PicoBlaze có thể hoạt động tử 44000 tới 100000 câu lênh trên giây (MIPS –million instructions per second) tuỳ thuộc vào họ FPGA đ−ợc sử dụng là loại gì và tốc độ của dòng đó.

Nhân của vi điều khiển PicoBlaze đ−ợc nhúng hoàn toàn trong FPGA và không cần một nguồn thêm nào. Đơn giản là các ngoại vi của Vi điều khiển PicoBlaze có thể tự do lựa chọn cho phù hợp với các mục đính đặc biệt,chức năng và yêu cầu về giá cả của sản phẩm cuối cùng. PicoBlaze đ−ợc nhúng vào d−ới dạng một mã nguồn VHDL vì thế có thể nhúng vào các đời FPGA sau này và do đó project của chúng ta sẽ có tính kế thừa cao. Đ−ợc nhúng trong FPGA vi điều khiển PicoBlaze làm giảm kích th−ớc mạch, giá thành và thời gian thiết kế.

PicoBlaze FPC đ−ợc hỗ trợ bởi một số công cụ phát triển phù hợp bao gồm assembler và môi tr−ờng đồ hoạ tích hợp IDE( intergrated development environment), graphical instruction set simulator và mã nguồn mở VHDL và khối mô phỏng. PicoBlaze đ−ợc hỗ trợ trong môi tr−ờng phát triển Xilinx System Generator hay ISE.

Vi điều khiển PicoBlaze có các đặc điểm sau:

• 16 thanh ghi dữ liệu chức năng chung có độ rộng 8 bit.

• L−u trữđ−ợc 1K lệnh trong ch−ơng trình có thê lâp trình đ−ợc trong chip và tự động nạp khi cấu hình FPGA hay khi khởi động FPGA.

• Khối tính toán logic (Arithmetic Logic Unit –ALU) với các cờ CARRY và ZERO.

• Một bảng RAM 64 byte.

• 256 đầu vào và 256 đầu ra dễ dàng có thể mở rộng thêm. • Automatic 31 location CALL/RETURN stack.

• Predictable performance, luôn luôn dùng 2 xung nhịp hệ thống cho một câu lệnh, có thểđạt tới 200 MHz hoặc 100 MIPS trong Virtex –II Pro FPGA.

• Đáp ứng ngắt nhanh; worst-case 5 clock cycles.

• Đ−ợc tối −u cho cấu trúc Spartan –3, Virtex II, và Virtex II Pro FPGA của Xilinx chỉ chiếm 96 slices và 0.5 tới 1 block RAM.

• Hỗ trợ mô phỏng tệp lệnh assembler.

Vi điều khiển PicoBlaze đ−ợc cung cấp d−ới file nguồn VHDL gọi là KCPSM3.vhd, đã đ−ợc tối −u về việc thực thi hiệu quả và chắc chắn trong các họ Spartan-3, Virtex-II hay Vertex-II Pro. Các mã nguồn phù hợp với cả quá trình tổng hợp và mô phỏng và đ−ợc phát triển và kiểm tra dùng công cụ Xilinx Synthesizs Tool (XST) cho tổng hợp logic và ModelSim cho mô phỏng. Các nhà thiết kế cũng thành công khi dùng các công cụ tổng hợp logic và mô phỏng khác. Cácmã nguồn VHDL không nên bị chỉnh sửa trong bất kì hoàn cảnh nào.

Module KCPSM3 bao gồm ALU, register file, scratchpad RAM, … Chỉ duy nhất chức năng không nằm trong KCPSM3 là bộ nhớ ch−ơng trình. Khai báo component và gắn chân nh− sau:

Component KCPSM3 Port (

address : out std_locgic_vector ( 9 downto 0 ); instruction : in std_locgic_vector ( 17 downto 0 );

port_id : out std_locgic_vector ( 7 downto 0 );

write_stroble : out std_locgic_;

out_port : out std_locgic_vector ( 7 downto 0 );

read_stroble : out std_locgic_;

in_port : in std_locgic_vector ( 7 downto 0 );

interrupt : in std_locgic; interrupt_ack : out std_locgic;

reset : in std_locgic; clk : in std_locgic; ); end component Processor: kcpsm3 Port map ( Address => address_signal, Instruction => Instruction_signal, Port_id => port_id_signal, Write_stroble => write_stroble_signal, Out_port => out_port_signal, Read_stroble => read_stroble_signal, In_port => In_port_signal, Interrupt => Interrupt_signal, Interrupt_ack => Interrupt_ack_signal, Reset => Reset_ signal,

Clk => Clk_signal ); (adsbygoogle = window.adsbygoogle || []).push({});

Kết nối với bộ nhớ ROM ch−ơng trình bộ nhớ ROM ch−ơng trình của PicoBlaze đ−ợc dùng trong thiết kế VHDL. Từ file assembler tạo ra file VHDL, đã định nghĩa block RAM và khởi tạo nội dung cho RAM. File VHDL này có thể đ−ợc dùng cho cả tổng hợp logic và mô phỏng vi điều khiển.

Sau đây là khai báo component và gán các thực thể của bộ nhớ ch−ơng trình trong FPGA:

Component prog_rom

Port (

address : out std_locgic_vector ( 9 downto 0 ); instruction : in std_locgic_vector ( 17 downto 0 );

clk : in std_locgic; ); end component program: prog_rom Port map ( Address => address_signal, Instruction => Instruction_signal, Clk => Clk_signal );

Do đó, sơ đồ cấu trúc của vi điều khiển PicoBlaze nh− sau:

Để viết mã lệnh cho ch−ơng trình (với tên mở rộng là .psm) thì chúng ta có thể dùng bất cứ trình soạn thảo nào để lập trình dựa theo 31 lệnh đ−ợc cung cấp. Và dùng file thực

thi CPSM3.exe và các form đ−ợc định nghĩa sẵn của ROM d−ới dạng file .vhd, .coe, .v để dịch ra các file .vhd, .v vàcho vào ch−ơng trình FPGA. Để phối hợp hoạt động của tất cả các thành phần trên, đảm bảo hệ thống hoạt động chính xác, ta phải có một hệ thống điều khiển trung tâm.

4.3.2 Thiết kế ALU

Mạch ALU thực hiện các phép toán logic và toán học đối với hai đầu vào a và b. Chúng đ−ợc điều khiển bới 4 bít sel(3:0). Tuỳ thuộc vào giá trị của sel mà khối sẽ thực hiện thao tác nào với dữ liệu. Bảng d−ới đây mô tả các thao tác của ALU.

Mã nguồn thực hiện mô phỏng:

--- LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --- ENTITY ALU IS

PORT (a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); sel: IN STD_LOGIC_VECTOR (3 DOWNTO 0); cin: IN STD_LOGIC;

sel operation function unit

0000 0001 0010 0011 0100 0101 0110 0111 Y<=a Y<=a+1 Y<=a-1 Y<=b Y<=b+1 Y<=b-1 Y<=a+b Y<=a+b+cin Transfer a Increment a Decrement a Transfer b Increment b Decrement b Add a and b

Add a and b with carry

arithmetic 1000 1001 1010 1011 1100 1101 1110 1111 Y<= NOT a Y<= NOT b Y<= a AND b Y<= a OR b Y<= a NAND b Y<= a NOR b Y<= a XOR b Y<= a XNOR b Complement a Complement b AND OR NAND NOR XOR XNOR logic

y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END ALU;

ARCHITECTURE dataflow OF ALU IS

SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN

--- Arithmetic unit: ---

WITH sel(2 DOWNTO 0) SELECT arith <= a WHEN "000", a+1 WHEN "001", a-1 WHEN "010", b WHEN "011", b+1 WHEN "100", b-1 WHEN "101", a+b WHEN "110",

a+b+cin WHEN OTHERS; --- Logic unit: ---

WITH sel(2 DOWNTO 0) SELECT logic <= NOT a WHEN "000",

NOT b WHEN "001", a AND b WHEN "010", a OR b WHEN "011", a NAND b WHEN "100", a NOR b WHEN "101", a XOR b WHEN "110",

NOT (a XOR b) WHEN OTHERS; --- Mux: ---

WITH sel(3) SELECT

y <= arith WHEN '0', logic WHEN OTHERS; END dataflow; Kết quả mô phỏng. a arith b cin logic sel y ns 50 100 150 200 250 300 350 400 450 500 00 01 02 03 04 05 00 01 02 03 04 05 0 1 0 1 2 3 00 02 02 04 03 05 00 02 02 04 03 05 FF FE FD FC 04 05

4.3.3 Bộ đếm hai chữ số thập phân từ 00 đến 99 hiển thị LED 7 thanh. reset reset clk temp1 temp2 digit1 digit2 ns 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 0 1 0 1 0 1 2 3 4 0 1 7E 30 7E 30 7E 30 6D 79 33 7E 30 0 7E LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY counter IS (adsbygoogle = window.adsbygoogle || []).push({});

PORT (clk, reset : IN STD_LOGIC;

digit1, digit2 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END counter;

ARCHITECTURE counter OF counter IS BEGIN

PROCESS(clk, reset)

VARIABLE temp1: INTEGER RANGE 0 TO 10; VARIABLE temp2: INTEGER RANGE 0 TO 10; BEGIN

--- counter: ---

IF (reset='1') THEN

temp1 := 0;

temp2 := 0;

ELSIF (clk'EVENT AND clk='1') THEN temp1 := temp1 + 1; IF (temp1=10) THEN temp1 := 0; temp2 := temp2 + 1; IF (temp2=10) THEN temp2 := 0; END IF; END IF; END IF; ---- BCD to SSD conversion: --- CASE temp1 IS

WHEN 0 => digit1 <= "1111110"; --7E WHEN 1 => digit1 <= "0110000"; --30 WHEN 2 => digit1 <= "1101101"; --6D WHEN 3 => digit1 <= "1111001"; --79 WHEN 4 => digit1 <= "0110011"; --33 WHEN 5 => digit1 <= "1011011"; --5B WHEN 6 => digit1 <= "1011111"; --5F WHEN 7 => digit1 <= "1110000"; --70 WHEN 8 => digit1 <= "1111111"; --7F WHEN 9 => digit1 <= "1111011"; --7B

WHEN OTHERS => NULL;

END CASE;

CASE temp2 IS

WHEN 0 => digit2 <= "1111110"; --7E WHEN 1 => digit2 <= "0110000"; --30 WHEN 2 => digit2 <= "1101101"; --6D WHEN 3 => digit2 <= "1111001"; --79 WHEN 4 => digit2 <= "0110011"; --33 WHEN 5 => digit2 <= "1011011"; --5B WHEN 6 => digit2 <= "1011111"; --5F WHEN 7 => digit2 <= "1110000"; --70 WHEN 8 => digit2 <= "1111111"; --7F WHEN 9 => digit2 <= "1111011"; --7B

WHEN OTHERS => NULL;

END CASE;

END PROCESS;

4.3.4 Bộ cộng có nhớ 8 bit không dấu. cin cin a b s cout ns 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 92 40 04 31 86 C6 32 24 81 09 63 0D 8D 65 B 7 C2 0D 94 93 53 97 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY adder IS

GENERIC (length : INTEGER := 8);

PORT ( a, b: IN STD_LOGIC_VECTOR (length-1 DOWNTO 0);

cin: IN STD_LOGIC;

s: OUT STD_LOGIC_VECTOR (length-1 DOWNTO 0);

cout: OUT STD_LOGIC);

END adder;

ARCHITECTURE adder OF adder IS BEGIN

PROCESS (a, b, cin)

VARIABLE carry : STD_LOGIC_VECTOR (length DOWNTO 0); BEGIN

carry(0) := cin;

FOR i IN 0 TO length-1 LOOP (adsbygoogle = window.adsbygoogle || []).push({});

s(i) <= a(i) XOR b(i) XOR carry(i);

carry(i+1) := (a(i) AND b(i)) OR (a(i) AND carry(i)) OR (b(i) AND carry(i));

END LOOP;

cout <= carry(length);

END PROCESS;

END adder;

4.3.5 Bộ điều khiển đèn giao thông (TLC)

+ Chế độ bình th−ờng: ở chế độ này, mạch có 4 trạng thái, mỗi trạng thái là độc lập, thời gian lập trình ….?

+ Chế độ kiểm tra: Cho phép tất cả thời gian đ−ợc lập trình tr−ớc đ−ợc viết lên với 1 giá trị nhỏ, do vậy hệ thống có thể dễ dàng đ−ợc kiểm tra trong suốt quá trình baỏ d−ỡng. + Chế độ Standby: Nếu thiết lập hệ thống sẽ kích hoạt đèn vàng trong khi tín hiệu standby đ−ợc kích hoạt.

Đồng thời 1 đông hồ tần số 60 HZ luôn hoạt động. Mã thiết kế: --- library IEEE; use IEEE.STD_LOGIC_1164.all; ENTITY Bodk_den_giao_thong IS PORT ( clk, stby, test: IN STD_LOGIC; r1, r2, y1, y2, g1, g2: OUT STD_LOGIC); END Bodk_den_giao_thong;

---

ARCHITECTURE state_machine_be OF Bodk_den_giao_thong IS CONSTANT timeMAX : INTEGER := 2700;

CONSTANT timeRG : INTEGER := 1800; CONSTANT timeRY : INTEGER := 300; CONSTANT timeGR : INTEGER := 2700; CONSTANT timeYR : INTEGER := 300;

Một phần của tài liệu Nghiên cứu tìm hiểu công nghệ FPGA trong thiết kế mạch điện tử (Trang 70)