8位ALU算术逻辑单元verilog语言.docx
- 文档编号:6183891
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:12
- 大小:242.48KB
8位ALU算术逻辑单元verilog语言.docx
《8位ALU算术逻辑单元verilog语言.docx》由会员分享,可在线阅读,更多相关《8位ALU算术逻辑单元verilog语言.docx(12页珍藏版)》请在冰豆网上搜索。
8位ALU算术逻辑单元verilog语言
大连理工大学城市学院
FPGA实验报告
实验内容:
8位ALU
系别班级:
电子1004班
学号:
姓名:
日期:
2013.4.14
一.设计概述:
一种基于可编程逻辑器件FPGA和硬件描述语言的8位的ALU的设计方法。
该ALU采用层次设计方法,有寄存器模块、控制模块和显示模块组成,能实现8位无符号数的取值、加减和4种逻辑运算(与、或、异或、同或)。
该ALU在QuartusII软件环境下进行功能仿真,通过DE2验证。
二.设计功能:
1、该处理器的数据宽度为8bit,可以实现算术加法、减法、逻辑与、逻辑或、逻辑非、逻辑与非、逻辑或非和逻辑异或等8种运算。
ﻩ2、用选择端opcode [2:
0]选择8种运算,2个操作数分别是a_r[7:
0]和b_r[7:
0],运算结果是alu_out[7:
0];并定义选择如下。
ﻩ
选择端opcode[2:
0]
运算结果
解释说明
000
A
操作数a_r[7:
0]
001
B
操作数b_r[7:
0]
010
算术加法
011
算术减法
100
逻辑与
101
逻辑或
110
逻辑异或
111
逻辑同或
3、使用DE2板上的3个拨码开关设置当前ALU的运算功能,再由8个拨码开关给定数据A和数据B,由一个按键key手动提供脉冲。
三.设计方案:
本设计共有5个模块。
ﻩ1)脉冲输出器(key手动脉冲),计数依次产生4个脉冲到各个部件,第一个脉冲启动信号。
ﻩ2)寄存器A,第二个脉冲来时锁存数据A,并在数码管上显示。
3)寄存器B,第三个脉冲来时锁存数据B,并在数码管上显示。
4)8位ALU,第四个脉冲来时进行运算,并锁存结果alu_out。
5)结果显示器,将结果显示通过DE2上的数码管显示。
四.程序分析:
主程序模块:
modulealu8(clk,clk_r,rst,a,b,alu_out,opcode,sw_ab,HEX1, HEX0,HEX7, HEX6, HEX5,HEX4);
input clk,rst,clk_r;
input[7:
0]sw_ab;
input[2:
0]opcode;
output[6:
0] HEX1,HEX0,HEX7,HEX6, HEX5, HEX4;
output [7:
0]a;
output[7:
0] b;
output[7:
0]alu_out;
regaU1(.clk(clk),.rst(rst),.sw_ab(sw_ab),.a_r(a),.clk_r(clk_r),.HEX7(HEX7),.HEX6(HEX6));
regbU2(.clk(clk),.rst(rst),.sw_ab(sw_ab),.b_r(b),.clk_r(clk_r),.HEX5(HEX5),.HEX4(HEX4));
alurU3(.clk(clk),.rst(rst),.a_r(a),.b_r(b),.alu_out(alu_out),.opcode(opcode));
digitalU4(.clk_r(clk_r),.rst(rst),.alu_out(alu_out),.HEX1(HEX1),.HEX0(HEX0));
endmodule
第一位数A模块:
modulerega (clk,clk_r,rst,sw_ab,a_r,HEX7,HEX6);
input[7:
0]sw_ab;
inputclk,clk_r,rst;
output[7:
0]a_r;
reg[7:
0]a_r;
outputreg[6:
0]HEX7,HEX6;
reg[3:
0]cnt;
always@(posedgeclkornegedge rst)
if(!
rst)cnt<=1'd0;
elseif(cnt==5)cnt<=1'd0;
elsecnt<=cnt+1'd1;
always@(posedgeclkornegedgerst)
ﻩif(!
rst)a_r=0;
else if(cnt==1)a_r=sw_ab;
elsea_r=a_r;
parameter seg0=7'b1000000,
seg1=7'b1111001,seg2=7'b0100100,seg3=7'b0110000,seg4=7'b0011001,seg5=7'b0010010,seg6=7'b0000010,
seg7=7'b1111000,seg8=7'b0000000,seg9=7'b0010000,sega=7'b0001000,segb=7'b0000011,segc=7'b1000110,
segd=7'b0100001,sege=7'b0000110,segf=7'b0001110;
always@(posedgeclk_r)
case(a_r[3:
0])
4'h0:
HEX6[6:
0]=seg0;
4'h1:
HEX6[6:
0]=seg1;
4'h2:
HEX6[6:
0]=seg2;
4'h3:
HEX6[6:
0]=seg3;
4'h4:
HEX6[6:
0]=seg4;
4'h5:
HEX6[6:
0]=seg5;
4'h6:
HEX6[6:
0]=seg6;
4'h7:
HEX6[6:
0]=seg7;
4'h8:
HEX6[6:
0]=seg8;
4'h9:
HEX6[6:
0]=seg9;
4'ha:
HEX6[6:
0]=sega;
4'hb:
HEX6[6:
0]=segb;
4'hc:
HEX6[6:
0]=segc;
4'hd:
HEX6[6:
0]=segd;
4'he:
HEX6[6:
0]=sege;
4'hf:
HEX6[6:
0]=segf;
default:
HEX6[6:
0]=seg0;
endcase
always@(posedgeclk_r)
case(a_r[7:
4])
4'h0:
HEX7[6:
0]=seg0;
4'h1:
HEX7[6:
0]=seg1;
4'h2:
HEX7[6:
0]=seg2;
4'h3:
HEX7[6:
0]=seg3;
4'h4:
HEX7[6:
0]=seg4;
4'h5:
HEX7[6:
0]=seg5;
4'h6:
HEX7[6:
0]=seg6;
4'h7:
HEX7[6:
0]=seg7;
4'h8:
HEX7[6:
0]=seg8;
4'h9:
HEX7[6:
0]=seg9;
4'ha:
HEX7[6:
0]=sega;
4'hb:
HEX7[6:
0]=segb;
4'hc:
HEX7[6:
0]=segc;
4'hd:
HEX7[6:
0]=segd;
4'he:
HEX7[6:
0]=sege;
4'hf:
HEX7[6:
0]=segf;
default:
HEX7[6:
0]=seg0;
endcase
endmodule
第二位数B模块:
moduleregb(clk,clk_r,rst,sw_ab,b_r,HEX5,HEX4);
input[7:
0]sw_ab;
inputclk,clk_r,rst;
output [7:
0]b_r;
reg[7:
0]b_r;
outputreg[6:
0] HEX5,HEX4;
reg[3:
0] cnt;
always@(posedgeclkornegedgerst)
if(!
rst)cnt<=1'd0;
else if(cnt==5) cnt<=1'd0;
elsecnt<=cnt+1'd1;
always@(posedgeclkornegedgerst)
ﻩif(!
rst)b_r=0;
elseif(cnt==2)b_r=sw_ab;
elseb_r=b_r;
parameter seg0=7'b1000000,
seg1=7'b1111001, seg2=7'b0100100,seg3=7'b0110000,seg4=7'b0011001,seg5=7'b0010010,seg6=7'b0000010,
seg7=7'b1111000,seg8=7'b0000000,seg9=7'b0010000,sega=7'b0001000,segb=7'b0000011,segc=7'b1000110,
segd=7'b0100001,sege=7'b0000110,segf=7'b0001110;
always@(posedge clk_r)
case(b_r[3:
0])
4'h0:
HEX4[6:
0]=seg0;
4'h1:
HEX4[6:
0]=seg1;
4'h2:
HEX4[6:
0]=seg2;
4'h3:
HEX4[6:
0]=seg3;
4'h4:
HEX4[6:
0]=seg4;
4'h5:
HEX4[6:
0]=seg5;
4'h6:
HEX4[6:
0]=seg6;
4'h7:
HEX4[6:
0]=seg7;
4'h8:
HEX4[6:
0]=seg8;
4'h9:
HEX4[6:
0]=seg9;
4'ha:
HEX4[6:
0]=sega;
4'hb:
HEX4[6:
0]=segb;
4'hc:
HEX4[6:
0]=segc;
4'hd:
HEX4[6:
0]=segd;
4'he:
HEX4[6:
0]=sege;
4'hf:
HEX4[6:
0]=segf;
default:
HEX4[6:
0]=seg0;
endcase
always@(posedgeclk_r)
case(b_r[7:
4])
4'h0:
HEX5[6:
0]=seg0;
4'h1:
HEX5[6:
0]=seg1;
4'h2:
HEX5[6:
0]=seg2;
4'h3:
HEX5[6:
0]=seg3;
4'h4:
HEX5[6:
0]=seg4;
4'h5:
HEX5[6:
0]=seg5;
4'h6:
HEX5[6:
0]=seg6;
4'h7:
HEX5[6:
0]=seg7;
4'h8:
HEX5[6:
0]=seg8;
4'h9:
HEX5[6:
0]=seg9;
4'ha:
HEX5[6:
0]=sega;
4'hb:
HEX5[6:
0]=segb;
4'hc:
HEX5[6:
0]=segc;
4'hd:
HEX5[6:
0]=segd;
4'he:
HEX5[6:
0]=sege;
4'hf:
HEX5[6:
0]=segf;
default:
HEX5[6:
0]=seg0;
endcase
endmodule
运算模块:
modulealur(clk,rst,alu_out,a_r,b_r,opcode,zero);
output [7:
0]alu_out;
outputzero;
input [7:
0]a_r,b_r;
input[2:
0]opcode;
input clk,rst;
reg[7:
0]alu_out;
reg [3:
0]cnt;
parameterquA=3'b000,quB=3'b001,ADD=3'b010,DEC=3'b011,ANDD=3'b100,XORR=3'b101,XOR=3'b110,NXOP=3'b111;
assignzero=!
a_r;
always@(posedge clk or negedgerst)
if(!
rst) cnt<=1'd0;
elseif(cnt==5)cnt<=1'd0;
elsecnt<=cnt+1'd1;
always@(posedgeclkornegedgerst)
if(!
rst)alu_out=0;
elseif(cnt==3)begin
casex(opcode)
quA:
alu_out<=a_r;
quB:
alu_out<=b_r;
ADD:
alu_out<=a_r+b_r;
DEC:
alu_out<=a_r-b_r;
ANDD:
alu_out<=a_r&b_r;
XORR:
alu_out<=a_r|b_r;
XOR:
alu_out<=a_r^b_r;
NXOP:
alu_out<=a_r^~b_r;
default:
alu_out<=8'bxxxx_xxxx;
endcase
end
elsealu_out=0;
endmodule
结果显示模块:
module digital(clk_r,rst,alu_out,HEX1,HEX0);
input [7:
0] alu_out;
inputclk_r,rst;
output reg[6:
0]HEX1,HEX0;
parameter seg0=7'b1000000,
seg1=7'b1111001,seg2=7'b0100100,seg3=7'b0110000,seg4=7'b0011001,seg5=7'b0010010,seg6=7'b0000010,
seg7=7'b1111000,seg8=7'b0000000,seg9=7'b0010000,sega=7'b0001000,segb=7'b0000011,segc=7'b1000110,
segd=7'b0100001,sege=7'b0000110,segf=7'b0001110;
always@(posedgeclk_r)
case(alu_out[3:
0])
4'h0:
HEX0[6:
0]=seg0;
4'h1:
HEX0[6:
0]=seg1;
4'h2:
HEX0[6:
0]=seg2;
4'h3:
HEX0[6:
0]=seg3;
4'h4:
HEX0[6:
0]=seg4;
4'h5:
HEX0[6:
0]=seg5;
4'h6:
HEX0[6:
0]=seg6;
4'h7:
HEX0[6:
0]=seg7;
4'h8:
HEX0[6:
0]=seg8;
4'h9:
HEX0[6:
0]=seg9;
4'ha:
HEX0[6:
0]=sega;
4'hb:
HEX0[6:
0]=segb;
4'hc:
HEX0[6:
0]=segc;
4'hd:
HEX0[6:
0]=segd;
4'he:
HEX0[6:
0]=sege;
4'hf:
HEX0[6:
0]=segf;
default:
HEX0[6:
0]=seg0;
endcase
always@(posedgeclk_r)
case(alu_out[7:
4])
4'h0:
HEX1[6:
0]=seg0;
4'h1:
HEX1[6:
0]=seg1;
4'h2:
HEX1[6:
0]=seg2;
4'h3:
HEX1[6:
0]=seg3;
4'h4:
HEX1[6:
0]=seg4;
4'h5:
HEX1[6:
0]=seg5;
4'h6:
HEX1[6:
0]=seg6;
4'h7:
HEX1[6:
0]=seg7;
4'h8:
HEX1[6:
0]=seg8;
4'h9:
HEX1[6:
0]=seg9;
4'ha:
HEX1[6:
0]=sega;
4'hb:
HEX1[6:
0]=segb;
4'hc:
HEX1[6:
0]=segc;
4'hd:
HEX1[6:
0]=segd;
4'he:
HEX1[6:
0]=sege;
4'hf:
HEX1[6:
0]=segf;
default:
HEX1[6:
0]=seg0;
endcase
endmodule
五.仿真实现:
整体图:
波形图:
六.硬件实现:
1.引脚图:
2.分析结果说明:
开关0~2是算法选择,具体算法类型见设计功能第2项
开关10~17数字输入,用8位二进制数表示两个十六进制数,每四位表示一位
按键0是锁存及运算,当开关10~17输入一个数A时,按下按键0,数据就是锁存,
再输入数就是数B,而当数据B也锁存后,再次按下按键0,就会显示运算结果
按键1是复位键
七.总结:
通过这次FPGA实验课让我明白了真正的编程不像是那些C语言小程序那么简单,为了这次实验算是绞尽脑汁,最后为了读懂程序,还去专门找了Verilog语言辅导书,
不管过程再怎么复杂曲折,总算是顺利的完成了实验任务,到了现在回顾为期6周的学ﻩ习过程,也有一些时候是因为上课不认真,为后来的程序设计增加了难度,也有一些原因是因为自己本身能力不足导致设计接连失败,不得不说,也有一部分原因是因为学习实验室的器件不足,限制了实验设计的范围,也使实验难度增加。
特别要感谢老师在最后实验设计时的指导,让我的这次实验能够这么顺利的完成。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ALU 算术 逻辑 单元 verilog 语言