如何用4个触发器制作4位环形计数器?

问题描述

我有一个我正在尝试制作的 4 位环形计数器,我觉得我很接近,但我不知道如何使一个输入依赖于前一个状态的输出。这是我所拥有的:

`default_nettype none
// Empty top module

module top (
  // I/O ports
  input  logic hz100,reset,input  logic [20:0] pb,output logic [7:0] left,right
);

  // Your code goes here...
  q[3:0];
  
  assign q[3:0] = right[3:0];
  
  hc74_set setFF(.c(pb[0]),.d(pb[1]),.q(right[0]),.sn(pb[16]));
  hc74_reset resetFF1(.c(pb[0]),.q0(right[1]),.rn(pb[16]));
  hc74_reset resetFF2(.c(pb[0]),.q1(right[2]),.rn(pb[16]));
  hc74_reset resetFF3(.c(pb[0]),.q2(right[3]),.rn(pb[16]));
  
  
endmodule

// Add more modules down here...
// This is a single D flip-flop with an active-low asynchronous set (preset).
// It has no asynchronous reset because the simulator does not allow it.
// Other than the lack of a reset,it is half of a 74HC74 chip.
module hc74_set(input logic d,c,sn,output logic q,qn);
  assign qn = ~q;
  always_ff @(posedge c,negedge sn)
    if (sn == 1'b0)
      q <= 1'b1;
    else
      q <= d;
endmodule

// This is a single D flip-flop with an active-low asynchronous reset (clear).
// It has no asynchronous set because the simulator does not allow it.
// Other than the lack of a set,it is half of a 74HC74 chip.

module hc74_reset(input logic d,rn,negedge rn)
    if (rn == 1'b0)
      q <= 1'b0;
    else
      q <= d;
endmodule

这是在 FPGA 模拟器上,这就是为什么有一些东西,比如 pb(这些是按钮)和左、右输出,每组 8 个 LED。

解决方法

让我们首先确保我们在同一页面上

基于维基百科对ring counter的描述

这可以实现如下:

module top (
  // I/O ports
  input  logic reset_n,input  logic clk,output logic [3:0] ring
);

  // Your code goes here...
  always @(posedge clk or negedge reset_n) begin
    if(~reset_n) begin
      ring = 4'b0001;
    end
    else begin
      ring[0] <= ring[3];
      ring[1] <= ring[0];
      ring[2] <= ring[1];
      ring[3] <= ring[2];
    end
  end
endmodule

输出环是一个 4 位的单热向量,reset_n = 0 使 ring = 0001 每个时钟与 reset_n = 1 将环向右滚动,[0001,0010,0100,1000,0001,...]。

但是您想使用您定义的触发器的实例。请注意,在赋值 a <= b 中,a 是触发器的输出(q 端口),b 是触发器的输入(d 端口)。

module top (
  // I/O ports
  input  logic reset_n,output logic [3:0] ring
);

  // Your code goes here...
  
  hc74_set setFF(.c(clk),.d(ring[3]),.q(ring[0]),.sn(reset_n));
  hc74_reset resetFF1(.c(clk),.d(ring[0]),.q0(ring[1]),.rn(reset_n));
  hc74_reset resetFF2(.c(clk),.d(ring[1]),.q1(ring[2]),.rn(reset_n));
  hc74_reset resetFF3(.c(clk),.d(ring[2]),.q2(ring[3]),.rn(reset_n));  
endmodule

您必须相应地连接端口,我只使用 clk 作为时钟,使用 reset_n 作为否定复位信号。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...