Verilog算术方程系统练习

时间:2014-05-27 07:39:43

标签: verilog fsm alu mux

我是Verilog的新手,我找到了一些有趣的练习,但是有一个练习我坚持,有人可以帮助我吗?


练习:


实施一个算术方程式系统,当给出一些时 其输入值将为该等式提供解决方案。系统的伪代码如下:

t1 := in1 * in2  
t2 := 3 + in3  
t3 := 3 + in4  
t4 := t1 - t2  
out1 := in2 * t3  
out2 := in1 * t4  

有两种类型的ALU可供此系统使用。第一种类型可以 执行加法和减法(+/-)操作。您可以选择所需的操作 ALU使用选择信号执行。第二种类型的ALU仅执行乘法 操作(*)。您只有三个加法器/减法器ALU和两个乘法器ALU。

实施:

在实施系统之前,您应该为系统绘制纸张设计 遵循以下步骤:
1)识别系统的所有输入
2)确定所需的所有寄存器及其输入
3)确定所需的所有功能单元及其输入 4)确定功能单元输入端是否需要任何多路复用器
5)确定设计中所需的所有控制信号
6)设计控制这些信号所需的有限状态机 7)确定系统中所需的所有电线。

VERILOG实施:
在本节中,您需要按照以下步骤使用Verilog构建4位算术方程系统:
1)在单独的模块中实现设计中所需的所有4位组件(ALU, MUX和REG) 2)创建一个基于FSM的控制器,引导数据路径通过所需的 伪代码中指定的行为 3)模拟FSM以确保它输出所需的控制信号模式
4)创建一个系统模块,它有一个时钟按钮输入和一个复位按钮输入。 该模块实现了算术方程求解器的设计并包含一个 控制它的FSM实例。
5)编译您的设计并调试所有错误 6)模拟输入的不同值的设计,并确保您的设计 好好工作。

守则:

module ALU(in1,in2,select,out);
input [3:0] in1,in2;
input select;
output[3:0] out;
reg [3:0] out;
always @ (in1,in2,select)
    begin
    if(select==0) out=in1+in2;
    else out=in1-in2;
end
endmodule;  


module ALU(in1,in2,out);
input [3:0]  in1,in2;
output [3:0] out;
reg [3:0] out;
always @ (in1,in2)
    begin
    out=in1*in2;
end
endmodule;  


module Register(in,clock,out);
input [3:0] in;
reg [3:0] out;
input clock;
output[3:0] out;
always@(posedge clock)
begin
out=in;
end
endmodule;  


module MUX(in1,in2,select,out);
input select;
output[3:0] out :
input [3:0] in1,in2;
always @(in1,in2,select)
begin
case(select)
0:out=in1;
1:out=in2;
end

endmodule;  

这就是我不知道该怎么做的地方:

module FSM(clk, reset, select, out1, out2,in1,in2,in3,in4);

input clk,reset,in1,in2,in3,in4;
output select, out1, out2;
reg select, out1,out2;
reg [1:0] state;
reg [1:0] nextstate;

parameter S0 = 0;
parameter S1 = 1;
parameter S2 = 2;
parameter S3 = 3;

// State Register

always @(negedge clk or negedge reset)
if (reset == 0) state <= S0;
else state <= nextstate;

// Next State Logic
always @(state)
case (state)

S0: 
     begin
     //?!
                        MUX m1(in3,in4,1,out);
                        ALU a1(3,out,0);
                        nextstate <= S1;
     end
S1:
     begin
     end
S2: 
     begin
                        nextstate <= S3;
     end

S3: 
     begin
                        nextstate <=S0;
     end

default: nextstate <= S0;
endcase

endmodule;

P.S:在我的设计中,我只能使用1个执行乘法运算的ALU和另一个执行加法和减法运算的ALU。我应该提供设计吗?

1 个答案:

答案 0 :(得分:0)

您似乎对使用具有多个输入的模块与实例化多个模块之间的区别感到困惑。

首先,您无法在case语句中实例化模块:

S0: 
     begin
     //?!
                        MUX m1(in3,in4,1,out);  //WRONG
                        ALU a1(3,out,0);        //WRONG
                        nextstate <= S1;
     end
S1:

如果你只能在某个地方有一个ALU,那么你可以在任何程序块之外实例化该ALU。然后在case语句中,将模块的输入分配给所需的输入。它可能看起来像这样:

module FSM;
...
MUX m1(mux_in_a, mux_in_b, mux_sel, mux_out);
ALU a1(alu_in_a, alu_in_b, alu_out); 

// Next State Logic
always @(state)
case (state)
S0: 
     begin
         mux_in_a = in3;
         mux_in_b = in4;
         mux_sel = 1;

         alu_in_a = 3;
         alu_in_b = mux_out;

         nextstate = S1; //don't use nonblocking in combinatorial logic
     end
S1:

现在,即使您只有一个ALU和一个MUX,您可以根据状态选择哪些输入驱动到这些模块。