第一次用cpld~下面这段程序有什么问题?为什么灯不闪烁?
module LEDWATER ( CLK, LED );input CLK;
output LED;
regLED;
reg buffer;
initial
LED=1'b1;
always @ ( posedge CLK )
begin
buffer = buffer +1;
if ( buffer == 23'b11111111111111111111111)
begin
LED=~LED;
end
end
endmodule
为什么没写几句程序~我看编译里面占用的百分比已经达到 23%多了? 程序我感觉下载下去了~ led随便指定了一个引脚2,clk我指定的14脚,其中6MHz有源晶振输出到14脚(GCLK1),但是灯并没有闪烁~ initial
可以被综合的吗? 可以综合的 如果不是引脚设置的问题,这样试试看~
if ( buffer == 23'b11111111111111111111111)
begin
LED=~LED;
buffer=0;
end 好了~谢谢ppa2001~贻笑大方了~这是我的第一个cpld程序,灯总算亮了~
我把完整的贴一下
module LEDWATER ( CLK, LED );
input CLK;
output LED;
regLED;
reg buffer;
initial
LED=1'b1;
always @ ( posedge CLK )
begin
buffer = buffer +1;
if ( buffer == 23'b11111111111111111111111)
begin
LED=~LED;
buffer=0;
end
end
endmodule
不过感觉cpld好像空间很小哦,啥都么干~就占用了百分之几十了~ 是什么片子? epm240t100c5 ppa2001说过,不能按写C的构架和思路来看待CPLD.你的想法都会转成硬件,可能和这有关系吧 CPLD作为为分频使用时,每使用1位REG 就占用一个宏你上面的程序分频就已经使用了23个REG型 所以至少占到总资源的10%以上 你完全可以用时钟分频的方法去做这样你所用的宏将会大大减少的 好的~谢谢~我只是为了验证一下功能~技巧慢慢学吧~ 【10楼】 kenson :能举个列说说如何用时钟分频吗 呵呵这个简单啊!你只要定义一个div 然后always @(posedge clk) div= div+1'b1 再从其中抽你想分频的哪一位做次时钟就可以了我现在手上做的就是用这种方法!
如果各位有什么有的方法请指教! 那不是基本一样吗?也是计数方式啊?只是是2的n次方.也是用reg吧?
有时间试试看 是的基本上是一样的所以应该个人都会的!所以不值得好说的呵呵 if ( buffer == 23'b11111111111111111111111)
这种写法也不是很好,用verilog的话,直接给一个树就行了,
上面的写法再分频的时候很容易 晕的,数据容易错位 回复【3楼】laoki8888 阿虚
可以综合的
-----------------------------------------------------------------------
initial 也可以综合,不知道具体电路是什么啊?
为什么大家都喜欢用initial 不喜欢用复位 initial 这个玩意就是仿真用的,真正的触发器是真正有复位和置位的 【17楼】 Fourier00
哈哈,FPGA的触发器是可以置初值的,所以不用白不用。
当然,置初值用initial的习惯是不是太好,换了ASIC就惨了。
对于FPGA,比如RAM/ROM的初值,用initial置也是可以的,这样可以
让HDL独立于FPGA厂家和综合器。
FPGA里面用复位和置位的话,稍有不慎,最多可能浪费50%的资源。
参见Xilinx的wp275。 回复【18楼】minux 啊啊?
【17楼】 Fourier00哈哈,FPGA的触发器是可以置初值的,所以不用白不用。当然,置初值用initial的习惯是不是太好,换了ASIC就惨了。对于FPGA,比如RAM/ROM的初值,用initial置也是可以的,这样可以让HDL独立于FPGA厂家和综合器。FPGA里面用复位和置位的话,稍有不慎,最多可能浪费50%的资源。参见Xilinx的wp275。
-----------------------------------------------------------------------
不知道大家有没有仿真过,呵呵,要是不仿真,触发器出来的信号,全部都是红色的不定态 ,而且还会传递。
复位和置位分为同步和异步所说的浪费资源莫非是同步的
always @(posedge clk or negedge rst_n_asyn)
begin
if(rst_n_asyn == 1'b0) //这个复位会infer成触发器的R端
a <= 8'd0;
else if(rst_n_syn == 1'b0) // 这个复位确实会浪费资源。
a <= 8'd0;
else
a <= #DLY b ;
end 【19楼】Fourier00
不知道大家有没有仿真过,呵呵,要是不仿真,触发器出来的信号,全部都是红色的不定态 ,而且还会传递。
复位和置位分为同步和异步所说的浪费资源莫非是同步的
-----------------------------------------------------------------------
具体情况看看那篇文章吧,混用同步或者异步复位确实会浪费50%的资源,但是即使全是同步
的复位、置位和使能,顺序错了照样会浪费50%的资源。
同时复位还要根据不同厂商的FPGA选择同步或者异步复位,也不能一概而论。
仿真的时候触发器的信号肯定是X开始(如果没有初值),X当然会传播啊,很多时候需要这个来
检验没有正确复位的逻辑。
很多书中建议建议不用initial给初值的理由是因为这样可以检验设计中不正确的复位。
但是如果就准备给FPGA用(有多少设计是想将来移到ASIC工艺的?),给个初值也没啥问题,
而且即使给了初值,也还是应该有正确的复位的。 initial是不能综合的。不要被一些综合器的“智能化”搞的那么懒,写出来的代码一眼看上去,initial+不复位,丢的是自己的人 。 学习了,没想到C编惯了对CPLD影响噶老大,资源也一下就没了的,
看来只能用汇编的思路来考虑CPLD的编程了。。。一个个卡资源入口和出口。。。
谢谢大家受教了,我会继续努力的,祝大家圣诞快乐 分频 一般多是计数分频;
抽出移位输出;
到指定输出;
取反等;
在VHDL里面定义序列,比如8位,他计数到FF就归0了,在开始计数,
如果定义的是integer 0 到 200 ,最少需要8位,你到200的时候不归到0 他就计数到8位的记满,就是FF ,255。
在verilog里面是怎么样的?大家知道吗? http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_518615.jpg
(原文件名:QQ截图未命名.jpg)
看看摩托罗拉的编码规范怎么写的initial,希望对大家有用 【21楼】 ngzhang 兽哥【24楼】 Fourier00
FPGA里面就是可以综合initial的,而且有时候不用initial是不能写vendor无关的可移植
程序的(你在verilog里面怎么初始化大RAM?)。
我也说了很多编码要求里都说initial不好,但是,再照本宣科之前请看清楚人家不允许的
原因。ASIC里面没办法做寄存器初始化,FPGA不同,FPGA是可以的。如果你将来的项目要
移植到ASIC那么不让用initial是正确的,但是只面向FPGA的项目没啥理由不能用initial。
另外,我也强调了,即使用了initial,适当的复位也是应该的。
至于所谓智能化的问题,我不敢苟同。综合器这类工具就是应该减轻人类的负担的,不然,
为啥我们不直接写网表?干嘛要“智能化”的综合器? to 【25楼】 minux 啊啊?
有一句话叫做:良好的习惯。
引用一个台湾资深工程师的原话:请问不用initial来置初值会死吗?不会死就不要用啊。 说了那么多,能不能告诉我为什么在只针对FPGA的项目里不能用initial置初值?
为什么是坏的习惯?每个说法有它背后的道理和适用条件的,脱离了条件说就是断章取义了。
现在用FPGA的项目有多少将来是要移植到ASIC?知道了不能用initial,自然知道什么时候能用,什么时候不能用,
就像goto语句,正确地使用是非常可以接受的。
而在,有什么别的办法做到跟工具无关的初始化RAM? initial也能综合?
记得是激励里用来初始化的,仿真用的。
有点迷糊了 【28楼】 zchong
很多书都过时了。。。
自己试试看吧,FPGA里面的触发器是可以置初值的。 哈哈~~~~受教了~~~~~~~~~~ to 【29楼】 minux 啊啊?
你想咋写没人管,但是不要带坏新人。你可以试试在任何一家IC设计公司的面试中写这样的代码,看看会有什么样的后果,然后再讲讲你的理由(如果还让你说话的话),再看看对面的人是什么表情。
to 看帖子的各位:
在下不才,重申两点:1,不要把initial写到可综合代码中。2,所有寄存器必须显式的写出可靠的复位逻辑。
无论你的代码是针对于FPGA还是ASIC。 【31楼】 ngzhang 兽哥
那请问你如何初始化RAM的内容?如果要做到工具无关。
我没说不要加可靠复位。
我说的是面向FPGA的代码可以用initial,你说的面试IC设计公司当然是要求面向ASIC的编码风格,必然不能用initial
这也是我也强调的。
鉴于你说我误导初学者,那我加上一句警告:HDL初学者不要依赖于在可综合代码中用initial,同时必须加正确的复位。 好,既然你还是坚持,那我再多说两句。
首先,用initial来给寄存器赋初值,哪怕局限在FPGA领域内,是否是目前所有尚在使用的综合工具所支持的?如果只是少数和新版本工具支持这种写法,我建议你就不要用。
其次,如果有的工具支持,那么这种支持是否是被其他工程师多年使用和验证可靠的?如果没有经过各种情况下的验证确定可靠,就不要用。
再次,如果你承认可靠的复位是必需的,那么何必还要多此一举的在可综合代码中写initial?如果由于某些失误,initial和reset后的值设定不同,你是否能完全确认这个电路的行为?如果不能确定,建议不要用。
最后,你能否确定用initial来初始化寄存器值这一过程,是通过何种硬件电路实现的?如果不清楚,建议不要用。
最后总结一下,干脆任何时候都不要用。 【33楼】 ngzhang 兽哥
第一条,那你找一个常用的综合软件但不支持的吧……
第二条,这是基于SRAM的FPGA普遍具有的功能,你觉得可靠不可靠呢?
第三条,initial和reset可以通过调用同一个task来完成初始化,就没有不一致的问题。
最后,我当然清楚用initial初始化寄存器值的这个过程是如何实现,FPGA在初始化的时候就会
初始化寄存器的值,这本身不需要特殊的硬件实现它,这是基于SRAM的FPGA固有的特性。
另外,我还想补充一条,FPGA相对ASIC的优势,不仅仅是开发快,NRE少,更重要的一点是灵活性!
就是因为目前大家还是习惯把FPGA就是当作ASIC的替代物来开发,所以FPGA灵活性的特点根本没有
怎么体现出来,比如FPGA是可以初始化寄存器/BRAM值的,FPGA是可以动态重新配置的,有些FPGA
是可以在运行时部分重新配置的,FPGA是在任意时刻读出内部寄存器、BRAM值的;这些FPGA特有的
功能如果不发掘,那么FPGA永远会被ASIC踩在脚下的。因为FPGA的灵活性是付出了高昂的代价的(
功耗,速度,量产时候的单片成本),不使用这些灵活性,那么FPGA也就只能做ASIC的原型验证或
者小批量替代ASIC使用。 楼上的讨论非常精彩
页:
[1]