Mojo v3 FPGA Board
Mojo v3 เป็นบอร์ด FPGA สำหรับการเรียนรู้และพัฒนา (ใช้ชิป Xilinx Spartan-6 XC6SLX9) และเป็นตัวอย่างหนึ่งของฮาร์ดแวร์ประเภท Opensource Hardware (OSHW) ที่เปิดเผยไฟล์ Schematic & PCB Layout (ใช้โปรแกรม Eagle ในการออกแบบบอร์ด) เมื่อพิจารณาจากอุปกรณ์หรือไอซีที่ใช้ Mojo v3 เป็นบอร์ดที่ไม่ซับซ้อน และถือว่าเป็น low-cost FPGA board อีกด้วย แต่ในการใช้งานจะต้องมีการต่อวงจรเพิ่ม หรือใช้ร่วมกับอุปกรณ์อื่น เช่น บอร์ดที่มีลักษณะเป็น "Shield(s)" (Mojo Shields) เหมือนในกรณีของ Arduino Shields และแนวทางนี้แตกต่างจากบอร์ด FPGA ที่เป็นสินค้าของบริษัทอื่นอย่างเช่น Xilinx, Altera, Avnet Electronics, Digilent Inc. เป็นต้น มีมักจะรวมวงจรหรืออุปกรณ์ต่างๆ หลายอย่าง ไว้บนบอร์ดเดียวกับชิป FPGA และใช้ชิป FPGA ที่มีความจุทางลอจิกสูงกว่า
รูปบอร์ด Mojo v3 (Educational / Development FPGA Board)
Lab01 - สร้างไฟวิ่ง 8 ดวงออกทาง LED ของ Mojo V3 Board ด้วย VHDL
การทำงาน
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx--> Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select VHDL Module
Source Code
library
IEEE;
use
IEEE.STD_LOGIC_1164.ALL;
entity
moving_led_1 is
port (reset, clk: in std_logic;
yout : out std_logic_vector(7 downto 0));
end
moving_led_1;
architecture
beh of moving_led_1 is
signal
q : std_logic_vector(7 downto 0);
signal
sq : std_logic;
component
DIVIDER is
port
(CLK : in std_logic;
Q : out std_logic);
end
component;
begin
PROCESS
(clk,reset)
BEGIN
IF(reset
= '0') THEN q <= "00000001";
ELSE
IF(sq'EVENT and sq = '1') THEN
q(0)
<= q(7);
q(7
downto 1)<=q(6 downto 0);
ELSE
q <= q;
END
IF;
END
IF;
END
PROCESS;
yout
<= q;
c1:
DIVIDER port map(CLK, sq);
end
beh;
เพิ่ม โปรแกรม Divider
Source Code DIVIDER
library
IEEE;
use
IEEE.std_logic_1164.all;
entity
DIVIDER is
generic
(fin: integer := 50000000; fout: integer := 4);
port
(CLK: in std_logic; Q : out std_logic );
end
DIVIDER;
architecture
RTL of DIVIDER is
signal
COUNT : integer range 0 to (fin/(2*fout)) ;
signal
qs : std_logic := '0';
begin
process (CLK) begin
if
CLK'event and CLK = '1' then
if
(COUNT >= (fin/(2*fout)-1)) then
COUNT
<= 0; qs <= not(qs);
else
COUNT <= COUNT +1;
end
if;
end
if;
end
process;
Q
<= qs ;
end RTL;
New Source --> Implementation Constraints File --> ตั้งชื่อไฟล์ --> Next
Implement
Create Bit Stream
-Open Program MoJo Loader
Open Bin File --> เลือกไฟล์ .bin ที่ Folder Project
Click --> Load --> Finish
Lab02 - ไฟวิ่ง 8 ดวง แบบมีสัญญาณควบคุม
การทำงาน
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx-->
Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select VHDL Module
Next --> Finish
Source Code
library
IEEE;
use
IEEE.STD_LOGIC_1164.ALL;
entity
no6 is
port
(sh, lr, reset, clk: in std_logic;
yout
: out std_logic_vector(7 downto 0));
end
no6;
architecture
beh of no6 is
signal
q : std_logic_vector(7 downto 0);
begin
PROCESS (clk,reset) BEGIN
IF(reset
= '0') THEN q <= "00000001";
ELSE
IF(CLK'EVENT and CLK = '1') THEN
IF
sh = '1' THEN IF lr = '0' THEN
q(7)
<= q(0); q(6 downto 0)<=q(7 downto 1);
ELSE
q(0) <= q(7); q(7 downto 1)<=q(6 downto 0);
END
IF;
ELSE
q <= q; END IF;
ELSE
q <= q;
END
IF;
END
IF;
END
PROCESS;
yout
<= q;
end
beh;
กำหนดขาอุปกรณ์
NET "yout<0>" LOC = P134 |
IOSTANDARD = LVTTL;
NET "yout<1>" LOC = P133 | IOSTANDARD = LVTTL;
NET "yout<2>" LOC = P132 | IOSTANDARD = LVTTL;
NET "yout<3>" LOC = P131 | IOSTANDARD = LVTTL;
NET "yout<4>" LOC = P127 | IOSTANDARD = LVTTL;
NET "yout<5>" LOC = P126 | IOSTANDARD = LVTTL;
NET "yout<6>" LOC = P124 | IOSTANDARD = LVTTL;
NET "yout<7>" LOC = P123 | IOSTANDARD = LVTTL;
NET "reset" LOC = P38 | IOSTANDARD = LVTTL;
NET "clk" LOC = P50 | IOSTANDARD = LVTTL;
NET "sh" LOC = P40 | IOSTANDARD = LVTTL;
NET "lr" LOC = P34 | IOSTANDARD = LVTTL;
NET "yout<1>" LOC = P133 | IOSTANDARD = LVTTL;
NET "yout<2>" LOC = P132 | IOSTANDARD = LVTTL;
NET "yout<3>" LOC = P131 | IOSTANDARD = LVTTL;
NET "yout<4>" LOC = P127 | IOSTANDARD = LVTTL;
NET "yout<5>" LOC = P126 | IOSTANDARD = LVTTL;
NET "yout<6>" LOC = P124 | IOSTANDARD = LVTTL;
NET "yout<7>" LOC = P123 | IOSTANDARD = LVTTL;
NET "reset" LOC = P38 | IOSTANDARD = LVTTL;
NET "clk" LOC = P50 | IOSTANDARD = LVTTL;
NET "sh" LOC = P40 | IOSTANDARD = LVTTL;
NET "lr" LOC = P34 | IOSTANDARD = LVTTL;
Create Bit Stream
-Open Program MoJo Loader
Open Bin File --> เลือกไฟล์ .bin ที่ Folder Project
Click --> Load --> Finish
Lab03 - สร้างไฟวิ่ง 8 ดวงออกทาง LED ของ Mojo V3 Board ด้วย Verilog
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx--> Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select Verilog Module
Next --> Finish
Source Code
Lab03 - สร้างไฟวิ่ง 8 ดวงออกทาง LED ของ Mojo V3 Board ด้วย Verilog
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx--> Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select Verilog Module
Next --> Finish
Source Code
`timescale
1ns / 1ps
module
MainTest7Seg(Clk_50MHz, Reset_Onboard, LED_Output);
input
Reset_Onboard, Clk_50MHz;
output
[7:0] LED_Output; reg [3:0] Counter;
reg
[7:0] rLED_Output;
reg
[27:0] Dly_Counter;
always@(posedge
Clk_50MHz or negedge Reset_Onboard ) begin
if(Reset_Onboard
== 0) Counter <= 0;
else
begin
Dly_Counter
<= Dly_Counter + 1'b1;
if(Dly_Counter
>= 6_250_000) begin
Dly_Counter
<= 0;
if(Counter
>= 13) Counter <= 0;
else
Counter <= Counter + 1'b1;
end
end
end
always
@(Counter)
case
(Counter)
4'b0000:
rLED_Output = 8'b10000000;
4'b0001:
rLED_Output = 8'b01000000;
4'b0010:
rLED_Output = 8'b00100000;
4'b0011:
rLED_Output = 8'b00010000;
4'b0100:
rLED_Output = 8'b00001000;
4'b0101:
rLED_Output = 8'b00000100;
4'b0110:
rLED_Output = 8'b00000010;
4'b0111:
rLED_Output = 8'b00000001;
4'b1000:
rLED_Output = 8'b00000000;
4'b1001:
rLED_Output = 8'b11111111;
4'b1010:
rLED_Output = 8'b00000000;
4'b1011:
rLED_Output = 8'b11111111;
4'b1100:
rLED_Output = 8'b00000000;
endcase
assign LED_Output = rLED_Output;
endmodule
Pin Definition File
NET
"Clk_50MHz" LOC = P56 | IOSTANDARD = LVTTL;
NET
"Reset_Onboard" LOC = P38 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P134 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P133 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P132 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P131 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P127 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P126 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P124 | IOSTANDARD = LVTTL;
NET
"LED_Output" LOC = P123 | IOSTANDARD = LVTTL;
Implement
Create Bit Stream
-Open Program MoJo Loader
Open Bin File --> เลือกไฟล์ .bin ที่ Folder Project
Click --> Load --> Finish
Lab04 – การใช้Mode Select ด้วยคำสั่ง Switch
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx--> Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select Verilog Module
Next --> Finish
Source Code
Pin Definition File
Lab04 – การใช้Mode Select ด้วยคำสั่ง Switch
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx--> Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select Verilog Module
Next --> Finish
Source Code
`timescale 1ns
/ 1ps
module MainTest7Seg(Rst_OnBoard, LED_Output,Clk_50MHz);
input Rst_OnBoard,Clk_50MHz;
output [7:0] LED_Output;
reg [7:0] rLED_Output;
reg [27:0] Dly_Counter;
reg [1:0]rMode;
reg state = 0;
always@(negedge Rst_OnBoard) begin
if(rMode == 0)
rMode <= rMode+1;
else if(rMode == 1)
rMode <= rMode+1;
else
rMode <= 0;
end
always@(posedge Clk_50MHz) begin
Dly_Counter <= Dly_Counter + 1'b1;
if(Dly_Counter >= 6_250_000) begin
Dly_Counter <= 0;
if(state)
state <= 0;
else
state <= 1;
end
end
always@(rMode or state) begin
case(rMode)
2'b00: rLED_Output = 8'b00000000;
2'b01: rLED_Output = 8'b11111111;
2'b10: begin
if(state) rLED_Output = 8'b00000000;
else rLED_Output = 8'b11111111;
end
endcase
end
assign LED_Output = rLED_Output;
endmodule
module MainTest7Seg(Rst_OnBoard, LED_Output,Clk_50MHz);
input Rst_OnBoard,Clk_50MHz;
output [7:0] LED_Output;
reg [7:0] rLED_Output;
reg [27:0] Dly_Counter;
reg [1:0]rMode;
reg state = 0;
always@(negedge Rst_OnBoard) begin
if(rMode == 0)
rMode <= rMode+1;
else if(rMode == 1)
rMode <= rMode+1;
else
rMode <= 0;
end
always@(posedge Clk_50MHz) begin
Dly_Counter <= Dly_Counter + 1'b1;
if(Dly_Counter >= 6_250_000) begin
Dly_Counter <= 0;
if(state)
state <= 0;
else
state <= 1;
end
end
always@(rMode or state) begin
case(rMode)
2'b00: rLED_Output = 8'b00000000;
2'b01: rLED_Output = 8'b11111111;
2'b10: begin
if(state) rLED_Output = 8'b00000000;
else rLED_Output = 8'b11111111;
end
endcase
end
assign LED_Output = rLED_Output;
endmodule
Pin Definition File
NET
"Clk_50MHz" LOC = P56 | IOSTANDARD = LVTTL;
NET
"Rst_OnBoard" LOC = P38 | IOSTANDARD = LVTTL |
CLOCK_DEDICATED_ROUTE=FALSE;
NET
"LED_Output<0>" LOC = P134 | IOSTANDARD = LVTTL;
NET
"LED_Output<1>" LOC = P133 | IOSTANDARD = LVTTL;
NET
"LED_Output<2>" LOC = P132 | IOSTANDARD = LVTTL;
NET
"LED_Output<3>" LOC = P131 | IOSTANDARD = LVTTL;
NET
"LED_Output<4>" LOC = P127 | IOSTANDARD = LVTTL;
NET
"LED_Output<5>" LOC = P126 | IOSTANDARD = LVTTL;
NET
"LED_Output<6>" LOC = P124 | IOSTANDARD = LVTTL;
NET
"LED_Output<7>" LOC = P123 | IOSTANDARD = LVTTL;
Implement
Create Bit Stream
-Open Program MoJo Loader
Open Bin File --> เลือกไฟล์ .bin ที่ Folder Project
Click --> Load --> Finish
Lab05 – การใช้Mode Select ด้วยค าสั่ง Switch เพื่อสร้างไฟวิ่ง
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx--> Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select Verilog Module
Next --> Finish
Source Code
`timescale 1ns / 1ps
module MainTest7Seg(Rst_OnBoard, LED_Output,Clk_50MHz);
input Rst_OnBoard,Clk_50MHz;
output [7:0] LED_Output;
reg [7:0] rLED_Output;
reg [27:0] Dly_Counter;
reg [1:0]rMode;
reg [3:0] Counter;
reg state = 0;
always@(negedge Rst_OnBoard) begin
if(rMode == 0)
rMode <= rMode+1;
else if(rMode == 1)
rMode <= rMode+1;
else
rMode <= 0;
end
always@(posedge Clk_50MHz) begin
Dly_Counter <= Dly_Counter + 1'b1;
if(Dly_Counter >= 6_250_000) begin
Dly_Counter <= 0;
if(state)
state <= 0;
else
state <= 1;
end
end
always@(posedge Clk_50MHz) begin
Dly_Counter <= Dly_Counter + 1'b1;
if(Dly_Counter >= 6_250_000) begin
Dly_Counter <= 0;
if(Counter >= 13)
Counter <= 0;
else
Counter <= Counter + 1'b1;
end
end
always@(rMode or Counter) begin
case(rMode)
2'b00: case(Counter)
4'b0000: rLED_Output = 8'b10000000;
4'b0001: rLED_Output = 8'b01000000;
4'b0010: rLED_Output = 8'b00100000;
4'b0011: rLED_Output = 8'b00010000;
4'b0100: rLED_Output = 8'b00001000;
4'b0101: rLED_Output = 8'b00000100;
4'b0110: rLED_Output = 8'b00000010;
4'b0111: rLED_Output = 8'b00000001;
4'b1000: rLED_Output = 8'b00000000;
4'b1001: rLED_Output = 8'b11111111;
4'b1010: rLED_Output = 8'b00000000;
4'b1011: rLED_Output = 8'b11111111;
4'b1100: rLED_Output = 8'b00000000;
endcase
2'b01: case(Counter)
4'b0000: rLED_Output = 8'b10000001;
4'b0001: rLED_Output = 8'b01000010;
4'b0010: rLED_Output = 8'b00100100;
4'b0011: rLED_Output = 8'b00011000;
4'b0100: rLED_Output = 8'b00011000;
4'b0101: rLED_Output = 8'b00100100;
4'b0110: rLED_Output = 8'b01000010;
4'b0111: rLED_Output = 8'b10000001;
4'b1000: rLED_Output = 8'b00000000;
4'b1001: rLED_Output = 8'b11111111;
4'b1010: rLED_Output = 8'b00000000;
4'b1011: rLED_Output = 8'b11111111;
4'b1100: rLED_Output = 8'b00000000;
endcase
2'b10: case(Counter)
4'b0000: rLED_Output = 8'b10000000;
4'b0001: rLED_Output = 8'b00000000;
4'b0010: rLED_Output = 8'b11000000;
4'b0011: rLED_Output = 8'b00000000;
4'b0100: rLED_Output = 8'b11100000;
4'b0101: rLED_Output = 8'b00000000;
4'b0110: rLED_Output = 8'b11110000;
4'b0111: rLED_Output = 8'b00000000;
4'b1000: rLED_Output = 8'b11111000;
4'b1001: rLED_Output = 8'b00000000;
4'b1010: rLED_Output = 8'b11111100;
4'b1011: rLED_Output = 8'b00000000;
4'b1100: rLED_Output = 8'b11111110;
4'b1101: rLED_Output = 8'b00000000;
4'b1110: rLED_Output = 8'b11111111;
endcase
endcase
end
assign LED_Output = rLED_Output;
endmodule
Pin Definition File
Lab05 – การใช้Mode Select ด้วยค าสั่ง Switch เพื่อสร้างไฟวิ่ง
- เปิดโปรแกรม ISE DESIGN WEBPACK 14.7
Create New Project --> Name = Proj001 --> Loc. Dir = D:\xxx --> Wrk. Dir = D:\xxx--> Top-level source type: HDL
Family : Spartan6 --> Device : XC6SLX9 --> Package : TQG144 --> VHDL : VHDL-93
Right Click --> New source
Select Verilog Module
Next --> Finish
Source Code
`timescale 1ns / 1ps
module MainTest7Seg(Rst_OnBoard, LED_Output,Clk_50MHz);
input Rst_OnBoard,Clk_50MHz;
output [7:0] LED_Output;
reg [7:0] rLED_Output;
reg [27:0] Dly_Counter;
reg [1:0]rMode;
reg [3:0] Counter;
reg state = 0;
always@(negedge Rst_OnBoard) begin
if(rMode == 0)
rMode <= rMode+1;
else if(rMode == 1)
rMode <= rMode+1;
else
rMode <= 0;
end
always@(posedge Clk_50MHz) begin
Dly_Counter <= Dly_Counter + 1'b1;
if(Dly_Counter >= 6_250_000) begin
Dly_Counter <= 0;
if(state)
state <= 0;
else
state <= 1;
end
end
always@(posedge Clk_50MHz) begin
Dly_Counter <= Dly_Counter + 1'b1;
if(Dly_Counter >= 6_250_000) begin
Dly_Counter <= 0;
if(Counter >= 13)
Counter <= 0;
else
Counter <= Counter + 1'b1;
end
end
always@(rMode or Counter) begin
case(rMode)
2'b00: case(Counter)
4'b0000: rLED_Output = 8'b10000000;
4'b0001: rLED_Output = 8'b01000000;
4'b0010: rLED_Output = 8'b00100000;
4'b0011: rLED_Output = 8'b00010000;
4'b0100: rLED_Output = 8'b00001000;
4'b0101: rLED_Output = 8'b00000100;
4'b0110: rLED_Output = 8'b00000010;
4'b0111: rLED_Output = 8'b00000001;
4'b1000: rLED_Output = 8'b00000000;
4'b1001: rLED_Output = 8'b11111111;
4'b1010: rLED_Output = 8'b00000000;
4'b1011: rLED_Output = 8'b11111111;
4'b1100: rLED_Output = 8'b00000000;
endcase
2'b01: case(Counter)
4'b0000: rLED_Output = 8'b10000001;
4'b0001: rLED_Output = 8'b01000010;
4'b0010: rLED_Output = 8'b00100100;
4'b0011: rLED_Output = 8'b00011000;
4'b0100: rLED_Output = 8'b00011000;
4'b0101: rLED_Output = 8'b00100100;
4'b0110: rLED_Output = 8'b01000010;
4'b0111: rLED_Output = 8'b10000001;
4'b1000: rLED_Output = 8'b00000000;
4'b1001: rLED_Output = 8'b11111111;
4'b1010: rLED_Output = 8'b00000000;
4'b1011: rLED_Output = 8'b11111111;
4'b1100: rLED_Output = 8'b00000000;
endcase
2'b10: case(Counter)
4'b0000: rLED_Output = 8'b10000000;
4'b0001: rLED_Output = 8'b00000000;
4'b0010: rLED_Output = 8'b11000000;
4'b0011: rLED_Output = 8'b00000000;
4'b0100: rLED_Output = 8'b11100000;
4'b0101: rLED_Output = 8'b00000000;
4'b0110: rLED_Output = 8'b11110000;
4'b0111: rLED_Output = 8'b00000000;
4'b1000: rLED_Output = 8'b11111000;
4'b1001: rLED_Output = 8'b00000000;
4'b1010: rLED_Output = 8'b11111100;
4'b1011: rLED_Output = 8'b00000000;
4'b1100: rLED_Output = 8'b11111110;
4'b1101: rLED_Output = 8'b00000000;
4'b1110: rLED_Output = 8'b11111111;
endcase
endcase
end
assign LED_Output = rLED_Output;
endmodule
Pin Definition File
NET
"Rst_OnBoard" LOC = P38 | IOSTANDARD = LVTTL | CLOCK_DEDICATED_ROUTE
= FALSE;
NET
"Clk_50MHz" LOC = P56 | IOSTANDARD = LVTTL;
NET
"LED_Output<0>" LOC = P134 | IOSTANDARD = LVTTL;
NET
"LED_Output<1>" LOC = P133 | IOSTANDARD = LVTTL;
NET
"LED_Output<2>" LOC = P132 | IOSTANDARD = LVTTL;
NET
"LED_Output<3>" LOC = P131 | IOSTANDARD = LVTTL;
NET
"LED_Output<4>" LOC = P127 | IOSTANDARD = LVTTL;
NET
"LED_Output<5>" LOC = P126 | IOSTANDARD = LVTTL;
NET
"LED_Output<6>" LOC = P124 | IOSTANDARD = LVTTL;
NET
"LED_Output<7>" LOC = P123 | IOSTANDARD = LVTTL;
Implement
Create Bit Stream
-Open Program MoJo Loader
Open Bin File --> เลือกไฟล์ .bin ที่ Folder Project
Click --> Load --> Finish