2021年3月28日 星期日

DE2-115 開發 以 Mod-N Counter為例

 DE2-115 開發 以 Mod-N Counter為例 

設定 N=? 

  # (parameter N = 32,  
     parameter WIDTH = 5)  

module MOD_N_Counter(SW, LEDR, LEDG , CLOCK_50 ,KEY ,HEX0 ,HEX1 ,HEX2,HEX3,HEX4 ,HEX5 ,HEX6,HEX7, GPIO );
 input  [17:0] SW;   // toggle switches
 input  [7:0] KEY;       // Push bottom
 input  CLOCK_50;   //Clock 27MHz , 50Mhz
 output [17:0] LEDR;   // red  LEDS
 output [8:0] LEDG;   // green LEDs
 output [6:0] HEX0,HEX1,HEX2,HEX3; //7-segment display
 output [6:0] HEX4,HEX5,HEX6,HEX7; //7-segment display
 inout  [35:0] GPIO;
 assign HEX0=7'b111_1111;
 assign HEX1=7'b111_1111;
 assign HEX2=7'b111_1111;
 assign HEX3=7'b111_1111;
 assign HEX4=7'b111_1111;
 assign HEX5=7'b111_1111;
 assign HEX6=7'b111_1111;
 assign HEX7=7'b111_1111;

 wire oClk_1MHz,oClk100K,oClk10K,oClk1K,oClk100,oClk10,oClk1 ;
 MHz50_1MHz u1 (CLOCK_50,KEY[0],oClk_1MHz);
 clk_1Hz u2    (oClk_1MHz,KEY[0],oClk100K,oClk10K,oClk1K,oClk100,oClk10,oClk1,oClk01);
 assign LEDR[17]= oClk01;
 
 //oneshot(BUFFER_IN,BUFFER_OUT,CLK);
  modN_ctr(oClk1,KEY[0],LEDR[4:0]);
endmodule
module modN_ctr  
  # (parameter N = 32,  
     parameter WIDTH = 5)  
    ( input   clk,  
    input   rstn,  
    output  reg[WIDTH-1:0] out);  
    always @ (posedge clk) begin  
    if (!rstn) begin  
      out <= 0;  
    end else begin  
      if (out == N-1)  
        out <= 0;  
      else  
        out <= out + 1;  
    end  
  end  
endmodule  
//Clock 50MHz --> 1MHz 
module MHz50_1MHz(Clk_in , Clr , Clk_out);  //除50
input  Clk_in , Clr;  // 一位元輸入
output reg Clk_out;
reg [4:0] cnt=5'b0_0000;
// counter size calculation according to input and output frequencies
parameter sys_clk = 50000000;  // 50 MHz system clock
parameter clkout = 1000000;  // 1 MHz clock output
parameter max = sys_clk / (2*clkout); // max-counter size
always@(posedge Clk_in or negedge Clr ) begin
  if (~Clr)
     begin
cnt <= 0;
     end
  else if (cnt == max-1 )
     begin
cnt <= 0;
Clk_out <= ~Clk_out;
     end
  else
     begin
cnt <= cnt + 1'd1;
     end
end
endmodule
// Ch10 clk_1Hz.v
// 由 10M Hz 除頻至 1 Hz
module clk_1Hz (Clk1M,Clr,Clk100K,Clk10K,Clk1K,Clk100,Clk10,Clk1,Clk01);
input  Clk1M,Clr;  // 一位元輸入
output Clk100K,Clk10K,Clk1K,Clk100,Clk10,Clk1,Clk01; // 一位元輸出
div10 D2 (Clk1M  , Clr, Clk100K);
div10 D3 (Clk100K, Clr, Clk10K );
div10 D4 (Clk10K , Clr, Clk1K  );
div10 D5 (Clk1K  , Clr, Clk100 );
div10 D6 (Clk100 , Clr, Clk10  );
div10 D7 (Clk10  , Clr, Clk1   );
div10 D8 (Clk1   , Clr, Clk01  );
endmodule
// Ch10 div10.v
// 除頻 /10
module div10 (Clk_i,Clr,Clk_o);
input  Clk_i,Clr; // 一位元輸入
output Clk_o;  // 一位元輸出
reg    Clk_o;  // 宣告為暫存器資料
reg    [3:0] Q;  // 宣告為暫存器資料
// MOD-10 (BCD) 除頻
always@ (posedge Clk_i or negedge Clr)
  if (~Clr )
Q = 0;
  else if (Q == 9)
