Week05_Mojo V3 - Mojo V3 Start, Verilog and VHDL

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






Next --> Finish






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;


 Implement



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


`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


`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

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


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