《基于Quartus II的FPGACPLD数字系统设计与应用》范例的源程序_第1页
《基于Quartus II的FPGACPLD数字系统设计与应用》范例的源程序_第2页
《基于Quartus II的FPGACPLD数字系统设计与应用》范例的源程序_第3页
《基于Quartus II的FPGACPLD数字系统设计与应用》范例的源程序_第4页
《基于Quartus II的FPGACPLD数字系统设计与应用》范例的源程序_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.2-28module adder_4(cout,sum,ina,inb,cin,clk);output3:0 sum;output cout;input3:0 i na,inb; /tempa,tempb中间变量声明input cin,clk;reg3:0 tempa,tempb,sum; reg cout;reg tempc; /tempc中间变量声明always (posedge clk) /always clk上升沿触发begin /阻塞语句tempa=ina;tempb=inb;tempc=cin;endalways (posedge clk) /always clk上升沿触发beg

2、incout,sum=tempa+tempb+tempc;endendmodule2-40 timescale 1ns/10ps module adder4_testbench; reg 3:0 ina,inb;reg cin; reg clk=0;wire 3:0 sum;wire cout;always #10 clk=clk;initial begin ina=0; repeat(20) #20 ina =$random; /随机数ina产生 endinitial begin inb=0; repeat(10) #40 inb =$random; /随机数inb产生 endinitial

3、 begin cin=0; repeat(2) #200 cin =$random%16;/ 随机数inc产生#200 $stop; endadder4 adder4_te( .clk (clk ), .sum ( sum ), .cout ( cout), .ina ( ina ), .inb ( inb ), .cin ( cin ) ); initial endmodule2-73library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity seg_7 isport (seg: in std

4、_logic_vector(3 downto 0 ); /-四位二进制码输入 q3: out std_logic_vector(6 downto 0) );/-输出led七段码end seg_7;architecture art of seg_7 isbeginprocess(seg) begincase seg iswhen 0000 = q3 q3 q3 q3 q3 q3 q3 q3 q3 q3 q3=1111111;end case;end process; end art;3-1timescale 1ns/1nsmodule decoder2x4(a,b,en,z) ;input a,

5、b,en;output 0:3 z;wire abar, bbar;assign #1 abar=a; / 语句1assign #1 bbar=b; / 语句2assign #2 z0=(abar &bbar&en ) ; / 语句3assign #2 z1=(abar & b&en) ; / 语句4assign #2 z2=(a&bbar&en) ; / 语句5assign #2 z3=(a&b&en) ; / 语句6endmodule3-3module faseq(a, b, cin, sum, cout) ;input a, b, cin ;output sum, cout;reg su

6、m, cout;reg t1, t2, t3;always(a or b or cin) begin sum=(ab)cin;t1=a&cin;t2=b&cin;t3=a&b;cout = (t1|t2)|t3;endendmodule3-4timescale 1ns/1nsmodule test(pop,pid);output pop,pid;reg pop,pid;initialbeginpop = 0; / 语句1pid = 0; / 语句2pop = #5 1; / 语句3pid = #3 1; / 语句4pop = #6 0; / 语句5pid = #2 0; / 语句6endend

