标签归档:FPGA

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 。

继续阅读

什么是JTAG

JTAG是IEEE标准(1149.1),开发与1980年代。真早。早期的JTAG用于大批量电路板的检测。TAG通过四个端口来检测电路板中ICs的PIN脚。通过TDI输入与TDO输出,各芯片形成所谓的JTAG-chain。这样一来,通过传输数据,就可以确认芯片各引脚的链接正确与否,此种方法就是传说中的”IC Boundary test”.
但随着技术发展,JTAG也不仅仅只用于IC边界测试。还用于debug、通过JTAG来设置FPGA。JTAG可以通过

  • Parallel (printer) port
  • USB port
  • Ethernet port

来连接PC。最简单的控制是采用·Parallel (printer) port。

一个并行端口可以视为是计算机的一个12位输出以及一个5位输入的端口。当然JTAG只需要3位输出,1位输入即可。

从C语言的角度,控制JTAG很简单。例如控制TCK,代码如下:


#define lpt_addr 0x378

#define TCK 0x01

&nbsp;

void toggle_TCK()

{

outport(lpt_addr, 0);

outport(lpt_addr, TCK);

outport(lpt_addr, 0);

}

jtag

继续阅读