Verilog代码:
译码器
module decoder (
input en,
input [7:0] ir,
output reg mova,movb,movc,add,sub,and1,not1,rsr,rsl,jmp,jz,jc,in1,out1,nop,halt);
parameter yes=1'b1,no=1'b0;
always @(*) begin
{mova,movb,movc,add,sub,and1,not1,rsr,rsl,jmp,jz,jc,in1,out1,nop,halt} = no;
begin
case (ir[7:4])
4'b1100 : begin
if(ir[3:2]==2'b11) movb=en&yes;
else if(ir[1:0]==2'b11) movc=en&yes;
else mova=en&yes;
end
4'b1001 : begin
add=en&yes;
end
4'b0110 : begin
sub=en&yes;
end
4'b1011 : begin
and1=en&yes;
end
4'b0101 : begin
not1=en&yes;
end
4'b1010 : begin
if(ir[1:0]==2'b00) rsr=en&yes;
else if(ir[1:0]==2'b11) rsl=en&yes;
//else begin end
end
4'b0011 : begin
if(ir[3:0]==4'b0000) jmp=en&yes;
else if(ir[3:0]==4'b0001) jz=en&yes;
else if(ir[3:0]==4'b0010) jc=en&yes;
//else begin end
end
4'b0010 : begin
in1=en&yes;
end
4'b0100 : begin
out1=en&yes;
end
4'b0111 : begin
if(ir[3:0]==4'b0000) nop=en&yes;
//else begin end;
end
4'b1000 : begin
if(ir[3:0]==4'b0000) halt=en&yes;
//else begin end;
end
default: begin end
endcase
end
end
endmodule
alu
module alu (
input m,
input [3:0] s,
input [7:0] a,b,
output reg[7:0] t,
output reg cf,zf
);
reg [8:0] middle;
parameter yes=1'b1,no=1'b0;
always @(*)
begin
if (m==1) begin
case (s)
4'b1001:begin
middle=a+b;
cf=middle[8:8];
t=middle[7:0];
if(t==8'b0000_0000)begin
zf=1;
end
else begin
zf=0;
end
end
4'b0110:begin
middle=b+9'b100_000_000;
middle=middle-a;
cf=~middle[8:8];
t=middle[7:0];
if(t==8'b0000_0000)begin
zf=1;
end
else begin
zf=0;
end
end
4'b1011:begin
t=a&b;
end
4'b0101:begin
t=~b;
end
4'b1010:begin
t=b;
end
4'b0100:begin
t=b;
end
default:begin
t=8'b0000_0000;
end
endcase
end
else begin
if(s==4'b1100) begin
t=a;
end
else begin
end
end
end
endmodule
alu代码有同学和我说有问题,不过我验收的时候是没有问题的,可能这个代码某些地方有些小问题。