Q = 0;
  else   
    Q = Q + 1;
// 形成對稱方波
always@ (Q)
  if (Q <= 4)  
Clk_o  = 0;
  else          
Clk_o  = 1;
endmodule


DE2-115 開發 以 4bit Johnson Counter為例

 DE2-115 開發 以 4bit Johnson Counter為例



module Jhonson_counter (SW, LEDR, LEDG , CLOCK_50 ,KEY ,HEX0 ,HEX1 ,HEX2,HEX3,HEX4 ,HEX5 ,HEX6,HEX7, GPIO );
 input  [17:0] SW;   // toggle switches
 input  [7:0] KEY;       // Push bottom
 input  CLOCK_50;   //Clock 27MHz , 50Mhz
 output [17:0] LEDR;   // red  LEDS
 output [8:0] LEDG;   // green LEDs
 output [6:0] HEX0,HEX1,HEX2,HEX3; //7-segment display
 output [6:0] HEX4,HEX5,HEX6,HEX7; //7-segment display
 inout  [35:0] GPIO;
 assign HEX0=7'b111_1111;
 assign HEX1=7'b111_1111;
 assign HEX2=7'b111_1111;
 assign HEX3=7'b111_1111;
 assign HEX4=7'b111_1111;
 assign HEX5=7'b111_1111;
 assign HEX6=7'b111_1111;
 assign HEX7=7'b111_1111;

 wire oClk_1MHz,oClk100K,oClk10K,oClk1K,oClk100,oClk10,oClk1 ;
 MHz50_1MHz u1 (CLOCK_50,KEY[0],oClk_1MHz);
 clk_1Hz u2    (oClk_1MHz,KEY[0],oClk100K,oClk10K,oClk1K,oClk100,oClk10,oClk1,oClk01);
 assign LEDR[17]= oClk01;
 
 //oneshot(BUFFER_IN,BUFFER_OUT,CLK);
  johnson_ctr(oClk1,SW[0],LEDR[3:0]);
endmodule
module johnson_ctr #(parameter WIDTH=4)  
  (  
    input clk,  
    input rstn,  
    output reg [WIDTH-1:0] out  
  );  
  integer i=0;
  always @ (posedge clk) begin  
      if (!rstn)  
         out <= 1;  
      else begin  
        out[WIDTH-1] <= ~out[0];  
        for ( i = 0; i < WIDTH-1; i=i+1) begin  
          out[i] <= out[i+1];  
        end  
      end  
  end  
endmodule  
//Clock 50MHz --> 1MHz 
module MHz50_1MHz(Clk_in , Clr , Clk_out);  //除50
input  Clk_in , Clr;  // 一位元輸入
output reg Clk_out;
reg [4:0] cnt=5'b0_0000;
// counter size calculation according to input and output frequencies
parameter sys_clk = 50000000;  // 50 MHz system clock
parameter clkout = 1000000;  // 1 MHz clock output
parameter max = sys_clk / (2*clkout); // max-counter size
always@(posedge Clk_in or negedge Clr ) begin
  if (~Clr)
     begin
cnt <= 0;
     end
  else if (cnt == max-1 )
     begin
cnt <= 0;
Clk_out <= ~Clk_out;
     end
  else
     begin
cnt <= cnt + 1'd1;
     end
end
endmodule
// Ch10 clk_1Hz.v
// 由 10M Hz 除頻至 1 Hz
module clk_1Hz (Clk1M,Clr,Clk100K,Clk10K,Clk1K,Clk100,Clk10,Clk1,Clk01);
input  Clk1M,Clr;  // 一位元輸入
output Clk100K,Clk10K,Clk1K,Clk100,Clk10,Clk1,Clk01; // 一位元輸出
div10 D2 (Clk1M  , Clr, Clk100K);
div10 D3 (Clk100K, Clr, Clk10K );
div10 D4 (Clk10K , Clr, Clk1K  );
div10 D5 (Clk1K  , Clr, Clk100 );
div10 D6 (Clk100 , Clr, Clk10  );
div10 D7 (Clk10  , Clr, Clk1   );
div10 D8 (Clk1   , Clr, Clk01  );
endmodule

// Ch10 div10.v
// 除頻 /10
module div10 (Clk_i,Clr,Clk_o);
input  Clk_i,Clr; // 一位元輸入
output Clk_o;  // 一位元輸出
reg    Clk_o;  // 宣告為暫存器資料
reg    [3:0] Q;  // 宣告為暫存器資料
// MOD-10 (BCD) 除頻
always@ (posedge Clk_i or negedge Clr)
  if (~Clr )
