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