verilog入门经验(一 ) a lways块使用





1. 信号的产生及always块使用注意事项

    1.1 不要不同的always块内为同一个变量赋值。即某个信号出现在<=或=左边时,只能在一个always块内。(详细解释见 Verilog HDL与数字电路设计 P38)

          所以注意,在产生一个信号时,所有产生该信号的条件都应放在一个always块内考虑。

    1.2 不要在同一个always块内同时使用阻塞赋值(=)和非阻塞赋值(<=)。

    1.3 使用always块描述组合逻辑时使用阻塞赋值(=),在使用always块描述时序逻辑时使用非阻塞赋值(<=)。简单理解可以是,在电平敏感的always块内使用阻塞赋值,在边沿敏感的always块内使用非阻塞赋值。

    1.4 任何在always块内被赋值的变量都必须是寄存器型reg)。即<=或=左边的信号,必须是reg型,<=或=右边的信号可以是reg型也可以是wire型。

           另,端口声明中被声明为input或inout型的端口,只能被定义为线网型(wire);被声明为output型的端口,则可以被定义为线网型(wire)或者寄存器型(reg)。如果不定义,则默认为线网型(wire)。

     1.5 always的敏感列表中可以同时包括多个电平敏感事件,也可以同时包括多个边沿敏感事件,但不能同时有电平和边沿敏感事件。另外,敏感列表中,同时包括一个信号的上升沿敏感事件和下降沿敏感事件也是不允许的,因为这两个事件可以合并为一个电平事件。

 

2. 总clk的使用

    always敏感列表里的边沿触发事件,就是一个clk信号,所以在制定ucf时,边沿触发事件信号都要被定义在clk IO端口上,有时随意分配的clk IO端口在Implement时也会出错。需要到ucf中用

    NET "polin" CLOCK_DEDICATED_ROUTE = FALSE;      //polin为边沿触发事件信号

    语句来规避错误。

    所以在一个程序中,要尽量使用主clk作为always块的边沿触发信号如果有些变量要通过某个信号的边沿触发来产生,那尽量将这个边沿触发信号做成一个判断条件,然后在产生变量时仍用主clk触发


    例程:要得到LCD大尺寸屏POL信号的2分频、8分频、16分频...,在控制板上拨动开关设置不同的状态,输出polout切换到不同的pol输入的分频信号。

    思路,定义一个counter(cnt_pol)对输入pol信号进行计数,则cnt_pol的bit0位与pol输入信号一致,cnt_pol的bit1位为pol信号的2分频,bit2位为pol的4分频,bit3位为pol的8分频,bit4位为pol的16分频...

    counter计数有两种方法,一种是直接使用pol作为边沿触发事件计数:

    reg [8:0] cnt_pol;

    always @ (posedge polin or negedge rst)

    if(!rst) cnt_pol <= 0;

    else cnt_pol <= con_pol +1;

    (程序中还有一个主clk信号clkin作为其它信号的主时钟)

    上面这种方法比较简单,但是polin就作为了一个clk信号,只能定义到FPGA的clk IO端口,并且实现时容易报错。

    另一种方法是,采用主时钟信号为cnt_pol计数的边沿敏感事件:

    reg [8:0] cnt_pol;

    reg pold;

    wire cnt_event;

    always @ (posedge clkin or negedge rst)

    if (!rst)  pold <= 0;

    else pold <= polin;

 

    assign cnt_event = polin & pold;

 

    always @ (posedge clkin or negedge rst)

    if (!rst) cnt_pol <= 0;

    else if (!cnt_event) ;

            else cnt_pol <= cnt_pol +1;

    这样,程序比较多,但整个程序(包括其它部分)只有clkin是clk信号,避免了上述问题。

    对这段程序的解释:cnt_pol计数的机理与第一种方法不同,先通过第一个always块(寄存器),对polin信号进行延迟,产生pold信号,pold与polin在相位上差一个clkin周期。然后对pold和polin进行与操作并赋值给cnt_event信号,这样,cnt_event信号的每个高电平,即代表一个polin周期。然后再在第二个always块中,通过判断cnt_event的状态,来对cnt_pol计数。简单讲,就是将polin的上升沿,转成一个信号的电平状态,然后通过判断这个信号电平的状态来计数。整个过程使用的边沿触发信号都是主clk。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog-A语言是一种硬件描述语言,用于模拟和设计集成电路和系统。Verilog-A语言结合了Verilog和C语言的特点,旨在为设计和仿真电路提供更高级别的描述和模型。 想要入门Verilog-A语言,需要掌握以下几个基本概念和步骤: 1. 创建Verilog-A文件:使用文本编辑器创建一个以.vams或.va为后缀的Verilog-A文件。 2. 定义模:在Verilog-A文件中,使用module关键字来定义一个模。一个模可以包含输入、输出、参数和局部变量。 3. 定义端口:使用input、output或inout关键字来定义模的端口,这些端口用于与其他模进行通信和数据传输。 4. 添加参数:使用parameter关键字来定义模的参数,这些参数可以在调用模时进行配置和修改。 5. 编写模行为:使用Verilog-A语法和C语言函数来描述模的行为,包括控制流、数据操作和数学计算等。 6. 添加测试代码:为了验证模的功能和性能,可以在Verilog-A文件中添加一些测试代码来模拟输入和观察输出。 7. 编译和仿真:使用Verilog-A仿真工具,如Cadence Spectre或Synopsys HSPICE,对Verilog-A文件进行编译和仿真,以验证模的功能。 需要注意的是,Verilog-A语言相对于Verilog HDL来说更加高级和灵活,可以用于更复杂的模拟和设计任务。入门Verilog-A语言需要一定的硬件描述语言和编程经验,同时也需要学习和理解Verilog-A语言的语法和特性。 总而言之,Verilog-A语言是一种用于模拟和设计电路的硬件描述语言,通过学习并掌握Verilog-A的基本概念和语法,我们可以使用Verilog-A来描述和仿真各种电路和系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值