《基于QuartusII的FPGACPLD数字系统设计与应用》范例的源程序课案.docx
- 文档编号:14799840
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:142
- 大小:44.63KB
《基于QuartusII的FPGACPLD数字系统设计与应用》范例的源程序课案.docx
《《基于QuartusII的FPGACPLD数字系统设计与应用》范例的源程序课案.docx》由会员分享,可在线阅读,更多相关《《基于QuartusII的FPGACPLD数字系统设计与应用》范例的源程序课案.docx(142页珍藏版)》请在冰点文库上搜索。
《基于QuartusII的FPGACPLD数字系统设计与应用》范例的源程序课案
2-28
moduleadder_4(cout,sum,ina,inb,cin,clk);
output[3:
0]sum;
outputcout;
input[3:
0]Ina,inb;//tempa,tempb中间变量声明
inputcin,clk;
reg[3:
0]tempa,tempb,sum;
regcout;
regtempc;//tempc中间变量声明
always@(posedgeclk)//alwaysclk上升沿触发
begin//阻塞语句
tempa=ina;
tempb=inb;
tempc=cin;
end
always@(posedgeclk)//alwaysclk上升沿触发
begin
{cout,sum}=tempa+tempb+tempc;
end
endmodule
2-40
`timescale1ns/10ps
moduleadder4_testbench;
reg[3:
0]ina,inb;
regcin;
regclk=0;
wire[3:
0]sum;
wirecout;
always#10clk=~clk;
initial
begin
ina=0;
repeat(20)
#20ina=$random;//随机数ina产生
end
initial
begin
inb=0;
repeat(10)
#40inb=$random;//随机数inb产生
end
initial
begin
cin=0;
repeat
(2)
#200
cin={$random}%16;//随机数inc产生
#200$stop;
end
adder4adder4_te(
.clk(clk),
.sum(sum),
.cout(cout),
.ina(ina),
.inb(inb),
.cin(cin)
);
initial
endmodule
2-73
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSEG_7IS
PORT(SEG:
INSTD_LOGIC_VECTOR(3DOWNTO0);//--四位二进制码输入
Q3:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));//--输出LED七段码
ENDSEG_7;
ARCHITECTUREARTOFSEG_7IS
BEGIN
PROCESS(SEG)
BEGIN
CASESEGIS
WHEN"0000"=>Q3<="0000001";--0
WHEN"0001"=>Q3<="1001111";--1
WHEN"0010"=>Q3<="0010010";--2
WHEN"0011"=>Q3<="0000110";--3
WHEN"0100"=>Q3<="1001100";--4
WHEN"0101"=>Q3<="0100100";--5
WHEN"0110"=>Q3<="0100000";--6
WHEN"0111"=>Q3<="0001111";--7
WHEN"1000"=>Q3<="0000000";--8
WHEN"1001"=>Q3<="0000100";--9
WHENOTHERS=>Q3<="1111111";
ENDCASE;
ENDPROCESS;
ENDART;
3-1
`timescale1ns/1ns
moduleDecoder2x4(A,B,EN,Z);
inputA,B,EN;
output[0:
3]Z;
wireAbar,Bbar;
assign#1Abar=~A;//语句1
assign#1Bbar=~B;//语句2
assign#2Z[0]=~(Abar&Bbar&EN);//语句3
assign#2Z[1]=~(Abar&B&EN);//语句4
assign#2Z[2]=~(A&Bbar&EN);//语句5
assign#2Z[3]=~(A&B&EN);//语句6
endmodule
3-3
moduleFASeq(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
regSum,Cout;
regT1,T2,T3;
always@(AorBorCin)
begin
Sum=(A^B)^Cin;
T1=A&Cin;
T2=B&Cin;
T3=A&B;
Cout=(T1|T2)|T3;
end
endmodule
3-4
`timescale1ns/1ns
moduleTest(Pop,Pid);
outputPop,Pid;
regPop,Pid;
initial
begin
Pop=0;//语句1
Pid=0;//语句2
Pop=#51;//语句3
Pid=#31;//语句4
Pop=#60;//语句5
Pid=#20;//语句6
end
endmodule
3-5
ModuleFourBitFA(FA,FB,FCin,FSum,FCout);
parameterSIZE=4;
input[SIZE:
1]FA,FB;
output[SIZE:
1]FSum
inputFCin;
inputFCout;
wire[1:
SIZE-1]FTemp;
FAStr
FA1(.A(FA[1]),.B(FB[1]),.Cin(FCin),.Sum(FSum[1]),.Cout(FTemp[1])),
FA2(.A(FA[2]),.B(FB[2]),.Cin(FTemp[1]),.Sum(FSum[2]),.Cout(FTemp[2])),
FA3(.A(FA[3]),.B(FB[3]),.Cin(FTemp[2]),.Sum(FSum[3]),.Cout(FTemp[3])),
FA4(.A(FA[4]),.B(FB[4]),.Cin(FTemp[3]),.Sum(FSum[4]),.Cout(FCout));
endmodule
3.1
begin
Art=0;
Art=1;
end
3.2
initial
begin
Cbn<=0;
Cbn<=1;
end
3.3
reg[0:
2]QState;
initial
begin
QState=3’b011;
QState<=3’b100;
$display(“CurrentvalueofQ_Stateis”%b,QState);
#5;//等待一定的时延。
$display(“ThedelayedvalueofQ_Stateis”%,bQState);
end
例3.4
begin
areg=breg;
creg=areg;//creg的值为breg的值。
end
例3.5
fork
#50r='h35;
#100r='hE2;
#150r='h00;
#200r='hF7;
#250->end_wave;//触发事件
end_wave
Join
例3.6
case(select[1:
2])
result=0;
2'b01:
result=flaga;
2'b0x:
result=flagb;
2'b0z:
result=flaga?
'bx:
0;
2'b10:
result=flagb;
2'bx0,result=flagb;
2'bz0:
result=flagb?
'bx:
0;
default:
result='bx;
endcase
例3.7
case(sig):
1'bz:
$display("signalisfloating");
1'bx:
$display("signalisunknown");
default:
$display("signalis%b",sig);
endcase
例3.8
reg[7:
0]ir;
casez(ir)
8'b1?
?
?
?
?
?
?
:
instruction1(ir);
8'b01?
?
?
?
?
?
:
instruction2(ir);
8'b00010?
?
?
:
instruction3(ir);
8'b000001?
?
:
instruction4(ir);
endcase
例3.9
reg[7:
0]r,mask;
mask=8'bx0x0x0x0;
casex(r^mask)
8'b001100xx:
stat1;
8'b1100xx00:
stat2;
8'b00xx0011:
stat3;
8'bxx001100:
stat4;;
endcase
例3.10
begin:
init_mem
reg[7:
0]tempi;
for(tempi=0;tempi memory[tempi]=0; end 例3.11 parametersize=8,longsize=16; reg[size: 1]opa,opb; reg[longsize: 1]result; begin: mult integerbindex; result=0; for(bindex=1;bindex<=size;bindex=bindex+1) if(opb[bindex]) result=result+(opa<<(bindex-1)); end 例3.12 initial begin areg=0;//初始化寄存器areg for(index=0;index memory[index]=0;//初始化一个memory end 例3.13 alwaysareg=~areg; 例3.14 always#half_periodareg=~areg; 4-2 (1)代码一: moduleand_2(y,a,b); outputy; inputa,b; and(y,a,b); endmodule (2)代码二: moduleand_2(y,a,b); outputy; inputa,b; regy; always@(a,b) begin case({a,b}) 2'b00: y=0; 2'b01: y=0; 2'b10: y=0; 2'b11: y=1; default: y='bx; endcase end endmodule 4-6 (1)代码一: moduleor_2(y,a,b); outputy; inputa,b; or(y,a,b); endmodule (2)代码二: moduleor_2(y,a,b); outputy; inputa,b; regy; always@(a,b) begin case({a,b}) 2'b00: y<=0; 2'b01: y<=1; 2'b10: y<=1; 2'b11: y<=1; default: y<='bx; endcase end endmodule 4-10 (1)代码一: modulenotput(y,a); outputy; inputa; not(y,a); endmodule (2)代码二: modulenotput(y,a); outputy; inputa; regy; always@(a) begin case({a}) 1'b0: y=1; 1'b1: y=0; default: y='bx; endcase end endmodule 4-14 (1)代码一: modulenand_2(y,a,b); outputy; inputa,b; nand(y,a,b); endmodule (2)代码二: modulenand_2(y,a,b); outputy; inputa,b; regy; always@(a,b) begin case({a,b}) 2'b00: y=1; 2'b01: y=1; 2'b10: y=1; 2'b11: y=0; default: y='bx; endcase end endmodule 4-18 (1)代码一: modulenor_2(y,a,b); outputy; inputa,b; nor(y,a,b); endmodule (2)代码二: modulenor_2(y,a,b); outputy; inputa,b; regy; always@(a,b) begin case({a,b}) 2'b00: y<=1; 2'b01: y<=0; 2'b10: y<=0; 2'b11: y<=0; default: y<='bx; endcase end endmodule 4-22 modulenora(y,a,b,c,d); outputy; inputa,b,c,d; assigny=~(a&b|c&d); endmodule 4-26 (1)代码一: modulexor_2(y,a,b); outputy; inputa,b; xor(y,a,b); endmodule (2)代码二: modulexor_2(y,a,b); outputy; inputa,b; regy; always@(a,b) begin case({a,b}) 2'b00: y<=0; 2'b01: y<=1; 2'b10: y<=1; 2'b11: y<=0; default: y<='bx; endcase end endmodule 4-30 (1)代码一: modulexnor_2(y,a,b); outputy; inputa,b; xnor(y,a,b); endmodule (2)代码二: modulexnor_2(y,a,b); outputy; inputa,b; regy; always@(a,b) begin case({a,b}) 2'b00: y<=1; 2'b01: y<=0; 2'b10: y<=0; 2'b11: y<=1; default: y<='bx; endcase end endmodule 4-33 (1)代码一: moduletri_gate(dout,din,en); outputdout;//信号输入端 inputdin,en;//信号输入端,使能端 assigndout=en? din: 'dz; endmodule (2)代码二: moduletri_gate(dout,din,en); outputdout; inputdin,en; regdout; always if(en)dout<=din; elsedout<='bz; endmodule 4-36 moduletri_buffer(dout,din,en); output[7: 0]dout;//数据输入端 input[7: 0]din;//数据输出端 inputen; reg[7: 0]dout; always if(en)dout<=din; elsedout<=8b'z; endmodule 4-39 moduletri_bibuffer(en,dr,a,b); inout[7: 0]a,b;//双向数据端口 inputen,dr;//使能端,数据方向控制端 wire[7: 0]a,b;//inout类型双向端口必须定义为wire类型的变量 reg[7: 0]a_reg,b_reg;//在always、initial语句中的赋值语句被赋值变量必须是寄存器变量,在此定义a_reg,b_reg为双向端口a,b的缓存器 always@(*) begin if(dr) begin if(en)beginb_reg=a;end elsebeginb_reg='bz;end end else begin if(en)begina_reg=b;end elsebegina_reg='bz;end end end assigna=a_reg; assignb=b_reg; endmodule 测试程序如下。 `timescale1ns/1ns moduletri_bibuffer_testbench; wire[7: 0]a,b; regen; regdr; tri_bibuffertri_bibuffer(en,dr,a,b); initial begin #10dr=1;en=1; forcea='b11110000;//强制a作为输入端口 #30en=0; #30releasea;//释放输入端口a #10dr=0;en=1; forceb='b00001111;//强制b作为输入端口 #30en=0; #30releaseb;//释放输入端口b end endmodule 5-1 moduleencoded8_3(x,y); input[7: 0]x;//信号输入端 output[2: 0]y;//信号输出端 reg[2: 0]y; always@(x) begin case(x[7: 0]) 8'b00000001: y[2: 0]=3'b000; 8'b00000010: y[2: 0]=3'b001; 8'b00000100: y[2: 0]=3'b010; 8'b00001000: y[2: 0]=3'b011; 8'b00010000: y[2: 0]=3'b100; 8'b00100000: y[2: 0]=3'b101; 8'b01000000: y[2: 0]=3'b110; 8'b10000000: y[2: 0]=3'b111; endcase end endmodule 5-6 moduleyouxianencoder(y,eo,gs,i,ei); input[7: 0]i;//信号输入端 inputei;//输入使能端 output[2: 0]y; outputeo,gs; reg[2: 0]y; regeo,gs; always@(i,ei) begin if(ei==1) begin y[2: 0]<=3'b111; gs<=1; eo<=1; end else begin if(i[7]==0) begin y[2: 0]<=3'b000; gs<=0; eo<=1; end elseif(i[6]==0) begin y[2: 0]<=3'b001; gs<=0; eo<=1; end elseif(i[5]==0) begin y[2: 0]<=3'b010; gs<=0; eo<=1; end elseif(i[4]==0) begin y[2: 0]<=3'b011; gs<=0; eo<=1; end elseif(i[3]==0) begin y[2: 0]<=3'b100; gs<=0; eo<=1; end elseif(i[2]==0) begin y[2: 0]<=3'b101; gs<=0; eo<=1; end elseif(i[1]==0) begin y[2: 0]<=3'b110; gs<=0; eo<=1; end elseif(i[0]==0) begin y[2: 0]<=3'b111; gs<=0; eo<=1; end elseif(i[7: 0]=='b11111111) begin y[2: 0]<=3'b111; gs<=1; eo<=0; end end end endmodule 5-11 moduledecoder3_8(y,i,g1,g2,g3); output[7: 0]y; input[2: 0]i; inputg1,g2,g3; reg[7: 0]y; always@(iorg1org2org3) begin if(g1==0)y=8'b11111111; elseif(g2==1)y=8'b11111111; elseif(g3==1)y=8'b11111111; else begin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于QuartusII的FPGACPLD数字系统设计与应用 基于 QuartusII FPGACPLD 数字 系统 设计 应用 范例 源程序