初学FPGA,小程序搞不懂了。。。请各位大侠答疑解惑
module test2(input CLK,input RST,output reg LEDS);initial
begin
LEDS<=4'b0001;
end
always @(CLK)
begin
if(~RST)
LEDS<=4'b0001;
else
begin
LEDS<={LEDS,LEDS};
end
end
endmodule
CLK和RST映射到两个 IO上,是按键,LED也映射好了
按下RST的时候有反应,但按下CLK和不按一样都是灯全亮(PS:灯是高电平的时候亮) 仿真是没有问题的
就是下载到开发板上悲剧了 你CLK引脚怎么处理的啊?按键和没按键时引脚电平变化了吗? 好像我没有看明白,时钟变化的时候才会处理复位按键的状态
你只有 RST 的时候怎么测试按键的
CLK 的问题也是不明白
贴一个原理图摘要看看吧 <= 和 = 两个幅值不一样的,是否多按几下CLK 就可以?? 你的代码是想写个流水灯吗。。通过代码看,应该是CLK为高、RST为低的时候灯为流水灯。如果你按下按键后端口取到的值为低的话,按下CLK时灯就没反应了。。(我也是初学者,一起学习了,不对的地方还请指点一下。。) 是不是always @(CLK)要改为 always @ (posedge CLK)
或者是 always @ (negedge CLK)
看你的代码应该是沿触发的,好像不是电平触发,因为按键按下或者弹起来都会有一个沿。
若是电平触发的话,应该要用阻塞复赋值吧,就是把 <=改为=,那么5楼 xivisi 说的应该是
对的,你连续多按几次,试试。
ps:本人也是刚开始学verilog。可以多多交流。 代码问题太多了,真心建议去好好学习Verilog语言之后再去想问题。组合逻辑和时序逻辑问题,以及同步复位和异步复位,阻塞和非阻塞的应用,电平触发和脉冲触发等问题,自己去找答案吧 同意楼上说的... 首先是语法不熟,其次是没有电路概念。
在指出问题之前先明确一个概念:寄存器是边沿触发,锁存器是电平触发。
下面是代码分析:
always@(CLK)这种写法是电平触发,估计LZ是想它高电平触发。但是要指出的是这条语句仅仅表示:CLK有变化即执行下面的语句。至于是高电平还是低电平,只有LZ知道,编译器是不知道的。所以综合的时候肯定是忽略CLK信号,直接综合里面这几句:
if(~RST)
LEDS<=4'b0001;
else
LEDS<={LEDS,LEDS};
这个if--else应该是综合出一个选择器,由RST控制;在else下LEDS没有触发条件,所以不能综合成锁存。
最终的电路应该是CLK未连接,RST控制一个二选一选择器,LEDS是一堆线。
不信LZ可以看一下RTL图。
顺着LZ的思路可以这样改:
always @(CLK)
begin
if(CLK) begin
if(~RST )
LEDS<=4'b0001;
else
LEDS<={LEDS,LEDS};
end
end
这就能综合出锁存了。
当然在FPGA中推荐用同步时序。怎么改,这是基本功,LZ好好琢磨吧~。
还需指出一点是initial语句是不能综合的。
另外5楼说的 <= = 问题LZ得好好研究研究,但是跟你现在这个电路没多大关系。
完毕,加油吧,孩纸~~~
页:
[1]