下面这些是从一个网站上看到的,看了挺有意思~转来与大家分享

***********************************************************************************************
上面说了一堆废话,大家可以跳过看这里就行。阻塞赋值我只在组合逻辑电路中使用,而非阻塞赋值我也只用于时序逻辑(其实更甚,只用于对寄存器的赋值)。所以寄存器之间如果有组合逻辑的话,我也是用阻塞赋值。
***********************************************************************************************

对于上面这段话,很多人可能都没有明白到底什么意思,什么叫“只对寄存器赋值”。对于“时序逻辑只对寄存器赋值”,我的个人理解是: 在always posedge 块中,尽量不要有任何的判断条件,所有的只是 a <= a_next;

举个例子吧,比如一个最简单的选择,很多人都会这么写 (为了简单起见, 例子中我省略了reset)
always (posedge clk)
if (sel) out <= a;
else out <= b;

但是,我只能说你做的对,但是并没有体现出一个硬件设计者的思想。如果你的头脑里面有着清晰的硬件电路,我下面的做法你可能会更加的认同。

always (sel, a, b)
if (sel) out_nxt = a;
else out_nxt = b;

always (posedge clk)
out <= out_nxt;

我觉得,以上代码风格的变化,就是从一个程序员转变为一个硬件设计者的过程。

posted @ 2010-09-19 22:00 无色旋律 Views(181) Comments(1) Edit

CycloneII特殊管脚的使用

在论坛中看到了有朋友发帖讲到Altera FPGA特殊管脚的连接,对我这样的初学者很有帮助,查了一下Altera的CycloneII手册和资料,补充一下各个特殊管脚的功能和使用方法。

EP2C5T144C8N/EP2C5Q208C8N

1/1.I/O, ASDO

在AS 模式下是专用输出脚,在PS 和JTAG 模式下可以当I/O 脚来用。在AS 模式下,这个脚是CII 向串行配置芯片发送控制信号的脚。也是用来从配置芯片中读配置数据的脚。在AS 模式下,ASDO 有一个内部的上拉电阻,一直有效,配置完成后,该脚就变成三态输入脚。ASDO 脚直接接到配置芯片的ASDI 脚(第5 脚)。

2/2.I/O,nCSO

在AS 模式下是专用输出脚,在PS 和JTAG 模式下可以当I/O 脚来用.在AS 模式下,这个脚是CII 用来给外面的串行配置芯片发送的使能脚。在AS 模式下,ASDO 有一个内部的上拉电阻,一直有效。这个脚是低电平有效的。直接接到配置芯片的/CS 脚(第1 脚)。

3/3.I/O,CRC_ERROR

当错误检测CRC 电路被选用时,这个脚就被作为CRC_ERROR 脚,如果不用默认就用来做I/O。但要注意,这个脚是不支持漏极开路和反向的。当它作为CRC_ERROR 时,高电平输出则表示出现了CRC 校验错误(在配置SRAM 各个比特时出现了错误)。CRC 电路的支持可以在setting 中加上。这个脚一般与nCONFIG 脚配合起来用。即如果配置过程出错,重新配置.

4/4.I/O,CLKUSR

当在软件中打开Enable User-supplled start-up clock(CLKUSR)选项后,这个脚就只可以作为用户提供的初始化时钟输入脚。在所有配置数据都已经被接收后,CONF_DONE 脚会变成高电平,CII 器件还需要299 个时钟周期来初始化寄存器,I/O 等等状态,FPGA 有两种方式,一种是用内部的晶振(10MHz),另一种就是从CLKUSR 接进来的时钟(最大不能超过100MHz)。有这个功能,可以延缓FPGA 开始工作的时间,可以在需要和其它器件进行同步的特殊应用中用到。

7/13.I/O,VREF

用来给某些差分标准提供一个参考电平。没有用到的话,可以当成I/O 来用。

14/20. DATA0

专用输入脚。在AS 模式下,配置的过程是:CII 将nCSO 置低电平,配置芯片被使能。CII然后通过DCLK 和ASDO 配合操作,发送操作的命令,以及读的地址给配置芯片。配置芯片然后通过DATA 脚给CII 发送数据。DATA 脚就接到CII 的DATA0 脚上。CII 接收完所有的配置数据后,就会释放CONF_DONE 脚(即不强制使CONF_DONE 脚为低电平),CONF_DONE 脚是漏极开路(Open-Drain)的。这时候,因为CONF_DONE 在外部会接一个10K 的电阻,所以它会变成高电平。同时,CII 就停止DCLK 信号。在CONF_DONE 变成高电平以后(这时它又相当于变成一个输入脚),初始化的过程就开始了。所以,CONF_DONE 这个脚外面一定要接一个10K 的电阻,以保证初始化过程可以正确开始。 DATA0,DCLK,NCSO,ASDO 脚上都有微弱的上拉电阻,且一直有效。在配置完成后,这些脚都会变成输入三态,并被内部微弱的上拉电阻将电平置为高电平。在AS 模式下,DATA0就接到配置芯片的DATA(第2 脚)。

