X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
FPGA/CPLD
[求助] Verilog
1520415739
2016-11-8 10:35
楼主
谁有Verilog设计的ALU例子,给我一个(不要从网上复制的)
点赞
回复评论 (2)
沙发
cclccl941123
/* 设计思路 */
//分成两个模块来设计:control_decoder(即控制信号产生模块),根据相应的条件产生控制信号ALU_control
// ALU_out(即运算模块),根据产生的控制信号来进行相应的运算,需要在模块里面调用control_decoder模块(即例化),
// 将control_decoder模块产生的控制信号送到ALU_out模块,将两个模块连起来。这样在写Testbench的时候只需要调用例化ALU_out模块即可
// 也可以不再ALU_out模块里面调用control_decoder模块,在写Testbench的时候将两个模块都例化,在用到ALU整体的时候把两个模块都调用(即例化)
`timescale 1ns/100ps
module control_decoder(ALU_op,Func,ALU_control);
input wire [1:0] ALU_op;
input wire [5:0] Func;
reg [2:0] ALU_control_reg; //中间变量
output wire [2:0] ALU_control; //输出控制信号
parameter Add = 3'b010,Subtract = 3'b110,And = 3'b000,Or = 3'b001,SLT = 3'b111;
parameter S0 = 6'b100_000,S1 = 6'b100_010,S2 = 6'b100_100,S3 = 6'b100_101,S4 = 6'b101_010;
parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b10;
always @(ALU_op or Func)
begin
case(ALU_op)
s0:
ALU_control_reg <= Add;
s1:
ALU_control_reg <= Subtract;
s2:
begin
case(Func)
S0:
ALU_control_reg <= Add;
S1:
ALU_control_reg <= Subtract;
S2:
ALU_control_reg <= And;
S3:
ALU_control_reg <= Or;
S4:
ALU_control_reg <= SLT;
endcase
end
endcase
end
assign ALU_control = ALU_control_reg;
endmodule
`timescale 1ns/100ps
module ALU_out(A,B,ALU_op_out,Func_in,Y,Zero);
input wire [31:0] A;
input wire [31:0] B;
input [1:0] ALU_op_out; //这两个信号必须在端口声明里面进行定义,作为这个模块的输入
input [5:0] Func_in;
reg[31:0] Y_reg;//中间变量
output wire [31:0] Y; //ALU输出信号
output wire Zero; //零值信号
wire [1:0] ALU_op_out;
wire [5:0] Func_in;
wire [2:0] ALU_control_out;
parameter s0 = 3'b000,s1 = 3'b010,s2= 3'b110,s3 = 3'b001,s4 = 3'b111;
// 与 加 减 或 SLT
control_decoder control_decoder_out(.ALU_op(ALU_op_out),.Func(Func_in),.ALU_control(ALU_control_out));
always @(A or B or ALU_control_out) //这里的敏感条件必须把ALU_control_out加上,否则最后输出会有问题!!!!!!!!!!!
begin
case(ALU_control_out)
s0:
Y_reg <= A&B;
s1:
Y_reg <= A+B;
s2:
Y_reg <= A-B;
s3:
Y_reg <= A|B;
s4:
Y_reg <= A<B ? 32'b1 : 32'b0; //SLT
endcase
end
assign Y = Y_reg;
assign Zero = (A==B);
endmodule
`timescale 1ns/100ps
module ALU_out_tb();
reg [31:0] A_tb,B_tb;
reg [1:0] ALU_op_tb;
reg [5:0] Func_tb;
wire [31:0] Y_tb;
wire Zero_tb;
ALU_out ALU_tb(.A(A_tb),.B(B_tb),.ALU_op_out(ALU_op_tb),.Func_in(Func_tb),.Y(Y_tb),.Zero(Zero_tb));
initial
begin
A_tb <= 9;
B_tb <= 1;
ALU_op_tb <= 2'b00; //加 10 1010
Func_tb <= 6'b100000;
#2;
A_tb <= 9;
B_tb <= 1;
ALU_op_tb <= 2'b01; //减 8 1000
Func_tb <= 6'b100000;
#2;
A_tb <= 9;
B_tb <= 1;
ALU_op_tb <= 2'b10; //加 10 1010
Func_tb <= 6'b100000;
#2;
A_tb <= 9;
B_tb <= 1;
ALU_op_tb <= 2'b10; //减 8 1000
Func_tb <= 6'b100010;
#2;
A_tb <= 9;
B_tb <= 1;
ALU_op_tb <= 2'b10; //与 1 0001
Func_tb <= 6'b100100;
#2;
A_tb <= 9;
B_tb <= 1;
ALU_op_tb <= 2'b10; //或 9 1001
Func_tb <= 6'b100101;
#2;
A_tb <= 9;
B_tb <= 1;
ALU_op_tb <= 2'b10; //SLT 0 0000
Func_tb <= 6'b101010;
#2;
#100 $stop; //使仿真停止,若没有死循环的话这句话可加可不加
end
endmodule
点赞
2016-11-15 17:54
板凳
cclccl941123
好像有点乱了,很久之前写的,看到就拿过来了,希望对你有帮助
点赞
2016-11-15 17:55
最新活动
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
随便看看
你家里安装安防系统了吗?
[原创]单片机—要重视它,要趁早学!
【辛版的小编程题】指针作为参数传递?
了解移动电源充电的基本知识
针对Intel® Atom处理器N270的电源参考设计
TL16C554波特率如何设置
产品防爆等级认识
一个关于AD转换效率的问题,知道的朋友请说下
MSP430F169不用USB的话,怎样在编译器CCS中设置定义变量
你们的OLED能显示出红色吗? 我写的是红色
诚邀加入讨论组
请教一个ARM RTC提前跳转的问题
名词解释:Transmissive display
一直努力摸索UART通訊中。。。
面试时回答问题技巧(重点已标注)
单片机c语言应用
求助!谁有关于<<移动电话用户编号方案>>的资料?急用!
EE_FPGA USB转口驱动
IO口时钟设置问题
欧姆龙E6A2
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复