从Java代码到Verilog?

时间:2013-04-09 13:08:17

标签: java verilog

我正在尝试编写一个能够生成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?

1 个答案:

答案 0 :(得分:2)

以下某些内容对于我认为可以从输入规范轻松派生的实现来说是一个良好的开端。

在使用此类内容之前,您需要测试生成的代码,还有许多可用的免费模拟器。免费模拟器here有相关问题。

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