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