Q = 0;
  else if (Q == 9)
Q = 0;
  else   
    Q = Q + 1;
// 形成對稱方波
always@ (Q)
  if (Q <= 4)  
Clk_o  = 0;
  else          
Clk_o  = 1;
endmodule

DE2-115 開發 以 10bit Ring Counter為例

 DE2-115 開發 以  10bit Ring Counter為例

參考來源https://www.javatpoint.com/verilog-ring-counter

module Ring_counter (SW, LEDR, LEDG , CLOCK_50 ,KEY ,HEX0 ,HEX1 ,HEX2,HEX3,HEX4 ,HEX5 ,HEX6,HEX7, GPIO );
 input  [17:0] SW;   // toggle switches
 input  [7:0] KEY;       // Push bottom
 input  CLOCK_50;   //Clock 27MHz , 50Mhz
 output [17:0] LEDR;   // red  LEDS
 output [8:0] LEDG;   // green LEDs
 output [6:0] HEX0,HEX1,HEX2,HEX3; //7-segment display
 output [6:0] HEX4,HEX5,HEX6,HEX7; //7-segment display
 inout  [35:0] GPIO;

 assign HEX0=7'b111_1111;
 assign HEX1=7'b111_1111;
 assign HEX2=7'b111_1111;
 assign HEX3=7'b111_1111;
 assign HEX4=7'b111_1111;
 assign HEX5=7'b111_1111;
 assign HEX6=7'b111_1111;
 assign HEX7=7'b111_1111;


 wire oClk_1MHz,oClk100K,oClk10K,oClk1K,oClk100,oClk10,oClk1 ;
 MHz50_1MHz u1 (CLOCK_50,KEY[0],oClk_1MHz);
 clk_1Hz u2    (oClk_1MHz,KEY[0],oClk100K,oClk10K,oClk1K,oClk100,oClk10,oClk1,oClk01);
 assign LEDR[17]= oClk01;
 
 //oneshot(BUFFER_IN,BUFFER_OUT,CLK);
  ring_ctr_10(oClk1,SW[0],LEDR[9:0]);
endmodule

module ring_ctr_10  #(parameter WIDTH=10)   
  (    
    input clk,                  
    input rstn,  
    output reg [WIDTH-1:0] out  
  );      
  integer i=0; 
  always @ (posedge clk) begin  
      if (!rstn)  
         out <= 1;  
      else begin  
        out[WIDTH-1] <= out[0];  
        for (i=0; i<WIDTH-1; i=i+1) begin  
          out[i] <= out[i+1];  
        end  
      end  
  end  
endmodule  

//Clock 50MHz --> 1MHz 

module MHz50_1MHz(Clk_in , Clr , Clk_out);  //除50
input  Clk_in , Clr;  // 一位元輸入
output reg Clk_out;

reg [4:0] cnt=5'b0_0000;
// counter size calculation according to input and output frequencies
parameter sys_clk = 50000000;  // 50 MHz system clock
parameter clkout = 1000000;  // 1 MHz clock output
parameter max = sys_clk / (2*clkout); // max-counter size
always@(posedge Clk_in or negedge Clr ) begin
  if (~Clr)
     begin
cnt <= 0;
     end
  else if (cnt == max-1 )
     begin
cnt <= 0;
Clk_out <= ~Clk_out;
     end
  else
     begin
cnt <= cnt + 1'd1;
     end
end
endmodule

// Ch10 clk_1Hz.v
// 由 10M Hz 除頻至 1 Hz

module clk_1Hz (Clk1M,Clr,Clk100K,Clk10K,Clk1K,Clk100,Clk10,Clk1,Clk01);
input  Clk1M,Clr;  // 一位元輸入
output Clk100K,Clk10K,Clk1K,Clk100,Clk10,Clk1,Clk01; // 一位元輸出
div10 D2 (Clk1M  , Clr, Clk100K);
div10 D3 (Clk100K, Clr, Clk10K );
div10 D4 (Clk10K , Clr, Clk1K  );
div10 D5 (Clk1K  , Clr, Clk100 );
div10 D6 (Clk100 , Clr, Clk10  );
div10 D7 (Clk10  , Clr, Clk1   );
div10 D8 (Clk1   , Clr, Clk01  );
endmodule


