EDA课程设计.doc
《EDA课程设计.doc》由会员分享,可在线阅读,更多相关《EDA课程设计.doc(9页珍藏版)》请在冰豆网上搜索。
![EDA课程设计.doc](https://file1.bdocx.com/fileroot1/2022-10/4/cdbafed9-05e7-4f53-869a-c73f78c3d8ca/cdbafed9-05e7-4f53-869a-c73f78c3d8ca1.gif)
E
D
A
课
程
设
计
信息与计算机工程学院
电子信息专业3班
安吉旺20082966
一.设计要求
消除本设计中的PC模块,代之以存储器中的mem[20],也就是mem[20]就是pc(这样做的好处是pc这时候变成了可寻址单元,(可以直接修改pc实现程序的绝对跳转)。
另外,将冯·诺依曼(vonNeuman)的体系结构改成哈佛结构,将编写机器码并且给出仿真波形。
二.结构说明
冯·诺依曼(vonNeuman)的体系结构,将指令、数据、地址存储在同一存储器中,统一编址,依靠指令计数器提供的地址来区分是指令、数据还是地址。
取指令和取数据都访问同一存储器。
而哈佛结构是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个相互独立的存储器,每个存储器独立编址,独立访问。
三.程序代码
1.控制器代码
modulecontrol(
inputclock,
inputreset,
outputregs0,//fetchinstruction
outputregs1,//decode
outputregs2,//readmemorydataforprocess
outputregs3,//enablealutocompute
outputregs4,//writetomemoryifnessary
outputregs5,//increasepc
//outputregaddrsel,
outputreginstr_add,
outputreginstr_sub,
outputreginstr_and,
outputreginstr_pass,
input[2:
0]opcode);
parameter LDA=3'b000,STA=3'b001,ADD=3'b010,
SUB=3'b011,AND=3'b100,HLT=3'b101;
//JMP=3'b110,JZF=3'b111;
reg[2:
0]cnt;
always@(posedgeclockorposedgereset)
if(reset)
cnt<=0;
else
if(cnt==5)
cnt<=0;
else
cnt<=cnt+1;
always@*
begin
case(cnt)
0:
begin//fetchinstruction
s0<=1;s1<=0;s2<=0;s3<=0;s4<=0;s5<=0;
//addrsel<=0;
end
1:
begin//decode
s0<=0;s1<=1;s2<=0;s3<=0;s4<=0;s5<=0;
//addrsel<=0;
end
2:
begin//readmemorydataforprocessifnessary
s0<=0;s1<=0;/*s2=1;*/s3<=0;s4<=0;s5<=0;
//addrsel<=1;
if((opcode==LDA)||(opcode==ADD)||(opcode==SUB)||(opcode==AND))
s2<=1;
else
s2<=0;
end
3:
begin//enableALUtocompute
s0<=0;s1<=0;s2<=0;s3<=1;s4<=0;s5<=0;
//addrsel<=1;
if(opcode==LDA)begininstr_add<=0;
instr_sub<=0;
instr_and<=0;
instr_pass<=1;
end
elseif(opcode==ADD)begininstr_add<=1;
instr_sub<=0;
instr_and<=0;
instr_pass<=0;
end
elseif(opcode==SUB)begininstr_add<=0;
instr_sub<=1;
instr_and<=0;
instr_pass<=0;
end
elseif(opcode==AND)begininstr_add<=0;
instr_sub<=0;
instr_and<=1;
instr_pass<=0;
end
elseif(opcode==STA)begininstr_add<=0;
instr_sub<=0;
instr_and<=0;
instr_pass<=0;
end
elsebegininstr_add<=0;
instr_sub<=0;
instr_and<=0;
instr_pass<=0;
end
end
4:
begin//writetomemoryifnessary
s0<=0;s1<=0;s2<=0;s3<=0;/*s4<=1;*/s5<=0;
//addrsel<=1;
if(opcode==STA)s4<=1;
elses4<=0;
end
5:
begins0<=0;s1<=0;s2<=0;s3<=0;s4<=0;s5<=1;
//addrsel<=1;
end
endcase
end
endmodule
2.存储器代码
(1)modulememory(clock,reset,addr,din,dout,rd,wr,IN,OUT,pc,pc_en);
inputclock,reset;
inputpc_en;
input[7:
0]din;
input[4:
0]addr;
outputreg[7:
0]dout;
inputrd,wr;
input[7:
0]IN;
outputreg[7:
0]OUT;
output[4:
0]pc;
wire[7:
0]pc_next;
assignpc_next=mem[20];
//reg[7:
0]mem[31:
0];
reg[7:
0]mem[30:
0];
always@(posedgeclockorposedgereset)
if(reset)begin
mem[0]<='b1;//00001011;//LDA11
mem[1]<='b1;//01001100;//ADD12
mem[2]<='b1;//00101101;//STA13
// mem[3]<='b00001011;//LDA11
mem[3]<='b1;//00011111;//LDA31
mem[4]<='b1;//10001100;//AND12
// mem[5]<='b00101110;//STA14
mem[5]<='b1;//00111111;//STA31
mem[6]<='b1;//00001011;//LDA11
mem[7]<='b1;//01101100;//SUB12
// mem[8]<='b00101111;//STA15
mem[8]<='b1;//00110100;//stapc
mem[9]<='b1;//10100000;//HLT
mem[10]<='b1;
mem[11]<='b10101010;
mem[12]<='b01010101;
mem[13]<='b1;
mem[14]<='b1;
mem[15]<='b1;
mem[16]<='b1;
mem[17]<='b1;
mem[18]<='b1;
mem[19]<='b1;
mem[20]<='b0;
mem[21]<='b00001011;
mem[22]<='b01001100;
mem[23]<='b00101101;
mem[24]<='b1;
mem[25]<='b1;
mem[2