15/21. DCLK

PS 模式下是输入,AS 模式下是输出。在PS 模式下,DCLK 是一个时钟输入脚,是外部器件将配置数据传送给FPGA 的时钟。数据是在DCLK 的上升沿把数据,在AS 模式下,DCLK脚是一个时钟输出脚,就是提供一个配置时钟。直接接到配置芯片的DCLK 脚上去(第6脚)。无论是哪种配置模式,配置完成后,这个脚都会变成三态。如果外接的是配置器件,配置器件会置DCLK 脚为低电平。如果使用的是主控芯片,可以将DCLK 置高也可以将DCLK 置低。配置完成后,触发这个脚并不会影响已配置完的FPGA。这个脚带了输入Buffer,支持施密特触发器的磁滞功能。

16/22. nCE

专用输入脚。这个脚是一个低电平有效的片选使能信号。nCE 脚是配置使能脚。在配置,初始化以及用户模式下,nCE 脚必须置低。在多个器件的配置过程中,第一个器件的nCE 脚要置低,它的nCEO 要连接到下一个器件的nCE 脚上,形成了一个链。nCE 脚在用JTAG编程模式下也需要将nCE 脚置低。 这个脚带了输入Buffer,支持施密特触发器的磁滞功能。


20/26. nCONFIG

专用的输入管脚。这个管脚是一个配置控制输入脚。如果这个脚在用户模式下被置低,FPGA就会丢失掉它的配置数据,并进入一个复位状态,并将所有的I/O 脚置成三态的。nCONFIG从低电平跳变到高电平的过程会初始化重配置的过程。如果配置方案采用增强型的配置器件或EPC2,用户可以将nCONFIG 脚直接接到VCC 或到配置芯片的nINIT_CONF 脚上去。这个脚带了输入Buffer,支持施密特触发器的磁滞功能。实际上,在用户模式下,nCONFIG信号就是用来初始化重配置的。当nCONFIG 脚被置低后,初始化进程就开始了。当nCONFIG脚被置低后,CII 就被复位了,并进入了复位状态,nSTATUS 和CONF_DONE 脚被置低,所有的I/O 脚进入三态。nCONFIG 信号必须至少保持2us。当nCONFIG 又回到高电平状态后,nSTATUS 又被释放。重配置就开始了。在实际应用过程中可以将nCONFIG 脚接一个10K 的上拉电阻到3.3V.

40/56. DEV_OE

I/O 脚或全局I/O 使能脚。在Quartus II 软件中可以使能DEV_OE 选项(Enable Device-wideoutput Enable),如果使能了这一个功能,这个脚可以当全局I/O 使能脚,这个脚的功能是,如果它被置低,所有的I/O 都进入三态。

75/107. INIT_DONE

I/O 脚或漏极开路的输出脚。当这个脚被使能后,该脚上从低到高的跳变指示FPGA 已经进入了用户模式。如果INIT_DONE 输出脚被使能,在配置完成以后,这个脚就不能被用做用户I/O 了。在QuartusII 里面可以通过使能Enable INIT_DONE 输出选项使能这个脚。

76/108. nCEO

I/O 脚或输出脚。当配置完成后,这个脚会输出低电平。在多个器件的配置过程中,这个脚会连接到下一个器件的nCE 脚,这个时候,它还需要在外面接一个10K 的上拉电阻到Vccio。多个器件的配置过程中,最后一个器件的nCEO 可以浮空。如果想把这个脚当成可用的I/O,需要在软件里面做一下设置。另外,就算是做I/O,也要等配置完成以后。

82/121. nSTATUS

这是一个专用的配置状态脚。双向脚,当它是输出脚时,是漏极开路的。在上电之后,FPGA立刻将nSTATUS 脚置成低电平,并在上电复位(POR)完成之后,释放它,将它置为高电平。作为状态输出脚时,在配置过程中如果有任何一个错误发生了,nSTATUS 脚会被置低。作为状态输入脚时,在配置或初始化过程中,外部控制芯片可以将这个脚拉低,这时候FPGA就会进入错误状态。这个脚不能用作普通I/O 脚。nSTATUS 脚必须上拉一个10K 欧的电阻。

