【问题标题】:Verilog Arithmetic Equation System ExerciseVerilog 算术方程系统练习
【发布时间】:2014-07-16 00:36:27
【问题描述】:

我是 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。我应该提供设计吗?

【问题讨论】:

  • 你在坚持什么?
  • 我已经实现了 ALU 模块、Mux 模块和寄存器模块,但我不知道如何针对不同的输入多次实现 ALU! (知道您最多可以使用 2 个乘法 ALU)
  • @Techflow 你能否展示一些代码,让其他人看到你实际做了什么并找出你卡在哪里?
  • @e19293001,好的,很抱歉给您带来麻烦!

标签: verilog fsm alu mux


【解决方案1】:

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

首先,不能在 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,您也可以根据状态选择将哪些输入驱动到这些模块。

【讨论】:

  • 是的,这是我自己想出来的。无论如何,非常感谢,很抱歉给您带来麻烦!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多