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 。

继续阅读

为什么是“硬件描述语言”而不是“硬件设计语言”

“描述”一词说明电路不是凭空设计出来的,而是在能够实现的基础之上通过某种语言来描述他们的互联关系。早期的数字电路设计采用原理图设计方法,其本质上也是对电路的一种描述。它用原理图的形式将各种逻辑电路互联在一起。但随着电路的发展,采用原理图来设计数字电路已经显得力不从心了,因此便采用所谓的硬件描述语言来描述电路的互联关系。

由此也可以看出,硬件描述语言和计算机编程语言有着本质的差别。HDL必须基于硬件的实现基础之上,也就是说硬件描述语言所描述的电路必须是能够实现的。而计算机编程语言则不在乎电路的实现。因此当编写或阅读硬件描述语言的时候,从硬件结构的角度而不是从顺序算法的角度来考虑的话,将更容易理解。

也因为这个缘故,在编写代码的时候,应以导出电路为目的,而不是描述一个顺序的C语言算法。如果不能做到这一点,则会经常导致代码的不可综合,实现复杂,或仿真和综合之间存在差异。例如,同一个变量在多个always块中被赋值。在verilog语法中是允许这种情况,并且可以仿真。但是却无法综合。

🙂

什么是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

继续阅读

Matlab中最出名的美女

lena

没错就是Lena Söderberg!这张图来自《1972 Playboy Magazine – The “Lenna” Edition》 It is a picture of Lena Söderberg, a Swedish model, shot by photographer Dwight Hooker.

From wikipedia:

Lenna is the name given to a standard test image which has been in use since 1973. It comprises 512×512 pixels, and was originally cropped from the centerfold of the November 1972 issue of Playboy magazine. It is a picture of Lena Söderberg, a Swedish model, shot by photographer Dwight Hooker. The test image is often used for image processing algorithms (such as compression and denoising) and related scientific publications.

1972年出版playboy,1973年马上就被工程师拿来当测试用。看来作为一名合格的工程师,也要什么都看,包括nudie magazines^_^其中有个小细节,虽然他叫lena,但是playboy却是打印城lenna。我一开始以为是出错了,后来发现原来当年的Playboy真的是这么写的“Lenna”.好在我在一篇文章中找到了解释:

Although her name is spelled “Lena”, Playboy spelled her name as “Lenna” in the magazine. It’s not a typo. It was common practice to anglicize foreign names into something “more English” sounding.

1972 Playboy Magazine – The “Lenna” Edition

此时,就像看到易知难一样,我就想看看现在她是什么样的。比易知难好找多了。The Lenna Story

而且直到1988年,瑞典一家计算机出版社来采访她。她才知道,原来她的照片在计算机领域如此的广泛应用。后来她居住在了瑞典,并且快乐的结婚,生了3个小孩,找了一份工作。

nov72playboy

至于原图,由于担心法律问题。所以请自己看这里。(18禁!)

Windows C盘目录下eula.*.txt install.exe VC_RED.MSI是什么

remove-eula-windows

C盘目录下莫名多了eula.1028.text , install.res.1028.dll, vc_red.msi 这些文件,能不能删除呢?查查Google。What is eula.1028.text on (c:),具体原因在这里详细说明《VCRedist from VC++ 2008 installs temporary files in root directory》

导致会产生这些临时文件的原因是:

These temporary files are erroneously generated by the installer into the root directory of one of your drives, instead of the temp directory.

继续阅读