【发布时间】: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,好的,很抱歉给您带来麻烦!