83/123. CONF_DONE

这是一个专用的配置状态脚。双向脚,当它是输出脚时,是漏极开路的。当作为状态输出脚时,在配置之前和过程中,它都被置为低电平。一旦配置数据接收完成,并且没有任何错误,初始化周期一开始,CONF_DONE 就会被释放。当作为状态输入脚时,在所有数据都被接收后,要将它置为高电平。之后器件就开始初始化再进入用户模式。它不可以用作普通I/O来用。这个脚外成也必须接一个10K 欧的电阻。

84/125,85/126. MSEL[1:0]

这些脚要接到零或电源,表示高电平或低电平。00 表示用AS 模式,10 表示PS 模式, 01是FAST AS 模式.如果用JTAG 模式,就把它们接00, JTAG 模式跟MSEL 无关,即用JTAG模式,MSEL 会被忽略,但是因为它们不能浮空,所以都建议将它接到地。

142/206 DEV_CLRn
I/O 或全局的清零输入端。在QuartusII 里面,如果选上Enable Device-Wide Reset(DEV_CLRn)这个功能。这个脚就是全局清零端。当这个脚被置低,所有的寄存器都会被清零。这个脚不会影响到JTAG 的边界扫描或编程的操作。

posted @ 2010-08-12 23:20 无色旋律 Views(96) Comments(1) Edit
三极管是电流放大器件,有三个极,分别叫做集电极C,基极B,发射极E。分成NPN和PNP两种。我们仅以NPN三极管的共发射极放大电路为例来说明一下三极管放大电路的基本原理Read More
posted @ 2010-07-14 23:54 无色旋律 Views(165) Comments(0) Edit

最近在学写仿真程序,在网上看到不错的文章,转到自已的博客,希望自己能学习到其中的精髓

原文地址

http://blog.ednchina.com/conan85420/728653/message.aspx

测试平台是个没有输入输出端口的模块。仿真在一个模块设计中是很关键的步骤,而testbench是仿真的很好工具。

与待测模块接口

与输入端口相连接的变量定义为reg

与输出端口相连的定义为wire

 

initial块中初始化变量,必须的。

用$stop或$finish暂停或结束仿真

wait(z==1’b1);//等待变量值改变,变量可以是待测试模块的输出或者内部变量

时钟产生:

always # 10 clk =~clk;产生时钟

initial repeat(13) #5 clk =~clk; //控制只产生13个时钟。

 

同步数据:

initial forever @ (posedge clk) #3 x = $random;

为了降低多个输入同时翻转的概率,对时序电路的输入一般采用素数作为时间间隔。

同步显示:

l         initial $monitor (“%d is changed at %t”,MUT.current,$time);//

一般在 initial中调用,采用$monitor显示模块MUT内部current的值以及发生变化的时间,$monitor是一个后台运行任务函数,多个模块下,任意时间只能有一个$monitor起作用,可用$monitoron $monitoroff来控制。

l         always @(z) $display(“Output changed at %t to %b”,$time,z);当z发生变化输出z值以及变化时间,自动换行。

l         always @(z) $strobe(“Output changed at %t to %b”,$time,z);//仿真结束后显示输出,查看非阻塞赋值变量的值。

 

随机数据

initial repeat(5) #7 x = $random;

a = $random%60; //产生-59~59之间随机数

a = {$random}%60; //产生0~59之间随机数

 

产生随机时间间隔

always begin

       t= $random;

#(t) x = $random;

end

 

数据缓存

initial buffer = 16’b1110_0001_1011_0101;//将测试数据进行初始化

always @ ( posedge clk) #1 {x,buffer} = {buffer,x};//可以在控制的数据下输入信号x

 

读取数据文件

reg [7:0] mem1[0:1024];

initial begin

       $readmemh( “data1.dat” , mem1);

 

模板:

`timescale 1ns/100ps

`include “*.v”

module t;

参数定义

输入测试模块的测试信号定义 reg,wire

内部变量定义

initial begin

初始化变量

$monitor (“%d is changed at %t”,MUT.current,$time);//监控数据

forever @ (posedge clk) #3 x = $random;//同步数据

repeat(5) #7 x = $random;

end

always @(z) $display(“Output changed at %t to %b”,$time,z);

always @(z) $strobe(“Output changed at %t to %b”,$time,z);

always # 10 clk =~clk;//产生时钟

always begin//

       t= $random;

#(t) x = $random;

end

 模块实例化

       defparam module. WIDTH = 32;

endmodule

posted @ 2010-07-06 00:59 无色旋律 Views(186) Comments(0) Edit