Merck 发表于 2012-9-13 16:28:44

初学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:灯是高电平的时候亮)

Merck 发表于 2012-9-13 16:29:14

仿真是没有问题的
就是下载到开发板上悲剧了

zhangpisces 发表于 2012-9-14 14:41:45

你CLK引脚怎么处理的啊?按键和没按键时引脚电平变化了吗?

litguy 发表于 2012-9-14 14:50:54

好像我没有看明白,时钟变化的时候才会处理复位按键的状态
你只有 RST 的时候怎么测试按键的
CLK 的问题也是不明白
贴一个原理图摘要看看吧

xivisi 发表于 2012-9-14 15:03:54

<= 和 = 两个幅值不一样的,是否多按几下CLK 就可以??

Hz_tianxiu 发表于 2012-9-15 00:02:48

你的代码是想写个流水灯吗。。通过代码看,应该是CLK为高、RST为低的时候灯为流水灯。如果你按下按键后端口取到的值为低的话,按下CLK时灯就没反应了。。(我也是初学者,一起学习了,不对的地方还请指点一下。。)

lffpga 发表于 2012-9-15 00:52:02

是不是always @(CLK)要改为   always @ (posedge CLK)
                                 或者是   always @ (negedge CLK)

看你的代码应该是沿触发的,好像不是电平触发,因为按键按下或者弹起来都会有一个沿。
若是电平触发的话,应该要用阻塞复赋值吧,就是把 <=改为=,那么5楼 xivisi 说的应该是
对的,你连续多按几次,试试。
ps:本人也是刚开始学verilog。可以多多交流。

隐姓埋名 发表于 2012-9-26 00:12:22

代码问题太多了,真心建议去好好学习Verilog语言之后再去想问题。组合逻辑和时序逻辑问题,以及同步复位和异步复位,阻塞和非阻塞的应用,电平触发和脉冲触发等问题,自己去找答案吧

wmessi 发表于 2012-9-28 09:21:21

同意楼上说的...

Coodool 发表于 2012-9-28 16:50:16

首先是语法不熟,其次是没有电路概念。
在指出问题之前先明确一个概念:寄存器是边沿触发,锁存器是电平触发。
下面是代码分析:
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]
查看完整版本: 初学FPGA,小程序搞不懂了。。。请各位大侠答疑解惑