0

我正在尝试编写一个能够生成Verilog代码的小型 Java 程序。由于我几乎不了解 Verilog 语言,因此在创建一个简单的示例时遇到了问题。

假设我们有 2 个输入a, b和 1 个输出c。还有2个州。State1是初始状态,并且达到State2一定的条件wire1,这需要b = 1

我在此示例中的输出将具有state2 & a要满足的条件。

问题:使用下面的近似设计,Verilog根据我的示例,完整的代码看起来如何?

//simplified without inheritance
class Input {
    String varname;
    new Input(String varname);
}

class Output {
    String varname;
    String condition;
    new Output(String varname, String condition);
}

class State {
    String varname;
    new State(String varname);
}

class Wire {
    String condition;
    Input input;
    Ouput output;
    new Wire(Input input, Output output, String condition);
}

Input input1 = new Input("a");
Input input2 = new Input("b");
State state1 = new State("initial");
State state2 = new State("following");
Wire wire12 = new Wire(state1, state2, "b");
Ouput output1 = new Output(c, "state2 & a");

基于此,verilog 代码将如何看待?

module BasicFsm(
    input clock,
    input reset,
    input a,
    input b,
    output c
);

always @(posedge clock)
//how to continue here?
4

1 回答 1

2

像下面这样的东西将是一个很好的开始,我认为可以很容易地从输入规范中派生出来。

在使用这样的东西之前,您还需要测试生成的代码,并且有许多免费的模拟器可用于此。这里有免费模拟器的相关问题。

module BasicFsm(
    input      clock,
    input      reset,
    input      a,
    input      b,
    output reg c
);

reg        state;
wire       nexstate;

localparam S_STATE1    = 1'b0; //Could name initial
localparam S_STATE2    = 1'b1; //Could name following

always @(posedge clock or posedge reset) begin
  if(reset) begin
    state <= S_STATE1;
  end
  else begin
    state <= nextstate
  end
end

//Combinatorial nextstate
always @* begin
  case(state) 
    S_STATE1    : 
     if ( b == 1'b1 ) begin
       nextstate = S_STATE2 ; 
     end
     else begin
       nextstate = state ; //Hold state
     end
    S_STATE2    : nextstate = state ; //locked up forever if you get here
    default     : nextstate = S_STATE1;
  endcase
end

//Combinatorial output
always @* begin
  c = (state == S_STATE2) && (a == 1'b1);
end
于 2013-04-09T14:02:21.337 回答