// Ch10 div10.v
// 除頻 /10
module div10 (Clk_i,Clr,Clk_o);
input  Clk_i,Clr; // 一位元輸入
output Clk_o;  // 一位元輸出
reg    Clk_o;  // 宣告為暫存器資料
reg    [3:0] Q;  // 宣告為暫存器資料
// MOD-10 (BCD) 除頻
always@ (posedge Clk_i or negedge Clr)
  if (~Clr )
Q = 0;
  else if (Q == 9)
Q = 0;
  else   
    Q = Q + 1;
// 形成對稱方波
always@ (Q)
  if (Q <= 4)  
Clk_o  = 0;
  else          
Clk_o  = 1;
endmodule


DE2-115 開發 以 4 TO 10 Decoder 74145 為例

 DE2-115 開發 以 4 TO 10  Decoder 74145 為例




module x74145_4x10_deocder(SW, LEDR, LEDG , CLOCK_50 ,KEY ,HEX0 ,HEX1 ,HEX2,HEX3,HEX4 ,HEX5 ,HEX6,HEX7, GPIO );
 input  [17:0] SW;   // toggle switches
 input  [7:0] KEY;       // Push bottom
 input  CLOCK_50;   //Clock 27MHz , 50Mhz
 output [17:0] LEDR;   // red  LEDS
 output [8:0] LEDG;   // green LEDs
 output [6:0] HEX0,HEX1,HEX2,HEX3; //7-segment display
 output [6:0] HEX4,HEX5,HEX6,HEX7; //7-segment display
 inout  [35:0] GPIO;
 assign HEX0=7'b111_1111;
 assign HEX1=7'b111_1111;
 assign HEX2=7'b111_1111;
 assign HEX3=7'b111_1111;
 assign HEX4=7'b111_1111;
 assign HEX5=7'b111_1111;
 assign HEX6=7'b111_1111;
 assign HEX7=7'b111_1111;
 
 //decoder2to4_Behavioral (i, d) ;
 decoder4to10_Behavioral(SW[3:0],LEDR[9:0]);
 
endmodule
//Behavioral Modeling 
module decoder4to10_Behavioral (i, d) ;
input  [3:0]i;
output [9:0]d;
reg [9:0] d;
always @ (i )
case (i)
0: d = 10'b11_1111_1110;
1: d = 10'b11_1111_1101;
2: d = 10'b11_1111_1011;
3: d = 10'b11_1111_0111;
4: d = 10'b11_1110_1111;
5: d = 10'b11_1101_1111;
6: d = 10'b11_1011_1111;
7: d = 10'b11_0111_1111;
8: d = 10'b10_1111_1111;
9: d = 10'b01_1111_1111;

default d = 10'b11_1111_1111;
endcase
endmodule

DE2-115 開發 以 2to4 Decoder 74139 為例

DE2-115 開發 以 2to4 Decoder 74139 為例 






module Decoder_2x4_74139 (SW, LEDR, LEDG , CLOCK_50 ,KEY ,HEX0 ,HEX1 ,HEX2,HEX3,HEX4 ,HEX5 ,HEX6,HEX7, GPIO );
 input  [17:0] SW;   // toggle switches
 input  [7:0] KEY;       // Push bottom
 input  CLOCK_50;   //Clock 27MHz , 50Mhz
 output [17:0] LEDR;   // red  LEDS
 output [8:0] LEDG;   // green LEDs
 output [6:0] HEX0,HEX1,HEX2,HEX3; //7-segment display
 output [6:0] HEX4,HEX5,HEX6,HEX7; //7-segment display
 inout  [35:0] GPIO;
 assign HEX0=7'b111_1111;
 assign HEX1=7'b111_1111;
 assign HEX2=7'b111_1111;
 assign HEX3=7'b111_1111;
 assign HEX4=7'b111_1111;
 assign HEX5=7'b111_1111;
 assign HEX6=7'b111_1111;
 assign HEX7=7'b111_1111;
 
 //decoder2to4_Structural (xl, x0, e, d);
 decoder2to4_Structural(SW[1],SW[0],SW[2],LEDR[3:0]);
 
 //decoder2to4_Dataflow(in,en,y);
 decoder2to4_Dataflow(SW[5:4],SW[6],LEDR[7:4]);
 
 //decoder2to4_Behavioral (e, i, d) ;
 decoder2to4_Behavioral(SW[10],SW[9:8],LEDR[11:8]);
 
