专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

学习VerilogHDL的一些心得

作者:佚名   来源:本站原创   点击数:  更新时间:2012年01月02日   【字体:

经过一周的课程设计,小盆友们对Verilog应该也有了一定的了解了,VerilogHDL是经过国际电子工程师协会认证的硬件描述语言,个人认为它的势头有超过VHDL的趋势,它广泛应用于FPGA和CPLD的编程,小弟有幸在大二接触这门语言,并在Altera的CPLD上做过一些简单编程,绘制了一块简单的EPM240核心板,不过一直以来都是历程看得多,但亲自动手编程少,对语法认识很浅薄,这次课设亲自动手编写了尽300行程序,有了一些小体会。

       关于Verilog的赋值,我个人倾向于是用非阻塞赋值方法,网上说这样不容易出现竞争和冒险,我觉得非阻塞是同步赋值,稳定性比较高,不会相互干扰。在同一个always语句中不能同时是用非阻塞和阻塞赋值,这一点是课设期间发现的。关于不能在多个always语句中给同一个变量赋值,在不久以前我编写超声波调制程序时发现这个问题,其实仔细想想也是有道理的,就像门电路输出不能直接并联一样,如果两个激励对一个网点提供了不同的电平,那不就相当于短路了吗。收特权同学的教程影响,我一般习惯为每个线变量定义一个寄存器变量对应,在always语句中一般只给寄存器变量赋值,在always外用assign语句把寄存器值映射到线变量上。在今天验箱时候发现我的数码管扫描效果有问题,两个数码管中多有对方显示数字的残影,这个问题在早期用单片机调数码管的时候很常见,因为单片机执行指令时串行的,段位赋值不能同时进行,所以段值可能会残留到下次位赋值,造成每一位数码管都有上一位的数值残影,我在状态机执行的时候是以clk为敏感信号的,位切换在另一个always中以clk四分频为时钟,由于都是非阻塞赋值,在位切换后有一个clk周期的时间段值是保持不变的,这就造成了残影,解决方法很简单,段译码过程的always中医段值变化为敏感信号,段值一变立刻译码,为段输出赋值。一下附代码

wire nclk;                                       //位切换时钟
assign nclk=cnt[1];                          //cnt是分频计数寄存器,记clk上升沿 以自己每一位作为时钟输出
always @(posedge nclk) begin
if(!rst) show=show0;
else if(cnt[2]==0) begin
show=show0;                                               //段寄存器赋值
wei=3'b001;                                                  //位切换
  end
else if(cnt[2]==1) begin
show=show1;
wei=3'b000;
  end
         end
always @(show) begin                              //原本的敏感信号时  posedge clk
if(!rst) seg_r<=8'd0;
else begin
case(show)
4'h0: seg_r <= seg0;                     //seg0……等都是之前定义的参量 parameter
4'h1: seg_r <= seg1; 
4'h2: seg_r <= seg2;
4'h3: seg_r <= seg3;
4'h4: seg_r <= seg4;
4'h5: seg_r <= seg5;
4'h6: seg_r <= seg6;
4'h7: seg_r <= seg7;
4'h8: seg_r <= seg8;
4'h9: seg_r <= seg9;
default: ;
endcase
end
end
assign seg=seg_r;                              //通过寄存器为线变量赋值

当然,如果在case里同时为输出和位切换赋值 那就更好了 也是同步的。
       目前也就想起这么多,有新的内容等我领悟了再加上,文章有不足之处欢迎童鞋们指正。接下来说点别的。
       咱们用的那个MAX Plus II是Altera很久以前出的,现在已近很少人使用了,QuartusII是目前Altera的主流,由于功能庞大,编译仿真都比较慢,而最新的版本不支持仿真,因为ModelSim仿真软件可以与QuartusII无缝对接,仿真效果也很好,所以Altera就放弃了这部分的功能,还有一个叫Xilinx的公司是在可编程逻辑器件上与Altera并驾齐驱的,它提供的ISE是针对它本公司器件所研发的编译器,这个我也没用过,Altera是亚太地区编程逻辑器件的主流。
       FPGA是现场可编程逻辑门阵列,CPLD是复杂可编程逻辑器件,都是目前比较热门的技术,电气的童鞋很可能要用到CPLD设计逻辑代替门芯片,这一点张纯江老师上课时候说过,如果用CPLD做时序逻辑控制电机,可以精确控制死区时间,大量驱动逻辑都可以编写在其中,减小驱动电路体积,提高稳定性,当然这只是简单应用,FPGA/CPLD通常应用于时序要求高,速度要求高的地方,用来作AD采集的控制时最合适的了,可以完整获得采集到的波形,不会像处理器那样受到中断的限制(这好像是赵永科掌门说的),更高端还可以在FPGA中编写CPU甚至DSP的IP核,当然这不是一个人能搞定的,Altera为我们提供了一些免费授权的IP核还有一些高端的需要付费的IP核,用户只需要直接调用IP就能在自己的芯片中生成相关结构,这样可以将CPU DSP PLL RAM FIFO IO做在一个芯片里,减小体积,降低功耗。当然啦,这些高端的东西小弟也不懂,有待继续研究。
          有对这方面感兴趣的童鞋可以看看北航博客系列丛书中吴厚航写的那本《深入浅出玩转FPGA》,作者网名:特权同学,他还有个视频教程,就是普通话说得惨点。这只是一本入门级书,配合Altera的官方教程可以对FPGA有些初步认识,如果想深入研究那就要*自己不断查阅资料了,亲自实践了。Living今天就说到这里,欢迎大家转载。

关闭窗口

相关文章