【问题标题】:two clock ring counter with verilog两个带verilog的时钟环形计数器
【发布时间】:2017-04-11 01:23:04
【问题描述】:

我正在尝试编写一个滚动移位/环形计数器,它需要两个开关作为 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 块,但后来发现我不能这样做。当我在always 语句中有posedge CLK2 时,我的FPGA 上的LED 都亮着。

【问题讨论】:

  • 当然,因为您有多个驱动程序。您需要为此分配使用多路复用器。
  • 这个问题更多的是关于数字逻辑可以做什么,而不是 Verilog 的语法或语义,所以它可能属于Electrical Engineering Stackexchange 而不是这里。

标签: verilog microprocessors


【解决方案1】:

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

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

您的代码在逻辑上也没有按照您的意愿执行。考虑一下如果 CLK1 已经为高电平时 CLK2 上出现上升沿(反之亦然),您的代码会发生什么。您的灯将向左滚动,然后立即向右滚动增益,不会发生任何变化。

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

module roller(input clk, input rst, input UP, input DOWN, output reg LEDS[3:0]);

reg UP1, DOWN1;

always @(posedge clk or posedge rst)
if (rst) begin
    LEDS[3:0] <= 4'b0001;
end 
else
begin
    UP1 <= UP;
    DOWN1 <= DOWN;
    if (UP & ~UP1) begin
         LEDS[3:0] <= {LEDS[2:0], LEDS[3]};
    end
    else if (DOWN & ~DOWN1) begin
         LEDS[3:0] <= {LEDS[0], LEDS[3:1]};
    end
end
endmodule;

请注意,这会优先考虑 UP。如果 UP 和 DOWN 都被断言,则模式将“向上”滚动而不是向下滚动。如果你想要不同的行为,你必须修改代码来实现它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多