endmodule
//Structural Modeling
// Structural description of a 2-to-4 decoder
module decoder2to4_Structural (xl, x0, e, d);
input xl, x0, e;
output [3:0] d; //output vector d must be declared as wire.
wire [3:0] d; //if vector d is not declared as wire, Verilog
wire xll, x00; //will make vector d one bit by default.
not invl (xl1, xl);
not inv2 (x00, x0);

and andl (d[0], xl1, x00, e);
and and2 (d[1], xl1, x0 , e);
and and3 (d[2], xl , x00, e);
and and4 (d[3], xl , x0 , e);
endmodule 
//Dataflow Modeling 
module decoder2to4_Dataflow(in,en,y);
input [1:0]in;
input en;
output [3:0]y;

assign y[0]= (~in[1]) & (~in[0])  & en;
assign y[1]= (~in[1]) & in[0]     & en;
assign y[2]=    in[1] & (~ in[0]) & en;
assign y[3]=    in[1] & in[0]     & en;
endmodule
//Behavioral Modeling 
module decoder2to4_Behavioral (e, i, d) ;
output [3:0]d;
input  [1:0]i;
input e;
reg [3:0] d;
always @ (i or e)
if (e==1)
begin
case (i)
0: d = 4'b1110;
1: d = 4'b1101;
2: d = 4'b1011;
3: d = 4'b0111;
default d = 4'bxxxx;
endcase
end
else
d = 4'b0000;
endmodule

2021年3月27日 星期六

02-FPGA设计流程介绍

 

02-FPGA设计流程介绍——小梅哥FPGA设计思想与验证方法视频教程配套文档

https://www.cnblogs.com/xiaomeige/p/5500896.html

芯航线——普利斯队长精心奉献

课程目标: 1.了解并学会FPGA开发设计的整体流程

2.设计一个二选一选择器并进行功能仿真、时序仿真以及板级验证

实验平台:芯航线FPGA开发板、杜邦线

实验内容:

良好的文件夹设置以及工程管理是一个好的FPGA设计的基础,在学习之初就建立俩良好的习惯,会少走一些弯路。因此我们首先在新建的工程文件夹下面,分别建立如图2-1所示的子文件夹。

2-1 FPGA工程子文件夹

上图中,prj为工程文件存放目录;rtlverilog可综合代码存放目录;testbench为测试文件的存放目录;img为设计相关图片存放目录;doc为设计相关文档存放目录;ip文件夹存放quartus ii中生成的ip核文件。

建立工程

打开安装好的Quartus II软件,软件启动界面如图2-2所示

2-2 Quartus II启动界面

首先在这里单击Creat a New Project来新建一个工程向导。界面如图2-3所示。

2-3 工程路径设置以及命名

第二步,添加已有设计文件。如没有可直接点击Nxet,本次单击Nxet

2-4 工程中添加相关设计文件

第三步,选择器件。在这里选择芯航线FPGA开发板上的Cyclone IV E系列的EP4CE10F17C8。这里可在右面红色框内可以添加限定条件来减少需要翻看器件的书目。

2-5 设置工程用器件

第四步,EDA工具的设定。从上依次是综合工具、仿真工具、形式验证工具以及板级验证工具。可根据实际情况自行设定。在这里根据自己安装情况将仿真工具设置为Modelsim-Altera或者Modelsim,语言选择Verilog HDL

2-6 EDA工具设定

第五步,单击Finish完成工程的建立,至此一个FPGA的工程已经建立完毕。

设计输入

工程建立完成后,需要为工程添加新的设计文件,单击File—New—Verilog HDL File,或者工具栏中的New,弹出图2-7-2的选择框。此处选择Design Files中的Verilog HDL File

2-7-1 新建设计文件图2-7-2 新建设计文件选择框

 

新的文件建立完成,输入以下设计,并已led_text.v命名保存到工程所在的rtl文件下。

module led_test(a,b,key_in,led_out);

 

input a;//输入端口A

input b;//输入端口B

 

input key_in; //按键输入,实现输入输入通道的选择

 

output led_out; //led 控制端口

 

//key_in == 0 led_out = a

 

assign led_out = (key_in == 0)? a : b;

 

endmodule

 

分析和综合

 

单击工具栏中的Start Analysis & Synthesis来进行分析和综合。如在设计过程有失误的地方,在分析和综合后会提示Error或者Warning,需针对不同情况进行修改。芯航线汇总了常见的问题以及解决方式,可以参考用户手册并针对性解决。

2-8 分析和综合

全编译后可以在RTL Viewer中可以看到图2-9所示的硬件逻辑电路。即为一个二选一选择器,符合预期设计。

