第二节 LED程序分析

来源:互联网 发布:黑手党3知乎 编辑:程序博客网 时间:2024/06/09 17:24
  1. LED程序
module LEDs ( LED1 , clk );output LED1;input  clk;reg [27:0] timer;always @ (posedge clk)    begin         timer <= timer + 1;        if(timer >= 28'HEFFFFFF)        begin            timer <= 28'b0;         end    end assign LED1 = timer[26];endmodule
先看第一条:module LEDs ( LED1 , clk );module(block)是Verilog的基本设计单元。模块是由两部分组成,一部分描述接口,一部分描述逻辑功能,即定义输入是如何影响输出的。每个module都有endmodule 呼应,verilog结构位于之间。模块的端口声明了模块的输入输出口:module 模块名(口 1,口2,...);output LED1;input  clk;reg [27:0] timer;是对模块内容的说明。即IO的说明、内部信号声明和功能定义。该部分可以直接在module中进行。always @ (posedge clk)如果满足则执行其后的过程块,并且其后得过程块是顺序执行。不同的always之间是同时执行的。begin和end相当于C语言的{},表示always所管理的过程块是在其之间。<= 是verlog的赋值语句和=之间存在差异性。<= 是非阻塞赋值方式:    1)在语句块中,上面的语句所赋值的变量不能立即就为下面的语句所用;    2)块结束后才能完成这次赋值操作,而所赋的变量值是上次赋值得到的;    3)在编写可综合的时序逻辑模块时,这时最常用的赋值方法。    4)非阻塞赋值符号和小于等于看起来一样,但意义完全不同,小于等于的关系运算符,用于比较大小,而非阻塞赋值符用于赋值操作。= 阻塞赋值符:    1)赋值语句执行完后,块才结束。    2)被赋变量的值在赋值语句结束后立刻就改变。    3)在时序逻辑中使用时,可能会产生意想不到的结果。阻塞和非阻塞时Verilog中的重点也是难点内容,之后在仔细理解。assign 是用来声明语句,进行逻辑定义;我的理解是:input和poutput 是wire类型,assign是对wire线连接到的数据进行声明。我的程序是定义一个28bit 的寄存器 timer,时钟信号的频率是25MHz ,每个时钟的上升沿会对timer进行加一,当大于0xEFFFFFF时置零,形成一个循环的时钟周期。然后把LED挂在timer的第26bit,即需要33554432x0.04 = 1342177.28us = 1.342s 点亮LED,然后亮1.324s。以此循环。 
原创粉丝点击