2013-04-09 123 views
0

我正在尝试编写一个能够生成Verilog代码的小型java程序。由于我几乎不知道Verilog语言,所以在创建一个简单示例时遇到问题。从Java代码到Verilog?

我们假设我们有2个输入a, b和1个输出c。还有2个州。 State1是初始状态,并且对于某个条件wire1需要State2,这需要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? 

回答

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