2-9 RTL Viewer

功能仿真

 

为了验证以上逻辑设计是否成功,在直接下载到开发板观察之前需编写激励文件,此处再新建一个.v文件输入以下内容。并以led_test_tb.v保存到工程对应的testbench文件夹下。并再次进行分析和综合查看是否存在语法设计错误。

`timescale 1ns/1ps

 

module led_test_tb;

 

//激励信号定义,对应连接到待测试模块的输入端口

reg signal_a;

reg signal_b;

reg signal_c;

 

//待检测信号定义,对应连接到待测试模块的输出端口

wire led;

 

//例化待测试模块

led_test led_test0(

.a(signal_a),

.b(signal_b),

.key_in(signal_c),

.led_out(led)

);

 

//产生激励

initial begin

signal_a = 0;signal_b = 0;signal_c = 0;

#100;//延时100ns

signal_a = 0;signal_b = 0;signal_c = 1;

#100;

signal_a = 0;signal_b = 1;signal_c = 0;

#100;

signal_a = 0;signal_b = 1;signal_c = 1;

#100;

signal_a = 1;signal_b = 0;signal_c = 0;

#100;

signal_a = 1;signal_b = 0;signal_c = 1;

#100;

signal_a = 1;signal_b = 1;signal_c = 0;

#100;

signal_a = 1;signal_b = 1;signal_c = 1;

#200;

$stop;

end

 

endmodule

 

设置仿真脚本

 

单击标题栏的Assignments—Settings—Simulation,查看仿真工具以及语言是否与之前一致否则进行相应修改。选中Compile test bench单击Test Benches后点击OK。可以看到如图2-10界面。

2-10-1 仿真脚本设置

2-10-2 新建激励

点击New会弹出如图2-11所示的testbench设置文件对话框,找到已经编写好的激励文件,单击Add。在Test bench name中填写对应的激励名称。点击OK后回到主界面

 

2-11 测试激励设置

单击Tools—Run Simulation Tool—RTL Simulation或者单击工具栏中的RTL Simulation来进行前仿真也就是常说的功能仿真。

2-12 开启功能仿真

如出现如图2-13对话框,即提示仿真软件路径报错,可在Tools—Options—EDA Tool Options设置对应的仿真软件的路径即可,如图2-14所示。

2-13 错误信息示例

2-14 设置EDA工具的链接

至此即可在仿真软件modelsim中看到如图2-15的波形文件,可以看出符合当key_in等于0led_out等于a,当key_in等于1led_out等于b。即功能仿真通过。

2-15 功能仿真波形

如没有出现预期波形可针对具体问题具体分析,芯航线也汇总了一部分常见问题及解决办法,此部分详细内容也可以参考用户手册相关内容。

 

布局布线

 

点击QII主界面的Start Compilation,进行综合&布局布线。布局布线过程中如遇出错,针对相应情况具体修改。

2-16 布局布线

时序仿真

点击Tools—Run Simulation Tool—Gate Leval Simulation或者工具栏点击Gate Leval Simulation进行后仿真也就是门级仿真。

2-17 门级仿真

弹出选择时序模型对话框,可针对相应情况具体选择。此时可选择第一个,慢速工作温度为85摄氏度内核供电1.2V的情况进行仿真。

2-18 仿真模型设置

Modelsim中可以看到类似图2-19的波形,存在不希望存在的脉冲。且在200ns时的led相对输入信号有一定时间的逻辑延时。

2-19 时序仿真波形

 

IO分配以及生成配置文件

 

在标题栏中Assignments—Pin Planner或者直接单击进行IO分配亦或者编写tcl文件,此处需针对不同板卡进行不同的设置。

2-20 Pin Planner

芯航线开发板的引脚分配可以在附赠资料中查到,最终的配置如图2-21所示。

2-21 分配好的引脚

在分配好引脚后,仍需进行一次全编译才能使管脚分配生效。

 

配置FPGA下载

 

单击工具栏中的Programmer

2-22 Programmer

弹出以下对话框,单击Start即可将设计好的逻辑下载到开发板中。通过按键以及两根杜邦线控制E8F8接入不同的电压值可以观测到led灯具有不同的亮灭效果。

图2-23 下载界面

FPGA也支持多种下载方式,不同下载方式的具体操作可参见开发板附赠中的用户手册。

如在下载过程中出现其他情况,可查询芯航线附赠的用户手册相关章节进行解决,此处不再详述。

至此一个基本的FPGA设计开发流程介绍完毕。

 

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...