原创 FPGA培训白板整理--Quartous 入门

2010-10-24 15:08 1567 7 7 分类: FPGA/CPLD

这些事我参加培训的白板整理,与大家分享。


一、实验板介绍以及重要的编成思想
(一)电源:
1.外部电压:5.0V--10V
2.核心电压:芯片电压1.2V,
  芯片是Cyclone系列
(二)IIC
1.两个重要的针脚:SCL和SDA(怎样产生起始位和停止位)
2.仲裁(时钟低电平周期的长度)
(三)PS2接口--鼠标和键盘接口
1、PS2协议
2、模块之间的调用
(四)RS232
1.RS232通讯协议:Txd,Rxd
2.其中编程思想要学到的:
(1)时隙的使用。
(2)状态机的嵌套使用,状态机的依次执行和按条件
执行。
(五)EEPROM--怎样通过IIC读写EEPROM
(六)矩阵键盘--和行列扫描法相比,有什么样的差异。
(七)蜂鸣器--分频,状态机,使用状态机简化代码
(八)数码管--扫描输出,段和位的控制
(九)LED---动态扫描,分组扫描
(十)拨码开关:和LED灯编程,体现位的拼接和拆分
(十一)有源晶振--注意和无源晶振的区别
(十二)显示LCD--函数的使用,标志,位的拼接,针脚的
控制。字符型和图形液晶针脚控制的区别。
(十三)VGA--行同步和场同步



二、Quartus软件介绍
(一)Project Navigator:
Files:列出的是主要的文件
  .v文件,非常重要的源文件


(二)菜单栏介绍
1.File
(1)New File--
     1)Design File
      Verilog HDL File
2.New Project Wizard注意如下
   1)工程的路径不要含中文名
   2)工程尽量建在Quartus安装目录下
   3)工程名和顶层文件名要一致
   4)芯片的Family和具体型号要指定
3.Project:
    Add/Remove Files From Project,增加或删除文件
4.Processing  操作流程
1)Start Copilation
2)start--start Anylysis &Synthesis
5.Tools
(1)Programmer--调试和烧写工具
1)要在Hardware setup里选一下硬件,即使用并口下载还是用usb下载
2)Mode:
A.JTAG模式:使用的是.sof文件,烧写到仿真器的RAM里
B.AS模式:使用的文件是.pof格式的文件,“Program Configure”,"Verify","Blank Check"要勾选
          烧写到EEPROM,注意要用"add file"按钮添加文件



三、程序剖析
(一)新建一个完整的工程
1.用Project Wizard建立一个工程的框架
2.添加源文件,只需要添加.v
3.修改.QSF文件
注意:
(1)set_global_assignment -name VERILOG_FILE ledwater.v(要和工程中的一致)
(2)set_global_assignment -name TOP_LEVEL_ENTITY ledwater(顶层文件名)
(3)set_global_assignment -name FAMILY Cyclone (什么系列)
(4)set_global_assignment -name DEVICE EP1C3T144C8(具体型号)
(5)set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED" (把未使用的针脚设置为三态)
(6)
set_location_assignment PIN_16 -to clk       
set_location_assignment PIN_74 -to dataout[0]
set_location_assignment PIN_76 -to dataout[1]
set_location_assignment PIN_78 -to dataout[2]
set_location_assignment PIN_82 -to dataout[3]
set_location_assignment PIN_84 -to dataout[4]
set_location_assignment PIN_72 -to dataout[5]
set_location_assignment PIN_75 -to dataout[6]
set_location_assignment PIN_77 -to dataout[7]
set_location_assignment PIN_79 -to dataout[8]
set_location_assignment PIN_83 -to dataout[9]
set_location_assignment PIN_85 -to dataout[10]
set_location_assignment PIN_71 -to dataout[11]
set_location_assignment PIN_144 -to rst


---------------
module ledwater(clk,rst,dataout);  //驱动源,输入输出,寄存器变量和网络变量不约束管脚


input clk,rst;
output[11:0] dataout;
reg[11:0] dataout;


reg[22:0] cnt;


always@(posedge clk)
begin
 if(!rst) begin
  cnt<=0;
  dataout<=12'b111110_011111;
  end
 else begin
  cnt<=cnt+1;
  if(cnt==23'h7fffff) begin
   dataout[4:0]<=dataout[5:1];
   dataout[5]<=dataout[0];
   dataout[11:7]<=dataout[10:6];
   dataout[6]<=dataout[11];
   end
  end
end


endmodule


注意:
1)约束的是驱动源里面的东西
2)当变量当变量的位宽大于1时,每个位宽都要约束针脚,位宽和针脚的对应关系能改变程序的运行结果
3)时钟和复位针脚是必不可少的
4)约束针脚对应的信号的名字可任意去,但要和源文件保持一致。


