两个时钟环计数器与verilog

时间:2017-04-11 01:23:04

标签: verilog microprocessors

我正在尝试编写一个滚动移位/环形计数器,它将两个开关作为verilog中的时钟。

我的代码如下:

module roll(CLK1, CLK2, LEDS);
input CLK1;
input CLK2;
output [3:0] LEDS;
reg [3:0] LEDS;


initial 
begin
LEDS = 4'b0001;
end


always@(posedge CLK1 or posedge CLK2)
begin
if(CLK1)
begin

         LEDS[3]<=LEDS[2];
         LEDS[2]<=LEDS[1];
      LEDS[1]<=LEDS[0];
         LEDS[0]<=LEDS[3];
end

// Roll Right
if(CLK2)
begin
         LEDS[3]<=LEDS[0];
         LEDS[2]<=LEDS[3];
         LEDS[1]<=LEDS[2];
         LEDS[0]<=LEDS[1];

 end
end
endmodule

我尝试使用两个always块,但后来发现我不能这样做。当我在posedge CLK2语句中有always时,我的FPGA上的LED都会保持不变。

1 个答案:

答案 0 :(得分:5)

记住Verilog不是一种编程语言,它是一种硬件描述语言。

编写合成代码时,只有编写可以用实际门实例化的代码才能成功。因此,除非对两个信号之一的响应具有RESET或PRESET操作的效果,否则无法合成写入对两个不同信号的边沿敏感的始终块。

您的代码在逻辑上也不会执行您想要的操作。如果在CLK1已经为高电平时CLK2存在上升沿(或反之亦然),请考虑代码所说的内容。你的灯会向左滚动然后立即向右滚动增益,导致没有变化。

更常见的方法是使时钟运行速度比预期UP和DOWN输入更快,并使用它来驱动逻辑。例如

enum

请注意,这优先于UP。如果UP和DOWN都被置位,则模式将“向上”而不是向下滚动。如果你想要一个不同的行为,你必须修改代码才能实现它。