tag 标签: fpga学习

相关帖子
相关博文
  • 热度 16
    2015-3-24 23:26
    941 次阅读|
    0 个评论
    用两天时间把verilog语法基础篇都学完了,今天总结一下   /************************************************************************************************* /*内容:verilog语法基础篇(二) /*作者:李白 /*时间:2014-3-24 /************************************************************************************************* 一、赋值语句和块语句 1、verilog中有两种赋值方式: (1)非阻塞赋值方式(如b=a;) 注意:在语句块中上面语句所附变量值不能立即为下面的语句所用;           块语句结束后才能完成这次赋值操作,所赋的变量值是上一次赋值得到的;           是编写可综合时许逻辑电路模块做常用的赋值方法 (2)阻塞赋值(如b=a) 注意:赋值语句完成后块才结束           b在赋值语句结束后立马变化  在时序逻辑电路中可能产生意想不到结果 注意区分非阻塞语句和阻塞语句的作用,一个是等块语句结束后才变化,一个是赋值后立马变化 /*************************************************************************************************/ 二、块语句 块语句分为两种:一种为顺序快(begin-end),另一种是并行执行块(fork-join) 1、begin-end语句 相当于C语言中的大括号{ },块内的语句都是顺序执行的,一条语句的延迟时间是相对于他的仿真时间而言的,只有最后一条语句执行完了以后才跳出块语句。 2、fork-join语句 块中的每一条语句中都是并行执行的,即同时执行的,只不过有的语句自己加了延时,所以就相对延时时间往后推移。 /**************************************************************************************************/ 三、条件语句(if-else语句) if - else语句基本上和c语言中的用法差不多,这里只记录要注意的地方 (1)条件语句只在工程块中使用,即在initial(现在简单理解为所有initial语句都是并行执行的,并且只执行一次)和always语句中(语句一直执行知道条件不满足,所有的always块也是并行执行的)。除了这两种语句外的其他模块都不能编写条件语句。 (2)系统对表达式进行判断,若为0,x,z则按假处理,若为1则按真处理。 (3)在always块中要注意正确使用if - else语句 eg: always @ (a or b)      begin              if(a)   q=d;      end   或产生锁存器,因为在给定的条件下没有赋值没这个变量还保持原值。 eg: always @ (a or b)      begin              if(a)   q=d;             else   q=0;      end   正常,不会产生锁存器;通过这个例子以后一定要注意代码的完整性! if-else语句其他用法和C都差不多。 /**************************************************************************************************/ 四、case语句 1、case语句一般用于微处理器的指令译码,它的一般形式如下 (1)case(表达式) endcase (2)casez(表达式)          endcase//不考虑高阻态z的比较过程 (3)case**x(表达式)          endcase//不考虑高阻态z和不定态x 2、defiault项可有可无,但最多只有一个 3、case分项必须不相同,否则会出现问题。 4、如果在所有的可能中没有包含全,还没有default。这种情况下就会产生锁存器。 /***********************************************************************************************/ 五、循环语句 verilog中有4中循环语句 1、forever语句:连续执行语句 格式如下: forever      语句; 或 forever    begin    多条语句;     end 2、repeat语句:连续执行n次 格式 repeat(size)   begin   多条语句;    end 3、while语句:执行语句,知道条件不满足。 格式: while(表达式)  语句; 或者: while(表达式)   begin     多条语句;  end (4)for语句:和C语言用法一样 格式: for(表达式1;表达式2;表达式3)  语句; /*************************************************************************************/ 六、生成快 Verilog中有3种创建生成语句的方法,它们分别是: 1、循环生成; 循环生成语句允许使用者对下面的模块进行实例引用 (1)变量声明 (2)模块 (3)用户定义原语、门级原语 (4)连续赋值语句 (5)initial块和aways块 Eg: generate  for(j=0;j begin : xor_loop                 xor  g1 (out , i0 , i1 ); end endgenerate 2、条件生成语句 在模块设计中可以有条件的调用一下verilog结构 (1)模块 (2)用户定义原语、门级原语 (3)连续赋值语句 (4)initial 块或always 块 generate          if(***) ***         else     *** endgenerate 3、case生成语句 可以在设计模块中有条件的调用下面这些Verilog结构 (1)模块 (2)用户定义原语、门级原语 (3)连续赋值语句 (4)initial 块或always 块 eg; generate case(N) 1: *** 2: ***         default: *** endcase endgenerate 七、结构说明语句 Verilog语句中的任何过程模块都从属以下4种结构说明语句 1、initia语句 (1)用initial块对存储器变量赋初值 (2)产生测试波形l (3)所有initial语句块同时执行,都只执行一次 2、always (1)触发条件之间可以用 "or" 关键字或者"," (2)@ *表示将所有输入变量都自动包括进敏感列表 3、task(任务) (1)、语法: task任务名 端口声明 语句1 语句2 语句3 endtast (2)、任务的调用 任务名 (端口1,端口2,...,端口n) eg: my_task(v,w,x,y,z); 4、function (1)函数的语法和task差不多 function 返回值的类型或范围 (函数名) 端口说明语句 变量类型说明语句 begin 语句 ...... end endfuntion (2)注意: 函数的定义不能包含任何时间控制语句,即#、@、或wait语句 函数不能启动任务 定义一个函数至少要有一个输入参数 /********************************************************************************************************** 今天就写这么多吧,晚安,加油!                                                              
  • 热度 14
    2015-3-23 21:21
    1338 次阅读|
    0 个评论
    时间过得好快,转眼间就到大三了,暑假要去实习,下学期便开始求职之路。大学期间在实验室待了两年,玩过单片机画过板子学习了嵌入式编程,收获还是蛮多的。以前觉得计算机二级对我们电子通信专业来说没必要考,结果C基础不牢固便玩起了单片机,当我开始接触ARM是才看到自己的C还差的远远地。还好这次报了,昨天考的还不错,希望能拿个优秀。这学期开始学习FPGA,本科也没多少时间,希望自己能够尽快入门吧,毕竟这不是任何人都能够坚持下来的。我的FPGA道路从今天开始,希望在论坛里与大家一起学习,共同进步。以后会尽量每天更新一篇博客,大家叫我小白就好。 /*********************************************************************************************************************/ /*   内容:Verilog语法基础篇(一) /*   作者:李白 /*   时间:2015-3-23 /*********************************************************************************************************************/ 一、模块的结构、数据类型、变量和基本运算符号 1.1、模块的结构 (1)在Verilog中所有的过程块例如:initial块、aways块、连续赋值语句、实力引用语句都是并行的。(这几个关键字好想都不了解,先记下吧  ) (2)只有连续赋值语句assign和实力引用语句可以独立于过程块而存在于模块的功能定义部分。 (3)出现不分先后。(体现了并行的思想) 1.2数据类型及其常量和变量 Verilog**有19种数据类型,最基本的四种:reg、wire、integer、parameter其他类型的:large、medium、scalared、time、small、tri、trio、tril、triand、trior、trireg、vectored、wand、wor 1.2、常量: Parametert用来定义常量 在一个模块中改变另一个模块的参数时,需要使用defparam命令。 eg:parameter   msb=7;  //定义参数msb为常量7 1.3、变量 网络数据类型表示结构实体之间的物理连接。网络类型的变量不能存储值,而且他必须受到驱动器(例如assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高组态,值为Z,常用的网络类型的变量有:wire、tri。这两个变量都是连接器件单元。Wire型变量通常用来表示单个门驱动或连续赋值语句驱动的网络型数据。tri型变量则用来表示多驱动器驱动的网络型数据。如果没有定义逻辑强度,再多驱动源的情况下就会出冲突,产生不确定的值。 (1)wire型 Wire型数据用来表示用以assign关键字指定的组合逻辑信号。可以做任何方程式的输入,也可以做assign语句或实例元件的输出。 eg: wire            a;    //定义了一个一位的wire型数据 wire     b;    //定义了一个8位的wire型数据 wire     c,d; //定义了两个4位的wire型数据 (2)reg型 reg型数据初始值为不定值x,常用来表示always模块内的指定信号,常代表触发器。通常在设计中要由always模块通过行为描述语句来表达逻辑关系。在always模块内被赋值的没一个信号都必须定义成reg型。初始值为不定值,但当用作表达式的操作数时,它为正值。 eg: reg                 rega;            //定义了一个一位的名为regal的reg型数据 reg          regb;            //定义了一个四位的名为regb的reg型数据 reg          regc,regd;    //定义了两个四位的名为regc,regd的reg型数据 (3)Memory型 通过扩展reg型数据地址范围来生成的。Egg:reg mema 表示该存储器有256个8位的存储器。 注意一个由n个移位寄存器构成的寄存器组是不同于一个n位寄存器的 eg: reg         rega:                //一个4位的寄存器  reg   mema    ;          //一个由n个一位寄存器构成的存储器组 一个n位寄存器可以在一条赋值语句中进行赋值,而一个完整的存储器则不行 rega=0;                           //合法赋值语句 mema=0;                        //非法赋值语句 如果想对memory中的存储单元进行读写操作,必须指定该单元在存储其中的地质 eg: mema =0;                    //给memory中的第三个存储单元赋值0    /***************************************************************************************************************** 二、运算符及表达式 1、Verilog中的运算符范围很广,其运算符按其功能可分为以下几类: (1)算术运算符(+,-,*,/,%) (2)赋值运算符(=,=) (3)关系运算符(,,=,=) (4)逻辑运算符(,||,!) (5)条件运算符(?:); (6)位运算符(~,|,^,,^~) (7)移位运算符(,) (8)拼接运算符({ }) (9)其他 这里注意:基本上和C语言中的运算符相似。注意记忆几个运算符就好了(~取反、~按位异或、^~按位同或(异或非)) 2、逻辑运算符 (1)逻辑运算符中""和"||"的优先级低于关系运算符,"!"高于算术运算符 eg: (ab) (xy)   等价于:ab xy; (a==b) || (x++y)等价于:a==b || x==y; (!a) || (ab) 等价于!a || ab 3、关系运算符 基本上与C语言一致 关系运算符优先级都形同,并且低于算术运算符的优先级 eg: a size-1 等价于 a (size-1) 4、等式运算符 Verilog中有四种等式运算符 (1)==(等于) (2)!= (不等于) (3)===(等于) (4)!==(不等于) 这四个运算符都是双目运算符,他要求有两个操作数。“==”和“!=”不能考虑不定值和高组态,而“===”和“!==”运算符则不同,他在对操作数进行比较的同时也对不定态和高组态也要进行比较。 5、移位运算符 左移 右移 6、位拼接运算符 {信号1的某几位,信号2的某几位......信号n的某几位} eg:{a,b ,w,3'b110} {4{w}}允许拼接等同于{w,w,w,w} {b,{3{a,b}}}嵌套等同于{b,a,b,a,b,a,b} 7、缩减运算符 缩减运算符是单目运算符,也有与或非运算,其运算结果为一位二进制,具体操作过程:操作数第一位与第二位进行与或非运算第二步将运算结果与第三位进行与或非运算 eg: reg                B; re        c        ;         c=B ; 相当于:c=((B B )B )B ;
  • 热度 23
    2012-5-21 13:10
    2684 次阅读|
    4 个评论
              大学时,初学Verilog,是与学习电子电路和模拟电路一起学习的,自己认真学习了一下电子电路,包括数字电路和模拟电路,再看着夏宇闻老师出的那本教材,慢慢地一步一步的学习,说实话入门难啊!但是自己一定要坚持下去,不管遇到什么问题,自己喜欢的东西就要坚持到最后! 基础的东西希望大家能够自己去多多看书,若经过多次途径思考仍然不能解决问题的话,再把问题拿出来发问,向老师,同学或者相关的论坛等,这样多好呀!          再就是多看点英文电子资料,毕竟先进的东西是从外国引进的,学电子的看不懂英文资料估计怎么说都过不去吧!强烈建议大家有时间多去看官网的资料,因为这才是最权威的,才是我们所需要的答案。        希望我们能在学习中多多实践,实践出真知……