-1

我是 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) 在单独的模块(ALU、MUX 和 REG)中实现设计中所需的所有 4 位组件。
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;

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

4

1 回答 1

0

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

首先,您不能在 case 语句中实例化模块:

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

如果某处只能有一个 ALU,则在任何程序块之外实例化该 ALU。然后在您的案例语句中,将模块的输入分配给您想要的输入。它可能看起来像这样:

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,你也可以根据状态选择哪些输入被驱动到这些模块。

于 2014-05-28T20:55:55.557 回答