(二).v的文件的书写规范
1.必须有一个module
(1)格式
module name(驱动源--分输入和输出两部分,时钟和复位必须有,且作为输入);
//name必须和顶层名称一致,若工程中再加入.v文件,则新加入的.v的文件的module名称不能和顶层文件名一致
endmodule //无分号
(2)一个module块,可以插入另一个module块,但不允许并列
2.声明
(1)尽量在前面一次性声明好所有变量
(2)主要声明:
1)输入和输出:驱动源里面的东西,分别声明他们的类型,和位宽,位宽是1的可以不指明位宽,位宽不一定从0开始。
2)寄存器变量:
A.寄存器变量的作用为储值
B.一般把输出设为寄存器变量
C.寄存变量的声明较自由
3)网络型变量:wire 和tri
A.对变化非常敏感
B.不储值
C.一般和assign配合使用
4)Parameter:
parameter start=4'b0000, //开始
         first=4'b0001, //第1位
  second=4'b0010,//第2位
A.把一个难记的值用一个容易识别的字符代替,类似于c语言中的#define
B.经常和状态机配合使用
5)assign:
A.assign后面跟的是一个表达式,表达的是参数之间的关系。
B.assign经常和三目运行结合在一起使用
assign sda=(link)? sda_buf:1'bz;
是唯一一个可以在always块外使用的条件表达式。
3.always语句块


always@(posedge clk or negedge rst)
begin
 if(!rst)
  cnt_delay<=0;
 else begin
  if(start_delaycnt) begin
   if(cnt_delay!=20'd800000)
    cnt_delay<=cnt_delay+1;
   else
    cnt_delay<=0;
   end
  end
end
(1)always块之间是并发执行的
(2)格式:
alway@() //触发always块执行的敏感条件,触发条件可以是除驱动源外的,寄存器变量和网络变量,单个变量或多个变量也可以作为触发条件。
begin


end
注意:
任何条件都能触发的写法:
A.
alway@(*)
begin
end
B.always
  begin
  end
3.always块--续
module ledwater(clk,rst,dataout);


input clk,rst;
output[11:0] dataout;
reg[11:0] dataout;


reg[22:0] cnt;


always@(posedge clk)
begin
 if(!rst) begin
  cnt<=0;
  dataout<=12'b111110_011111;
  end
 else begin
  cnt<=cnt+1;
  if(cnt==23'h7fffff) begin
   dataout[4:0]<=dataout[5:1];
   dataout[5]<=dataout[0];
   dataout[11:7]<=dataout[10:6];
   dataout[6]<=dataout[11];
   end
  end
end


endmodule
注意:
(1)always块中尽量使用非阻塞赋值
   1).非阻塞赋值的特性:
   A.always块运行完后才赋值
   B.非阻塞赋值,值的传递,要在下一个赋值动作产生后,上一个赋值结果才生效。
2)阻塞赋值:赋值后,结果马上产生
always@(posedge clk) begin
     b<=a;
     c<=b;
end


always@(posedge clk) begin
     b=a;
     c=b;
end
(2)复合语句块
1)begin
  end
顺序执行
2)fork
join
并发执行的
4.函数
 function [7:0] ddram;
  input [5:0] n;
  begin
   case(n)
   6'b000_000:ddram=8'b0100_1100;   //L
   6'b000_001:ddram=8'b0110_1001;   //i  
   6'b000_010:ddram=8'b0110_0011;   //c
   6'b000_011:ddram=8'b0110_1000;   //h
   6'b000_100:ddram=8'b0110_0101;   //e
   6'b000_101:ddram=8'b0110_1110;   //n
   6'b000_110:ddram=8'b0100_1100;   //L
   6'b000_111:ddram=8'b0110_1001;   //i
   6'b001_000:ddram=8'b0110_0011;   //c
   6'b001_001:ddram=8'b0110_1000;   //h
   6'b001_010:ddram=8'b0110_0101;   //e
   6'b001_011:ddram=8'b0110_1110;   //n
   endcase
  end
 endfunction
(1)格式:
function 位宽 函数名 //位宽如果省略,那么它的位宽是当前机器的位宽。一般是32位。
input 位宽 输入名;  //至少有一个输入,只能有一个输出,输出默认是函数名。
begin


end


endfuction
(2)调用方式
data<=ddram(address);
5.任务
(1)格式
task <任务名称>
<任务的参数>
<语句区>
endtask结束
(2)任务的特性:
1)至少有一个输入,可以有多个输出
2)任务可以调用函数,但函数不可以调用任务
(三)多个.v的文件之间如何调用
1.在一个工程中有多个.v的文件要遵循的规则
(1)一个顶层文件,多个从文件(sub)
(2) module之间的调用要遵循的原则:顶层module调用从属module,从属module不
    可以调用顶层module
(3)在参数调用的过程中要遵循的原则:
   A.从属模块的驱动源的输出参数,才能输出给顶层module
   B.顶层module的驱动源、寄存器变量和网络变量都可以接受从属module传输过来的数据。
2.怎样调用
(1)要调用的从属模块.v的文件在工程中
     div16 name(.clk_16(clk));
     从属模块名 自定义的名称(.从属模块接口名称(主模块接口的名称));
(2)要调用的从属模块不在工程中
     'include "DIV16.v"
    div16 name(.clk_16(clk));

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条