带verilog的双时钟环计数器

带verilog的双时钟环计数器,verilog,microprocessors,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

我正在尝试编写一个滚动移位/响铃计数器,它以两个开关作为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
模块滚动(CLK1、CLK2、LED);
输入CLK1;
输入CLK2;
输出[3:0]个LED;
reg[3:0]发光二极管;
首字母
开始
发光二极管=4'b0001;
结束
始终@(posedge CLK1或posedge CLK2)
开始
如果(CLK1)
开始

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

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

您的代码在逻辑上也不符合您的要求。考虑当CLK1已经很高(或者反之亦然)时,如果CLK2上有上升沿,代码会发生什么。您的灯光将向左滚动,然后立即向右滚动增益,结果不变

一种更常见的方法是让时钟运行得比预期的上下输入变化快得多,并用它来驱动逻辑。比如说

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;
模块滚轮(输入时钟、输入rst、输入上升、输入下降、输出调节LED[3:0]);
reg UP1,DOWN1;
始终@(posedge clk或posedge rst)
如果(rst)开始

LED[3:0]记住Verilog不是一种编程语言,而是一种硬件描述语言

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

您的代码在逻辑上也不符合您的要求。考虑当CLK1已经很高(或者反之亦然)时,如果CLK2上有上升沿,代码会发生什么。您的灯光将向左滚动,然后立即向右滚动增益,结果不变

一种更常见的方法是让时钟运行得比预期的上下输入变化快得多,并用它来驱动逻辑。比如说

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;
模块滚轮(输入时钟、输入rst、输入上升、输入下降、输出调节LED[3:0]);
reg UP1,DOWN1;
始终@(posedge clk或posedge rst)
如果(rst)开始

LED[3:0]很有用,因为您有多个驱动程序。您需要使用多路复用器进行此分配。这个问题更多的是关于数字逻辑可以做什么,而不是关于Verilog的语法或符号,因此它可能属于上而不是这里。当然,因为您有多个驱动程序。这个问题更多的是关于数字逻辑可以做些什么,而不是关于Verilog的语法或符号,所以它可能属于上而不是这里。