标签归档:Verilog

Verilog实用define和include设置仿真模式与编译模式

最近FPGA琢磨了有一段时间了。虽然后期因为期末考原因,琢磨时间比较少了。每次停歇一段时间后,从新思考问题,问题似乎没有起初那么难解决了,敲起代码来顺手很多。大概是时间慢慢沉淀了知识,吸收了经验。理论和经验都需要时间来消化。这段时间大约写了有5~10K的Verilog了,自己的代码风格也基本定型了。对HDL也有更贴近的认识了。看了些视频教程,这从中吸收了不少精华。其中就包括开源骚客(http://dengkanwen.com/)的SDRAM系列教程。收货颇多,尤其是他的设计逻辑方法。当工程量逐渐增大时,就必须有清晰的逻辑时序图,系统框图。

继续阅读

Verilog一段错误代码分析

reg [3:0] Count_EN;
localparam PWen=4'd12;
always@(posedge CLK or negedge RST)
begin
  if(!RST)
    Count_EN<=0;
  else if(Count_EN==PWen)
    Count_EN<=0;
  else
    Count_EN<=Count_EN+1'b1;
end

此电路存在一个问题即:

Count_EN没有初始化值。

也就是说:当RST从一开始的时候就是1的话,即不满足条件一,Count_EN<=0不执行。那么Count_EN将一直处于不定态。于是else语句的加1操作相当于在一个不定态加1,得出的结果自然还是不定态。所以电路最终不能实现计数功能!

从仿真结果看:

counter_en_x

继续阅读

学习笔记之:HDL的优缺点

HDL具有通用性并且允许对电路的实现进项各种各样的控制。但即是优点也是缺点。

优点是:开发者可以针对硬件进行针对性的优化设计。但这也带来了缺点,即是:开发者必须深入到每一个细节进行精细的控制,包括数据和流程控制。因此对于复杂算法的编程相当困难。

为了解决上面的缺点,于是对高级语言,尤其是C语言进行硬件综合方面进行了相当多的研究。但硬件本身是并行的,每一步或者每一个运算都有独立的硬件执行。相比之下,软件通过重复使用CPU进行运算,使之本质上是串行的。这也是HDL描述电路时,与编程思维不同的原因。

所以时刻牢记FPGA开发属于硬件设计工作是十分重要的。进行硬件设计与进行软件设计需要不同的能力。即使是基于C语言的来描述设计,时刻牢记正在构建或者算法本身所暗指的结构也是非常重要的。并不是所有的软件算法都可以很好的映射到硬件上。例如,除非很好的保持上下文内容并将之调用,否则递归就不能被很好的映射到硬件上。因此这项工作需要面向硬件的思维模式。

Verilog学习笔记——之重点

verilog原本被设计成一种仿真语言,而不是一种综合语言,所以verilog HDL中很多逻辑描述没有相应的硬件可以对应。因此如果程序只用于仿真,那么verilog中的所有语句和语法都可以使用。但如果用于硬件电路的实现,则许多的语句和描述方式都是不可综合的。

  • 只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
  • always 语句是一直重复执行,由敏感表(always 语句括号内的变量)中的变量触发。
  • always 语句从0 时刻开始。
  • 在begin 和end 之间的语句是顺序执行,属于串行语句。书写规范
  • 用有意义的有效的名字如 Sum 、CPU_addr等。
  • 用下划线区分词。
  • 采用一些前缀或后缀,如时钟采用Clk 前缀:Clk_50,Clk_CPU;低电平采用_n 后缀:Enable_n;
  • 统一一定的缩写 如全局复位信号 Rst。
  • 同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。
  • 自定义的标识符不能与保留字同名。
  • 参数采用大写,如SIZE 。

继续阅读