7、module3-5module fourbitfa (fa,fb,fcin,fsum,fcout);parameter size = 4;input size:1 fa, fb;output size:1 fs uminput fcin;input fcout;wire 1: size-1 ftemp;fastrfa1( .a(fa1), .b(fb1), .cin(fcin) , .sum(fsum1), .cout(ftemp1 ) ),fa2( .a(fa2), .b(fb2), .cin(ftemp1),.sum(fsum2),.cout(ftemp2) ,fa3( .a(fa3),

8、.b(fb3), .cin(ftemp2) , .sum(fsum3), .cout(ftemp3 ) ),fa4( .a(fa4), .b(fb4), .cin(ftemp3),.sum(fsum4),.cout(fcout) ;endmodule3.1 beginart = 0; art = 1;end3.2initialbegincbn = 0;cbn=1;end3.3reg 0:2 q state;initialbeginq state = 3b011;q state end_wave; /触发事件end_wave join例3.6 case ( select1:2 )result =

9、 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(signal is floating);1 bx: $display(signal is unknown); default:$display(signal is %b,

10、sig); endcase例3.8reg7:0 ir; casez(ir) 8 b1?: instruction1(ir); 8 b01?: instruction2(ir);8 b00010?: instruction3(ir);8 b000001?: instruction4(ir); endcase 例3.9reg7:0 r, mask; mask = 8bx0x0x0x0;casex(rmask)8 b001100xx: stat1; 8 b1100xx00: stat2; 8 b00xx0011: stat3; 8 bxx001100: stat4; ;endcase 例3.10be

11、gin: init_memreg7:0 tempi;for(tempi=0;tempimemsize;tempi=tempi+1)memorytempi=0;end例3.11parameter size = 8, longsize = 16;regsize:1 opa, opb;reglongsize:1 result;begin:multinteger bindex;result=0;for( bindex=1; bindex=size; bindex=bindex+1 )if(opbbindex)result = result + (opa(bindex-1);end例3.12 initi

12、al begin areg=0; /初始化寄存器areg for(index=0;indexsize;index=index+1) memoryindex=0; /初始化一个memory end例3.13always areg = areg;例3.14always # half_period areg = areg;4-2(1)代码一:module and_2(y,a,b);output y;input a,b;and(y,a,b);endmodule(2)代码二:module and_2(y,a,b);output y;input a,b;reg y;always(a,b) begin ca

13、se(a,b) 2b00:y=0; 2b01:y=0; 2b10:y=0; 2b11:y=1; default:y=bx; endcase endendmodule4-6(1) 代码一:module or_2(y,a,b);output y;input a,b;or(y,a,b);endmodule(2) 代码二:module or_2(y,a,b);output y;input a,b;reg y;always(a,b) begin case(a,b) 2b00:y=0; 2b01:y=1; 2b10:y=1; 2b11:y=1; default:y=bx; endcase endendmo

14、dule4-10(1) 代码一:module notput(y,a);output y;input a;not(y,a);endmodule(2) 代码二:module notput(y,a);output y;input a;reg y;always(a) begin case(a) 1b0:y=1; 1b1:y=0; default:y=bx; endcase endendmodule4-14(1)代码一:module nand_2(y,a,b);output y;input a,b;nand(y,a,b);endmodule(2)代码二:module nand_2(y,a,b);outp

15、ut y;input a,b;reg y;always(a,b) begin case(a,b) 2b00:y=1; 2b01:y=1; 2b10:y=1; 2b11:y=0; default:y=bx; endcase endendmodule4-18(1) 代码一:module nor_2(y,a,b);output y;input a,b;nor(y,a,b);endmodule(2) 代码二:module nor_2(y,a,b);output y;input a,b;reg y;always(a,b) begin case(a,b) 2b00:y=1; 2b01:y=0; 2b10:

16、y=0; 2b11:y=0; default:y=bx; endcase endendmodule4-22module nora(y,a,b,c,d);output y;input a,b,c,d;assign y=(a&b|c&d);endmodule4-26(1) 代码一:module xor_2(y,a,b);output y;input a,b;xor(y,a,b);endmodule(2) 代码二:module xor_2(y,a,b);output y;input a,b;reg y;always(a,b) begin case(a,b) 2b00:y=0; 2b01:y=1; 2

17、b10:y=1; 2b11:y=0; default:y=bx; endcase endendmodule4-30(1) 代码一:module xnor_2(y,a,b);output y;input a,b;xnor(y,a,b);endmodule(2) 代码二:module xnor_2(y,a,b);output y;input a,b;reg y;always(a,b) begin case(a,b) 2b00:y=1; 2b01:y=0; 2b10:y=0; 2b11:y=1; default:y=bx; endcase endendmodule4-33(1)代码一:module

18、tri_gate(dout,din,en);output dout; /信号输入端input din,en; /信号输入端,使能端assign dout=en?din:dz;endmodule(2)代码二:module tri_gate(dout,din,en);output dout;input din,en;reg dout;always if(en) dout=din; else dout=bz;endmodule4-36module tri_buffer(dout,din,en);output7:0 dout; /数据输入端input7:0 din; /数据输出端input en; r

19、eg7:0 dout;always if(en) dout=din; else dout=8b z;endmodule4-39module tri_bibuffer(en,dr,a,b);inout7:0 a,b; /双向数据端口input en,dr; /使能端,数据方向控制端wire 7:0 a,b; /inout类型双向端口必须定义为wire类型的变量reg7:0 a_reg,b_reg;/在always、initial语句中的赋值语句被赋值变量必须是寄存器变量,在此定义a_reg,b_reg为双向端口a,b的缓存器always(*)begin if(dr) begin if(en) b

20、egin b_reg=a; end else begin b_reg=bz; end end else begin if(en) begin a_reg=b; end else begin a_reg=bz; end endendassign a=a_reg;assign b=b_reg;endmodule测试程序如下。timescale 1ns/1nsmodule tri_bibuffer_testbench;wire 7:0 a,b;reg en;reg dr;tri_bibuffer tri_bibuffer(en,dr,a,b);initial begin #10 dr=1;en=1;

21、 force a=b11110000;/ 强制a作为输入端口 #30 en=0; #30 release a; / 释放输入端口a #10 dr=0;en=1; force b=b00001111;/ 强制b作为输入端口 #30 en=0; #30 release b; / 释放输入端口b end endmodule5-1module encoded8_3(x,y);input7:0 x; / 信号输入端output2:0 y; / 信号输出端reg 2:0 y;always (x)begincase (x7:0)8b00000001:y2:0=3b000;8b00000010:y2:0=3b

22、001;8b00000100:y2:0=3b010;8b00001000:y2:0=3b011;8b00010000:y2:0=3b100;8b00100000:y2:0=3b101;8b01000000:y2:0=3b110;8b10000000:y2:0=3b111;endcaseendendmodule5-6module youxianencoder(y,eo,gs,i,ei);input7:0 i; /信号输入端input ei; /输入使能端output 2:0 y;output eo, gs;reg2:0 y;reg eo, gs;always(i,ei)begin if(ei=1

23、) begin y2:0=3b111; gs=1; eo=1;end else begin if(i7=0)beginy2:0=3b000; gs=0; eo=1;endelse if(i6=0)beginy2:0=3b001; gs=0; eo=1;endelse if(i5=0)beginy2:0=3b010; gs=0; eo=1;endelse if(i4=0)beginy2:0=3b011; gs=0; eo=1;endelse if(i3=0)beginy2:0=3b100; gs=0; eo=1;endelse if(i2=0)beginy2:0=3b101; gs=0; eo=

24、1;endelse if(i1=0)beginy2:0=3b110; gs=0; eo=1;endelse if(i0=0)beginy2:0=3b111; gs=0; eo=1;endelse if(i7:0=b11111111)beginy2:0=3b111; gs=1; eo=0;endendendendmodule5-11module decoder3_8(y,i,g1,g2,g3);output7:0 y;input2:0 i;input g1, g2, g3;reg7:0 y;always(i or g1 or g2 or g3)begin if(g1=0) y=8b1111111

25、1; else if(g2=1) y=8b11111111; else if(g3=1) y=8b11111111;else begin y=8b00000001b)beginy1=1;y2=0;y3=0;endelse if(a=b)beginy1=0;y2=1;y3=0;endelse if(ab)beginy1=0;y2=0;y3=1;endendendmodule5-32代码一:采用行为描述的1位半加器。module adder(sum,cout,a,b);output sum, cout;input a,b;reg sum, cout;always(a or b)beginsum=a

26、b;cout=a&b;endendmodule代码二:采用行为描述的1位半加器。module adder(sum, cout,a,b);output sum,cout;input a,b;reg sum,cout;always(a or b)begincout,sum=a+b;endendmodule代码三:采用门元件实现的1位半加器。module adder(sum, cout,a,b);output sum,cout;input a,b;and(cout,a,b);xor(sum,a,b);endmodule代码四:数据流方式描述的1位半加器。module adder(sum, cout,

27、a,b);output sum, cout;input a,b;assign sum=ab;assign cout=a&b;endmodule 代码五:采用行为描述的1位半加器。module adder(sum,cout,a,b);output sum,cout;input a,b;reg sum,cout;always(a or b)begincase(a,b)/真值表描述2b00:begin sum=0;cout=0;end2b01:begin sum=1;cout=0;end2b10:begin sum=1;cout=0;end2b11:begin sum=0;cout=1;endend

28、caseendendmodule5-35代码一:行为描述的1位全加器。module full_adder(sum,cout,a,b,dcout);output sum,cout;/和数、进位input a,b,dcout;/被加数、加数、低位进位reg sum,cout;always (a,b,dcout)begincout,sum=a+b+dcout;endendmodule代码二:行为描述的1位全加器。module full_adder(sum,cout,a,b,dcout);output sum,cout;/和数、进位input a,b,dcout;/被加数、加数、低位进位reg sum

29、,cout;always (a,b,dcout)beginsum=(ab)dcout;cout=(a&b)|(a&dcout)|(b&dcout);endendmodule代码三:调用门元件实现的1位全加器。module full_adder(sum,cout,a,b,dcout);output sum,cout;/和数、进位input a,b,dcout;/被加数、加数、低位进位wire s1,m1,m2,m3;and(m1,a,b), (m2,b,dcout), (m3,a,dcout);xor(s1,a,b),(s, s1,dcout);or(cout,m1,m2,m3);endmodu

30、le代码四:数据流描述的1位全加器。module full_adder(sum,cout,a,b,dcout);output sum,cout;/和数、进位input a,b,dcout;/被加数、加数、低位进位assign sum=abdcout;assign cout=(a&b)|(b&dcout)|(dcout&a);endmodule代码五:数据流描述的1位全加器。module full_adder(sum,cout,a,b,dcout);output sum,cout;/和数、进位input a,b,dcout;/被加数、加数、低位进位assign cout,sum=a+b+dcou

31、t;endmodule代码六:混合描述的1为全加器。module full_adder(sum,cout,a,b,dcout);output sum,cout;/和数、进位input a,b,dcout;/被加数、加数、低位进位reg cout,m1,m2,m3;wire s1;xor x1(s1,a,b);/调用门元件always (a or b or dcout)beginm1=a&b;m2=dcout&b;m3=a&dcout;cout=(m1|m2)|m3;endassign sum=s1dcout;endmodule5-38module full_adder4(sum,cout,a,

32、b,dcout);output3:0 sum;/和数output cout;/进位标志input 3:0 a,b;/加数和被加数input dcout;/低位进位reg cout;reg3:0 sum;always (*)begincout,sum=a+b+dcout;endendmodule5-41module full_adder16(cout,sum,a,b,cin);output cout;parameter my_size=16;outputmy_size-1:0 sum;inputmy_size-1:0 a, b;input cin;adder my_adder(cout,sum,

33、a,b,cin);/调用adder模块endmodule/下面为adder模块的代码module adder(cout,sum,a,b,cin);parameter size=16;output cout;outputsize-1:0 sum;inputsize-1:0 a, b;input cin;assigncout,sum=a+b+cin;endmodule5-44代码一: module half_sub(dout,cout,a,b);output dout,cout;/差位、借位input a,b;/被减数、减数reg dout,cout;always (*)begindout=ab;

34、cout=(a)&b;endendmodule代码二: module half_sub(dout,cout,a,b);output dout,cout;/差位、借位input a,b;/被减数、减数reg dout,cout;always (*)begincout,dout=a-b;endendmodule5-47module sub(dout,cout,a,b,ci);output dout,cout;/差位、借位input a,b,ci;/被减数、减数、低位借位reg dout,cout;always (*)begincout,dout=a-b-ci;endendmodule5-50mod

35、ule sub4(dout,cout,a,b,ci);output 3:0 dout;/差值output cout;/借位input3:0 a,b;/被减数、减数input ci;reg 3:0 dout;reg cout;always (*)begincout,dout=a-b-ci;endendmodule5-53方法一:用for语句实现2个8位数相乘。 module mult_for(outcome,a,b);parameter size=8;input size:1 a,b;/两个操作数output 2*size:1 outcome;/结果reg 2*size:1 outcome;in

36、teger i;always(a or b)beginoutcome=0;for(i=1;i=size;i=i+1)/for语句if(bi) outcome=outcome+(a(i-1);endendmodule方法二:用repeat实现8位二进制数的乘法。 module mult_for(outcome,a,b);parameter size=8;input size:1 a,b;/两个操作数output 2*size:1 outcome;/结果reg 2*size:1 temp_a, outcome;regsize:1 temp_b;always(a or b)beginoutcome=

37、0;temp_a=a;temp_b=b;repeat(size)/repeat语句,size为循环次数beginif(temp_b1)/如果temp_b的最低位为1,就执行下面的加法 outcome=outcome+ temp_a; temp_a= temp_a1;/ 操作数b右移一位endendendmodule5-56module voter7(pass,vote);output pass;input6:0 vote;reg2:0 sum;integer i;reg pass;always(vote)beginsum=0;for (i=0;i=6;i=i+1)if(votei)sum=sum+1;if(sum2) pass=1;/若超过三人赞成,则pass输出为1else pass=0;endendmodule6-2 module rs(q,qn,s,r); output q,qn; input s,r; reg q,qn; reg q1,qn1; always (*) begin q1=(s&qn1); qn1=(r&q1); q=q1; qn=qn1; end endmodule6-5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论