最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

2018-2019五邑大学EDA实验代码源码和考试总结

IT圈 admin 30浏览 0评论

2024年5月18日发(作者:歧蕴藉)

一、 实验设计

第一次实验

1、用门电路设计3-8译码器,译码器的真值表如下。

输入 输出

en c b a y0 y1 y2 y3 y4 y5 y6 y7

-------- -----------------------

0 x x x 1 1 1 1 1 1 1 1

1 0 0 0 0 1 1 1 1 1 1 1

1 0 0 1 1 0 1 1 1 1 1 1

1 0 1 0 1 1 0 1 1 1 1 1

1 0 1 1 1 1 1 0 1 1 1 1

1 1 0 0 1 1 1 1 0 1 1 1

1 1 0 1 1 1 1 1 1 0 1 1

1 1 1 0 1 1 1 1 1 1 0 1

1 1 1 1 1 1 1 1 1 1 1 0

第二次实验

1、用宏单元(宏单元可以是D触发器,74160,7447,门电路等)设计一模14计数器。要求:

1)带清零端;

2)用两个数码管显示计数结果。

3)计数器输入时钟可以用轻触键。

1

附录:模14计数器的真值表

输入 输出

clk clr q4_q3q2q1q0

------- -----------

x 0 0_0000

u 1 0_0001

u 1 0_0010

u 1 0_0011

u 1 0_0100

u 1 0_0101

u 1 0_0110

u 1 0_0111

u 1 0_1000

u 1 0_1001

u 1 1_0000

u 1 1_0001

u 1 1_0010

u 1 1_0011

u 1 0_0000

图2-1 模14计数器

2

2、用LUT实现3输入异或门,要求画出完整的电路图(参照教材图2.29)。

输入异或门的真值表如下:

输入 输出

c,b,a f

----- -----

000 0

001 1

010 1

011 0

100 1

101 0

110 0

111 1

图2-2 3输入异或门

3

第三次实验——基于VerilogHDL的流水灯设计

1、 用VerilogHDL设计一模11二进制加法计数器,并仿真;

表1 模11二进制计数器真值表

输入信号 输出信号

clk clr_n q[3:0]

------------ ------------

x 0 0000;

u 1 0001;

u 1 0010;

u 1 0011;

u 1 0100;

u 1 0101;

u 1 0110;

u 1 0111;

u 1 1000;

u 1 1001;

u 1 1010;

u 1 0000;

------------------------------

注:u表示时钟上沿

module m11_counter(clk,clr_n,q); //定义模块名为m11_counter

input clk,clr_n; //定义1位的输入clk和clr_n

output reg[3:0] q; //定义4位的输出q

always@(posedge clk,negedge clr_n) //当clk上升沿或clr_n下降沿到来时触发

begin

if(!clr_n) q=0; //clr_n为0时q为0000

else

begin

if(q==10) q=0; //判断q是否为1010,是则归0,否则自加1

else q=q+1;

end

end

endmodule

2、 用VerilogHDL设计4-11译码器,并仿真;

表2 4-11译码器

输入信号 输出信号

en code[3:0] y[10:0]

------------- ------------------

0 x 111_1111_1111

4

1 0000 000_0000_0001

1 0001 000_0000_0010

1 0010 000_0000_0100

1 0011 000_0000_1000

1 0100 000_0001_0000

1 0101 000_0010_0000

1 0110 000_0100_0000

1 0111 000_1000_0000

1 1000 001_0000_0000

1 1001 010_0000_0000

1 1010 100_0000_0000

---------------------------------------

module 4_11_decoder(en,code,y); //定义模块名为4_11_decoder

input en; //定义1位的输入en

input[3:0] code; //定义4位的输入code

output reg[10:0] y; //定义reg类型的11位输出y

always@(en,code) //当en或code有变化时触发

begin

if(!en) y=11'b111_1111_1111; //若en为0时,输出y的十一位全为1

else //当en为1时,根据真值表调整与输入

begin //code对应的输出y

case(code)

4'b0000:y=11'b000_0000_0001;

4'b0001:y=11'b000_0000_0010;

4'b0010:y=11'b000_0000_0100;

4'b0011:y=11'b000_0000_1000;

4'b0100:y=11'b000_0001_0000;

4'b0101:y=11'b000_0010_0000;

4'b0110:y=11'b000_0100_0000;

4'b0111:y=11'b000_1000_0000;

4'b1000:y=11'b001_0000_0000;

4'b1001:y=11'b010_0000_0000;

4'b1010:y=11'b100_0000_0000;

default:y=11'b111_1111_1111;

endcase

end

end

endmodule

3 [选做,可在实验时完成]用前面设计的计数器和译码器设计流水控制电路,控制11个LED灯的流动:计数器

的clk输入接轻触开关,用于控制LED灯的移动;

5

选做内容:

1 计数器增加加减法计数输入控制端;

2 用lpm_counter设计从50MHz到10Hz的分频电路,为计数器提供时钟;

3 其它;

表3 模11加减法二进制计数器真值表

输入信号 输出信号

clk clr_n up_dn q[3:0]

------------------- ------------

x 0 x 0000;

u 1 1 q=q+1;

u 1 0 q=q-1;

------------------------------

注:u表示时钟上沿

//模11加减法二进制计数器

module add_and_subtract_counter(clk,clr_n,up_dn,q);

input clk,clr_n,up_dn; //定义一位的输入clk,clr_n,up_dn

output reg[3:0] q; //定义reg类型的三位的输出q

always@(posedge clk,negedge clr_n) //当clk上升沿或clr_n下降沿到来时触发

begin

if(!clr_n) q=0; //当clr_n为0时,q的值为0

else //否则up_dn控制加或减

begin

if(!up_dn) q=q-1; //up_dn为0时,q自减1

else q=q+1; //up_dn为1时,q自加1

end

end

endmodule

3、(2)从50MHz到10Hz的分频电路

//从50MHz到10Hz的分频电路

//定义分频器模块counter_down

module counter_down(clk_out,clk_in,reset);

input clk_in,reset; //定义两个一位的输入clk_in(输入时钟),reset

output reg clk_out; //定义一个reg型的一位的输出clk_out(输出时钟)

integer cnt; //定义一个int型的cnt变量

always@(posedge clk_in,posedge reset) //当clk_in或reset上升沿时触发

begin

if(reset) //当reset为1时清零

begin

cnt<=0;

clk_out<=0;

6

end

else

begin //reset为0时开始分频

if(cnt==2_499_999)//分频从50MHz到10Hz

begin

clk_out<=!clk_out;

cnt<=0;

end

else cnt<=cnt+1;

end

end

endmodule

第四次实验——基本电路设计+学号显示准备

基于VerilogHDL的基本电路设计

1、[基本]用VerilogHDL设计一个19人表决电路,输入为1时表示同意,输入为0时表示不同意。同意者超过

半数则表决通过(表决器输出1),不通过表决器输出0.

2、[选做]用VerilogHDL设计一功能与74161完全一样的电路,其真值表如下:

-------------------------------------------------------------------

输入 输出

CRn LDn ENT ENP CP D C B A q3 q2 q1 q0 RCO

---------------------------- ----------------

0 x x x x xxxx

1 0 x x u dcba

0000

dcba

0

*

*

*

0

0

0

0

0

0

0

0

0

1

1 1 0 x u xxxx q3q2q1q0

1 1 x 0 u xxxx q3q2q1q0

1 1 1 1 u xxxx 0000

1 1 1 1 u xxxx 0001

1 1 1 1 u xxxx 0010

1 1 1 1 u xxxx 0011

1 1 1 1 u xxxx 0100

1 1 1 1 u xxxx 0101

1 1 1 1 u xxxx 0110

1 1 1 1 u xxxx 0111

1 1 1 1 u xxxx 1000

1 1 1 1 u xxxx 1001

* RCO=q3&q2&q1&q0&ENT

//19人表决器

---------------------------------------------------------------------

module voter19(pass,vote);

input[18:0] vote;

output reg pass;

7

reg[5:0] sum;

integer i;

always @(vote)

begin

sum=0;

for(i=0;i<=18;i=i+1)

if(vote[i]) sum=sum+1;

if(sum[3]&sum[1]) pass=1;

else if(sum[3]&sum[2]) pass=1;

else if(sum[4]) pass=1;

else pass=0;

end

endmodule

//74161电路

module 74161(CRn,LDn,ENT,ENP,CP,D,C,B,A,q3,q2,q1,q0,RCO);

input CRn,LDn,ENT,ENP,CP,D,C,B,A;

output reg q3,q2,q1,q0;

output reg RCO;

always @(negedge CRn,posedge CP)

begin

end

endmodule

基于VerilogHDL的设计学号显示电路

1 用VerilogHDL设计学号显示电路,用一个数码管显示。要求写出完整的程序,并仿真。

if(!CRn) {q3,q2,q1,q0}=0;

else if(!LDn) {q3,q2,q1,q0}={D,C,B,A};

else if(ENT&&ENP)

begin

end

else {q3,q2,q1,q0}={q3,q2,q1,q0};

RCO=q3&q0&ENT;

if(9=={q3,q2,q1,q0}) {q3,q2,q1,q0}=0;

else {q3,q2,q1,q0}={q3,q2,q1,q0}+1;

方法一:宏定义

//共阳数码管真值表

`define num0 8'b1100_0000

`define num1 8'b1111_1001

`define num2 8'b1010_0100

`define num3 8'b1011_0000

`define num4 8'b1001_1001

8

`define num5 8'b1001_0010

`define num6 8'b1000_0010

`define num7 8'b1111_1000

`define num8 8'b1000_0000

`define num9 8'b1001_0000

`define numx 8'b1111_1111

module show_student_number(clr,clk,show);

input clr,clk;

output reg[7:0] show;

reg[3:0] i;

always @(negedge clr,posedge clk)

begin

if(!clr) begin show=0; i=0; end

else

begin

if(i==10) i=0;

case(i)

4'd0:show=`num3; //3

4'd1:show=`num1; //1

4'd2:show=`num1; //1

4'd3:show=`num6; //6

4'd4:show=`num0; //0

4'd5:show=`num0; //0

4'd6:show=`num4; //4

4'd7:show=`num6; //6

4'd8:show=`num6; //6

4'd9:show=`num0; //0

default:show=`numx;

endcase

i=i+1;

end

end

endmodule

方法二:状态机

module show_student_number(clr,clk,show);

input clr,clk;

output reg[7:0] show;

reg[3:0] i;

reg[7:0]

9

numx=8'b1111_1111,num0=8'b1100_0000,num1=8'b1111_1001,num2=8'b1010_0100,num3=8'b1011_0000,nu

m4=8'b1001_1001,num5=8'b1001_0010,num6=8'b1000_0010,num7=8'b1111_1000,num8=8'b1000_0000,num9

=8'b1001_0000;

always @(negedge clr,posedge clk)

begin

if(!clr) begin show=0; i=0; end

else

begin

if(i==10) i=0;

case(i)

4'd0:show=num0; //0

4'd1:show=num0; //0

4'd2:show=num0; //0

4'd3:show=num0; //0

4'd4:show=num0; //0

4'd5:show=num0; //0

4'd6:show=num0; //0

4'd7:show=num0; //0

4'd8:show=num0; //6

4'd9:show=num0; //0

default:show=`numx;

endcase

i=i+1;

end

end

endmodule

2 [选做]用VerilogHDL设计分频电路,输入50Mhz,输出2hz。要求写出完整的程序。

//从50MHz到2Hz的分频电路

module 50MHz_to_2Hz(clk_out,clk_in,reset);

input clk_in;

input reset;

output clk_out;

integer cnt;

reg clk_out;

always@(posedge clk_in,posedge reset)

begin

if(reset)

begin

cnt<=0;

clk_out<=0;

end

else

10

begin

if(cnt==12_499_999)

begin

clk_out<=!clk_out;

cnt<=0;

end

else cnt<=cnt+1;

end

end

endmodule

3 [选做]用VerilogHDL设计学号显示电路,要求:

1)用八个数码管显示

2)学号按照时钟的节拍从右而左进入,基准时钟为2hz

3)8位学号进入后停顿5秒,然后从新开始

4)其它功能

4)要求写出完整的程序,并仿真

方法一:宏定义

//共阳数码管真值表

`define nxxxxxxxx

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111

`define nxxxxxxx1

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1001

`define nxxxxxx16

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1001__1000_0010

`define nxxxxx160

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1001__1000_0010__1100_0000

`define nxxxx1600

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1001__1000_0010__1100_0000__1100_0000

`define nxxx16004

64'b1111_1111__1111_1111__1111_1111__1111_1001__1000_0010__1100_0000__1100_0000__1001_1001

`define nxx160046

64'b1111_1111__1111_1111__1111_1001__1000_0010__1100_0000__1100_0000__1001_1001__1000_0010

`define nx1600466

64'b1111_1111__1111_1001__1000_0010__1100_0000__1100_0000__1001_1001__1000_0010__1000_0010

`define n16004660

64'b1111_1001__1000_0010__1100_0000__1100_0000__1001_1001__1000_0010__1000_0010__1100_0000

module 8_Nixie_tube_show(clr,clk,hex);

input clr,clk;

output reg[63:0] hex;

reg[4:0] i;

11

always @(posedge clk,negedge clr)

begin

if(!clr) begin i=0; hex=`nxxxxxxxx; end

else

begin

if(i==19) i=0;

case(i)

0:hex=`nxxxxxxxx;

1:hex=`nxxxxxxx1;

2:hex=`nxxxxxx16;

3:hex=`nxxxxx160;

4:hex=`nxxxx1600;

5:hex=`nxxx16004;

6:hex=`nxx160046;

7:hex=`nx1600466;

8:hex=`n16004660;

9:hex=`n16004660;

10:hex=`n16004660;

11:hex=`n16004660;

12:hex=`n16004660;

13:hex=`n16004660;

14:hex=`n16004660;

15:hex=`n16004660;

16:hex=`n16004660;

17:hex=`n16004660;

18:hex=`n16004660;

endcase

i=i+1;

end

end

endmodule

方法二:状态机

module 8_hex(clr,clk,hex0,hex1,hex2,hex3,hex4,hex5,hex6,hex7);

input clr,clk;

output reg[6:0] hex0,hex1,hex2,hex3,hex4,hex5,hex6,hex7;

reg[4:0] cnt;

reg[6:0] s0=7'b100_0000, s1=7'b111_1001, s2=7'b010_0100, s3=7'b011_0000, s4=7'b001_1001,

s5=7'b001_0010, s6=7'b000_0010, s7=7'b111_1000, s8=7'b000_0000, s9=7'b001_0000, sx=7'b111_1111;

always @(posedge clk,negedge clr)

begin

12

if(!clr)

begin

cnt=0; hex1=sx;

end

else

begin

if(cnt==19) cnt=0;

case(cnt)

4'd0:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=sx; hex0=sx;end

4'd1:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=sx; hex0=s1;end

4'd2:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=s1; hex0=s6;end

4'd3:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=s1; hex1=s6; hex0=s0;end

4'd4:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=s1; hex2=s6; hex1=s0; hex0=s0;end

4'd5:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=s1; hex3=s6; hex2=s0; hex1=s0; hex0=s1;end

4'd6:

begin

hex7=sx; hex6=sx; hex5=s1; hex4=s6; hex3=s0; hex2=s0; hex1=s1; hex0=s8;end

4'd7:

begin

hex7=sx; hex6=s1; hex5=s6; hex4=s0; hex3=s0; hex2=s1; hex1=s8; hex0=s4;end

4'd8:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd9:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd10:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd11:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

13

4'd12:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd13:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd14:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd15:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd16:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd17:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd18:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

default:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=sx; hex0=sx;

end

endcase

cnt=cnt+1;

end

end

endmodule

第五次实验——序列检测实验准备

用VerilogHDL设计0100111序列检测器,当检测到序列0100111时输出为1,否则输出为0.

画出状态转换图,给出VerilogHDL程序并仿真。

module fsm_0100111(clk,clr,x,z);

input clk,clr,x;

output reg z;

reg[2:0] state;

parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101,s6=3'b110,s7=3'b111;

always @(posedge clk,negedge clr)

begin

if(!clr) begin state<=s0; z=0; end

14

else case(state)

s0: begin if(x) begin state<=s0; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s1: begin if(x) begin state<=s2; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s2: begin if(x) begin state<=s0; z=1'b0; end

else begin state<=s3; z=1'b0; end

end

s3: begin if(x) begin state<=s2; z=1'b0; end

else begin state<=s4; z=1'b0; end

end

s4: begin if(x) begin state<=s5; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s5: begin if(x) begin state<=s6; z=1'b0; end

else begin state<=s3; z=1'b0; end

end

s6: begin if(x) begin state<=s7; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s7: begin if(x) begin state<=s0; z=1'b1; end

else begin state<=s1; z=1'b1; end

end

default:begin state<=s0;z=1'b0; end

endcase

end

endmodule

1/

1/

S0/0

0/

S1/0

0/

1/

0/

S2/0

0/

0/

1/

0/

S3/0

1/

0/

0/

S7/1

1/

S6/0

1/

S5/0

1/

S4/0

第六次实验——频率计实验准备

1 用VerilogHDL设计信号发生器,要求

1)把输入50Mhz时钟分频,输出1hz基准频率

2)把输入50Mhz时钟分频,输出学号频率

15

3)写出完整的程序

module fenpinji(clk_50M,signal_out,clk_1Hz);

input clk_50M;

output reg signal_out,clk_1Hz;

reg[29:0] cnt,cnt1;

always@(posedge clk_50M) //改变Hz的范围,自己设定的频率1Hz-999999Hz

begin

end

always@(posedge clk_50M) //50M分频产生1Hz时钟

begin

end

endmodule

2 用VerilogHDL设计频率计,要求

1)能够测量和显示999999范围内的频率

2)给出VerilogHDL程序并仿真

cnt=cnt+1;

if(cnt<=25_000_000) clk_1Hz=0;

else if(cnt==50_000_000) cnt=0;

else clk_1Hz=1;

cnt1=cnt1+1;

if(cnt1==25_000_0) begin signal_out=0;end

else if(cnt1==50_000_0) cnt1=0;

else begin signal_out=1;end

module pinlvji(signal_in,clk_50M,clk_1Hz,reset,out0,out1,out2,out3,out4,out5);

input clk_50M,reset,signal_in; //50MHz时钟输入、复位

input reg clk_1Hz;

output reg signal_out;

reg count_en; //计数允许,count_en=1时计数,下降沿到来时锁存

reg load;

reg[3:0] ge,shi,bai,qian,wan,shiwan;

reg cout1,cout2,cout3,cout4,cout5;

reg[3:0] out0,out1,out2,out3,out4,out5;

wire clr;

/*被测信号signal_in作为个位的输入,signal_in上升沿到来时ge位+1;进位输出是cout1,作为十位的

输入*/

always@(posedge signal_in or posedge reset or posedge clr)

begin if(reset) ge=0;

else if(clr) ge=0;

else begin if(count_en) begin if(ge==9) begin ge=0;cout1=1;end

else begin ge=ge+1;cout1=0;end

end

end

end

16

/*cout1作为十位的输入,cout1上升沿到来时shi位+1;进位输出是cout2,作为百位的输入*/

always@(posedge cout1 or posedge reset or posedge clr)

begin if(reset) shi=0;

else if(clr) shi=0;

else begin if(count_en) begin if(shi==9) begin shi=0;cout2=1;end

else begin shi=shi+1;cout2=0;end

end

end

end

/*cout2作为百位的输入,cout2上升沿到来时bai位+1;进位输出是cout3,作为千位的输入*/

always@(posedge cout2 or posedge reset or posedge clr)

begin if(reset) bai=0;

else if(clr) bai=0;

else begin if(count_en) begin if(bai==9) begin bai=0;cout3=1;end

else begin bai=bai+1;cout3=0;end

end

end

end

/*cout3作为千位的输入,cout3上升沿到来时qian位+1;进位输出是cout4,作为万位的输入*/

always@(posedge cout3 or posedge reset or posedge clr)

begin if(reset) qian=0;

else if(clr) qian=0;

else begin if(count_en) begin if(qian==9) begin qian=0;cout4=1;end

else begin qian=qian+1;cout4=0;end

end

end

end

always@(posedge cout4 or posedge reset or posedge clr)

begin if(reset) wan=0;

else if(clr) wan=0;

else begin if(count_en) begin if(wan==9) begin wan=0;cout5=1;end

else begin wan=wan+1;cout5=0;end

end

end

end

always@(posedge cout5 or posedge reset or posedge clr)

begin if(reset) shiwan=0;

else if(clr) shiwan=0;

else begin if(count_en) begin if(bai==9) begin shiwan=9;end

else begin shiwan=shiwan+1;end

end

end

end

/*****count_en=1时计数,count_en=0不允许计数********/

17

always@(posedge clk_1Hz or posedge reset)

begin if(reset) begin count_en=0;end

else begin count_en=~count_en;load=~count_en;end

end

/*****count_en下降沿到来时锁存数据****/

always@(negedge count_en)

begin out0=ge;

out1=shi;

out2=bai;

out3=qian;

out4=wan;

out5=shiwan;

end

endmodule

试题

一、填空题(10分,每小题1分)

1. 用EDA技术进行电子系统设计的目标是最终完

成 ASIC 的设

计与实现。

2. 可编程器件分为 FPGA 和 CPLD 。

3.随着EDA技术的不断完善与成熟, 自顶向下的设计方法更多的被应用于Verilog HDL设计当中。

4.目前国际上较大的PLD器件制造公司有 Altera 和 Xilinx 公司。 5.

完整的条件语句将产生 组合 电路,不完整的条件语句将产生时序 电路。

6.阻塞性赋值符号为 = ,非阻塞性赋值符号

为 <= 。

二、选择题 (10分,每小题2分)

1. 大规模可编程器件主要有 FPGA、CPLD两类,下列对FPGA结构与工作原理的描述

中,正确的是 C 。

A.FPGA全称为复杂可编程逻辑器件; B.FPGA是基于乘积项结构的可编程逻辑器件;

C.基于SRAM的FPGA器件,在每次上电后必须进行一次配置; D.在Altera公司生产的器件中,MAX7000

系列属FPGA结构。

2. 基于EDA软件的FPGA / CPLD设计流程为:原理图/HDL文本输入 → 综合

→___ __→ →适配→编程下载→硬件测试。正确的

是 B 。

①功能仿真 ②时序仿真 ③逻辑综合 ④配置 ⑤分配管脚

A.③①

B.①⑤

C.④⑤

D.④②

18

3. 子系统设计优化,主要考虑提高资源利用率减少功耗(即面积优化),以及提高运行

速度(即速度优化);指出下列哪些方法是面积优化 B 。

①流水线设计 ②资源共享 ③逻辑优化 ④串行化

⑤寄存器配平 ⑥关键路径法 A.①③⑤

B.②③④ C.②⑤⑥

D.①④⑥

4. 下列标识符中,____A______是不合法的标识符。

A.9moon

B.State0 C. Not_Ack_0

D. signall

5. 下列语句中,不属于并行语句的是:___D____

A.过程语句 B.assign语句 C.元件例化语句 D.case语句

三、EDA名词解释(10分)

写出下列缩写的中文含义:

ASIC: RTL:

FPGA:

SOPC: CPLD:

LPM: EDA:

IEEE: IP:

ISP:

四、简答题(10分)

1. 简要说明仿真时阻塞赋值与非阻塞赋值的区别(本题4分)。

2. 简述有限状态机FSM分为哪两类?有何区别?有限状态机的状态编码风格主要有

哪三种?FSM的三段式描述风格中,三段分别描述什么?(本题6分)

五、程序注解(20分,每空1分)

module AAA ( a ,b );

output a

input [6:0] b

reg[2:0] sum;

integer i;

reg a

always @ (b)

begin

19

sum = 0;

for(i = 0;i<=6;i = i+1)

if(b[i])

sum = sum+1;

if(sum[2]) a = 1;

else a = 0;

end endmodule

本程序的逻辑功能

是:

四、VerilogHDL语言编程题(1、2小题10分,3小题20分) 要求:写清分析设计步骤和注释。

1. 试用Verilog HDL描述一个带进位输入、输出的8位全加器。

端口:A、B为加数,CI为进位输入,S为和,CO为进位输出

2. 编写一个带异步清零、异步置位的D触发器。

端口:CLK为时钟,D为输入,CLK为清零输入端,SET为置位输入端;Q输出端。

3. 设计一个带有异步复位控制端和时钟使能控制端的10进制计数器。 端口设定如下:

输入端口:CLK:时钟,RST:复位端,EN:时钟使能端,LOAD:置位控制端,

DIN:置位数据端;

输出端口:COUT:进位输出端,DOUT:计数输出端。

一、填空题(每空2分,共20分)

1、 ASIC

2、 FPGA 和 CPLD 。 3、自顶向下

4、 Altera 和 Xilinx 5、组合 时序 6、 = <=

二、选择题 (10分,每小题2分)

1、C 2、 B 3、B 4、 A 5、D

三、EDA名词解释(10分)

ASIC 专用集成电路 RTL 寄存器传输

级 FPGA 现场可编程门阵列 SOPC 可编程片上系统

CPLD 复杂可编程逻辑器件 LPM 参数可定制宏模块

库 EDA 电子设计自动化 IEEE 电子电气工程师协

会 IP 知识产权核 ISP 在系

统可编程 四、简答题(10分)

1、简要说明仿真时阻塞赋值与非阻塞赋值的区别(本题4分)。

答:非阻塞(non-blocking)赋值方式 ( b<= a):

20

b的值被赋成新值a的操作, 并不是立刻完成的,而是在块结束时才完成; 块内的多条赋值语句在块结

束时同时赋值; 硬件有对应的电路。

阻塞(blocking)赋值方式 ( b = a): b的值立刻被赋成新值a;

完成该赋值语句后才能执行下一句的操作; 硬件没有对应的电路,因而综合结果未知。

2、 简述有限状态机FSM分为哪两类?有何区别?有限状态机的状态编码风格主要有哪三种?FSM

的三段式描述风格中,三段分别描述什么?(本题6分)

答:Mearly型,Moore型;前者与输入与当前状态有关,而后者只和当前状态有关;Binary,Gray,

One-Hot编码;分别为状态保存,状态切换,输出;

五、程序注解(20分,每空1分)

21

22

分,3小题20分) 要求:写清分析设计步骤和注释。

23

题(1、2小题10

2024年5月18日发(作者:歧蕴藉)

一、 实验设计

第一次实验

1、用门电路设计3-8译码器,译码器的真值表如下。

输入 输出

en c b a y0 y1 y2 y3 y4 y5 y6 y7

-------- -----------------------

0 x x x 1 1 1 1 1 1 1 1

1 0 0 0 0 1 1 1 1 1 1 1

1 0 0 1 1 0 1 1 1 1 1 1

1 0 1 0 1 1 0 1 1 1 1 1

1 0 1 1 1 1 1 0 1 1 1 1

1 1 0 0 1 1 1 1 0 1 1 1

1 1 0 1 1 1 1 1 1 0 1 1

1 1 1 0 1 1 1 1 1 1 0 1

1 1 1 1 1 1 1 1 1 1 1 0

第二次实验

1、用宏单元(宏单元可以是D触发器,74160,7447,门电路等)设计一模14计数器。要求:

1)带清零端;

2)用两个数码管显示计数结果。

3)计数器输入时钟可以用轻触键。

1

附录:模14计数器的真值表

输入 输出

clk clr q4_q3q2q1q0

------- -----------

x 0 0_0000

u 1 0_0001

u 1 0_0010

u 1 0_0011

u 1 0_0100

u 1 0_0101

u 1 0_0110

u 1 0_0111

u 1 0_1000

u 1 0_1001

u 1 1_0000

u 1 1_0001

u 1 1_0010

u 1 1_0011

u 1 0_0000

图2-1 模14计数器

2

2、用LUT实现3输入异或门,要求画出完整的电路图(参照教材图2.29)。

输入异或门的真值表如下:

输入 输出

c,b,a f

----- -----

000 0

001 1

010 1

011 0

100 1

101 0

110 0

111 1

图2-2 3输入异或门

3

第三次实验——基于VerilogHDL的流水灯设计

1、 用VerilogHDL设计一模11二进制加法计数器,并仿真;

表1 模11二进制计数器真值表

输入信号 输出信号

clk clr_n q[3:0]

------------ ------------

x 0 0000;

u 1 0001;

u 1 0010;

u 1 0011;

u 1 0100;

u 1 0101;

u 1 0110;

u 1 0111;

u 1 1000;

u 1 1001;

u 1 1010;

u 1 0000;

------------------------------

注:u表示时钟上沿

module m11_counter(clk,clr_n,q); //定义模块名为m11_counter

input clk,clr_n; //定义1位的输入clk和clr_n

output reg[3:0] q; //定义4位的输出q

always@(posedge clk,negedge clr_n) //当clk上升沿或clr_n下降沿到来时触发

begin

if(!clr_n) q=0; //clr_n为0时q为0000

else

begin

if(q==10) q=0; //判断q是否为1010,是则归0,否则自加1

else q=q+1;

end

end

endmodule

2、 用VerilogHDL设计4-11译码器,并仿真;

表2 4-11译码器

输入信号 输出信号

en code[3:0] y[10:0]

------------- ------------------

0 x 111_1111_1111

4

1 0000 000_0000_0001

1 0001 000_0000_0010

1 0010 000_0000_0100

1 0011 000_0000_1000

1 0100 000_0001_0000

1 0101 000_0010_0000

1 0110 000_0100_0000

1 0111 000_1000_0000

1 1000 001_0000_0000

1 1001 010_0000_0000

1 1010 100_0000_0000

---------------------------------------

module 4_11_decoder(en,code,y); //定义模块名为4_11_decoder

input en; //定义1位的输入en

input[3:0] code; //定义4位的输入code

output reg[10:0] y; //定义reg类型的11位输出y

always@(en,code) //当en或code有变化时触发

begin

if(!en) y=11'b111_1111_1111; //若en为0时,输出y的十一位全为1

else //当en为1时,根据真值表调整与输入

begin //code对应的输出y

case(code)

4'b0000:y=11'b000_0000_0001;

4'b0001:y=11'b000_0000_0010;

4'b0010:y=11'b000_0000_0100;

4'b0011:y=11'b000_0000_1000;

4'b0100:y=11'b000_0001_0000;

4'b0101:y=11'b000_0010_0000;

4'b0110:y=11'b000_0100_0000;

4'b0111:y=11'b000_1000_0000;

4'b1000:y=11'b001_0000_0000;

4'b1001:y=11'b010_0000_0000;

4'b1010:y=11'b100_0000_0000;

default:y=11'b111_1111_1111;

endcase

end

end

endmodule

3 [选做,可在实验时完成]用前面设计的计数器和译码器设计流水控制电路,控制11个LED灯的流动:计数器

的clk输入接轻触开关,用于控制LED灯的移动;

5

选做内容:

1 计数器增加加减法计数输入控制端;

2 用lpm_counter设计从50MHz到10Hz的分频电路,为计数器提供时钟;

3 其它;

表3 模11加减法二进制计数器真值表

输入信号 输出信号

clk clr_n up_dn q[3:0]

------------------- ------------

x 0 x 0000;

u 1 1 q=q+1;

u 1 0 q=q-1;

------------------------------

注:u表示时钟上沿

//模11加减法二进制计数器

module add_and_subtract_counter(clk,clr_n,up_dn,q);

input clk,clr_n,up_dn; //定义一位的输入clk,clr_n,up_dn

output reg[3:0] q; //定义reg类型的三位的输出q

always@(posedge clk,negedge clr_n) //当clk上升沿或clr_n下降沿到来时触发

begin

if(!clr_n) q=0; //当clr_n为0时,q的值为0

else //否则up_dn控制加或减

begin

if(!up_dn) q=q-1; //up_dn为0时,q自减1

else q=q+1; //up_dn为1时,q自加1

end

end

endmodule

3、(2)从50MHz到10Hz的分频电路

//从50MHz到10Hz的分频电路

//定义分频器模块counter_down

module counter_down(clk_out,clk_in,reset);

input clk_in,reset; //定义两个一位的输入clk_in(输入时钟),reset

output reg clk_out; //定义一个reg型的一位的输出clk_out(输出时钟)

integer cnt; //定义一个int型的cnt变量

always@(posedge clk_in,posedge reset) //当clk_in或reset上升沿时触发

begin

if(reset) //当reset为1时清零

begin

cnt<=0;

clk_out<=0;

6

end

else

begin //reset为0时开始分频

if(cnt==2_499_999)//分频从50MHz到10Hz

begin

clk_out<=!clk_out;

cnt<=0;

end

else cnt<=cnt+1;

end

end

endmodule

第四次实验——基本电路设计+学号显示准备

基于VerilogHDL的基本电路设计

1、[基本]用VerilogHDL设计一个19人表决电路,输入为1时表示同意,输入为0时表示不同意。同意者超过

半数则表决通过(表决器输出1),不通过表决器输出0.

2、[选做]用VerilogHDL设计一功能与74161完全一样的电路,其真值表如下:

-------------------------------------------------------------------

输入 输出

CRn LDn ENT ENP CP D C B A q3 q2 q1 q0 RCO

---------------------------- ----------------

0 x x x x xxxx

1 0 x x u dcba

0000

dcba

0

*

*

*

0

0

0

0

0

0

0

0

0

1

1 1 0 x u xxxx q3q2q1q0

1 1 x 0 u xxxx q3q2q1q0

1 1 1 1 u xxxx 0000

1 1 1 1 u xxxx 0001

1 1 1 1 u xxxx 0010

1 1 1 1 u xxxx 0011

1 1 1 1 u xxxx 0100

1 1 1 1 u xxxx 0101

1 1 1 1 u xxxx 0110

1 1 1 1 u xxxx 0111

1 1 1 1 u xxxx 1000

1 1 1 1 u xxxx 1001

* RCO=q3&q2&q1&q0&ENT

//19人表决器

---------------------------------------------------------------------

module voter19(pass,vote);

input[18:0] vote;

output reg pass;

7

reg[5:0] sum;

integer i;

always @(vote)

begin

sum=0;

for(i=0;i<=18;i=i+1)

if(vote[i]) sum=sum+1;

if(sum[3]&sum[1]) pass=1;

else if(sum[3]&sum[2]) pass=1;

else if(sum[4]) pass=1;

else pass=0;

end

endmodule

//74161电路

module 74161(CRn,LDn,ENT,ENP,CP,D,C,B,A,q3,q2,q1,q0,RCO);

input CRn,LDn,ENT,ENP,CP,D,C,B,A;

output reg q3,q2,q1,q0;

output reg RCO;

always @(negedge CRn,posedge CP)

begin

end

endmodule

基于VerilogHDL的设计学号显示电路

1 用VerilogHDL设计学号显示电路,用一个数码管显示。要求写出完整的程序,并仿真。

if(!CRn) {q3,q2,q1,q0}=0;

else if(!LDn) {q3,q2,q1,q0}={D,C,B,A};

else if(ENT&&ENP)

begin

end

else {q3,q2,q1,q0}={q3,q2,q1,q0};

RCO=q3&q0&ENT;

if(9=={q3,q2,q1,q0}) {q3,q2,q1,q0}=0;

else {q3,q2,q1,q0}={q3,q2,q1,q0}+1;

方法一:宏定义

//共阳数码管真值表

`define num0 8'b1100_0000

`define num1 8'b1111_1001

`define num2 8'b1010_0100

`define num3 8'b1011_0000

`define num4 8'b1001_1001

8

`define num5 8'b1001_0010

`define num6 8'b1000_0010

`define num7 8'b1111_1000

`define num8 8'b1000_0000

`define num9 8'b1001_0000

`define numx 8'b1111_1111

module show_student_number(clr,clk,show);

input clr,clk;

output reg[7:0] show;

reg[3:0] i;

always @(negedge clr,posedge clk)

begin

if(!clr) begin show=0; i=0; end

else

begin

if(i==10) i=0;

case(i)

4'd0:show=`num3; //3

4'd1:show=`num1; //1

4'd2:show=`num1; //1

4'd3:show=`num6; //6

4'd4:show=`num0; //0

4'd5:show=`num0; //0

4'd6:show=`num4; //4

4'd7:show=`num6; //6

4'd8:show=`num6; //6

4'd9:show=`num0; //0

default:show=`numx;

endcase

i=i+1;

end

end

endmodule

方法二:状态机

module show_student_number(clr,clk,show);

input clr,clk;

output reg[7:0] show;

reg[3:0] i;

reg[7:0]

9

numx=8'b1111_1111,num0=8'b1100_0000,num1=8'b1111_1001,num2=8'b1010_0100,num3=8'b1011_0000,nu

m4=8'b1001_1001,num5=8'b1001_0010,num6=8'b1000_0010,num7=8'b1111_1000,num8=8'b1000_0000,num9

=8'b1001_0000;

always @(negedge clr,posedge clk)

begin

if(!clr) begin show=0; i=0; end

else

begin

if(i==10) i=0;

case(i)

4'd0:show=num0; //0

4'd1:show=num0; //0

4'd2:show=num0; //0

4'd3:show=num0; //0

4'd4:show=num0; //0

4'd5:show=num0; //0

4'd6:show=num0; //0

4'd7:show=num0; //0

4'd8:show=num0; //6

4'd9:show=num0; //0

default:show=`numx;

endcase

i=i+1;

end

end

endmodule

2 [选做]用VerilogHDL设计分频电路,输入50Mhz,输出2hz。要求写出完整的程序。

//从50MHz到2Hz的分频电路

module 50MHz_to_2Hz(clk_out,clk_in,reset);

input clk_in;

input reset;

output clk_out;

integer cnt;

reg clk_out;

always@(posedge clk_in,posedge reset)

begin

if(reset)

begin

cnt<=0;

clk_out<=0;

end

else

10

begin

if(cnt==12_499_999)

begin

clk_out<=!clk_out;

cnt<=0;

end

else cnt<=cnt+1;

end

end

endmodule

3 [选做]用VerilogHDL设计学号显示电路,要求:

1)用八个数码管显示

2)学号按照时钟的节拍从右而左进入,基准时钟为2hz

3)8位学号进入后停顿5秒,然后从新开始

4)其它功能

4)要求写出完整的程序,并仿真

方法一:宏定义

//共阳数码管真值表

`define nxxxxxxxx

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111

`define nxxxxxxx1

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1001

`define nxxxxxx16

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1001__1000_0010

`define nxxxxx160

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1111__1111_1001__1000_0010__1100_0000

`define nxxxx1600

64'b1111_1111__1111_1111__1111_1111__1111_1111__1111_1001__1000_0010__1100_0000__1100_0000

`define nxxx16004

64'b1111_1111__1111_1111__1111_1111__1111_1001__1000_0010__1100_0000__1100_0000__1001_1001

`define nxx160046

64'b1111_1111__1111_1111__1111_1001__1000_0010__1100_0000__1100_0000__1001_1001__1000_0010

`define nx1600466

64'b1111_1111__1111_1001__1000_0010__1100_0000__1100_0000__1001_1001__1000_0010__1000_0010

`define n16004660

64'b1111_1001__1000_0010__1100_0000__1100_0000__1001_1001__1000_0010__1000_0010__1100_0000

module 8_Nixie_tube_show(clr,clk,hex);

input clr,clk;

output reg[63:0] hex;

reg[4:0] i;

11

always @(posedge clk,negedge clr)

begin

if(!clr) begin i=0; hex=`nxxxxxxxx; end

else

begin

if(i==19) i=0;

case(i)

0:hex=`nxxxxxxxx;

1:hex=`nxxxxxxx1;

2:hex=`nxxxxxx16;

3:hex=`nxxxxx160;

4:hex=`nxxxx1600;

5:hex=`nxxx16004;

6:hex=`nxx160046;

7:hex=`nx1600466;

8:hex=`n16004660;

9:hex=`n16004660;

10:hex=`n16004660;

11:hex=`n16004660;

12:hex=`n16004660;

13:hex=`n16004660;

14:hex=`n16004660;

15:hex=`n16004660;

16:hex=`n16004660;

17:hex=`n16004660;

18:hex=`n16004660;

endcase

i=i+1;

end

end

endmodule

方法二:状态机

module 8_hex(clr,clk,hex0,hex1,hex2,hex3,hex4,hex5,hex6,hex7);

input clr,clk;

output reg[6:0] hex0,hex1,hex2,hex3,hex4,hex5,hex6,hex7;

reg[4:0] cnt;

reg[6:0] s0=7'b100_0000, s1=7'b111_1001, s2=7'b010_0100, s3=7'b011_0000, s4=7'b001_1001,

s5=7'b001_0010, s6=7'b000_0010, s7=7'b111_1000, s8=7'b000_0000, s9=7'b001_0000, sx=7'b111_1111;

always @(posedge clk,negedge clr)

begin

12

if(!clr)

begin

cnt=0; hex1=sx;

end

else

begin

if(cnt==19) cnt=0;

case(cnt)

4'd0:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=sx; hex0=sx;end

4'd1:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=sx; hex0=s1;end

4'd2:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=s1; hex0=s6;end

4'd3:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=s1; hex1=s6; hex0=s0;end

4'd4:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=s1; hex2=s6; hex1=s0; hex0=s0;end

4'd5:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=s1; hex3=s6; hex2=s0; hex1=s0; hex0=s1;end

4'd6:

begin

hex7=sx; hex6=sx; hex5=s1; hex4=s6; hex3=s0; hex2=s0; hex1=s1; hex0=s8;end

4'd7:

begin

hex7=sx; hex6=s1; hex5=s6; hex4=s0; hex3=s0; hex2=s1; hex1=s8; hex0=s4;end

4'd8:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd9:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd10:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd11:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

13

4'd12:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd13:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd14:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd15:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd16:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd17:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

4'd18:

begin

hex7=s1; hex6=s6; hex5=s0; hex4=s0; hex3=s1; hex2=s8; hex1=s4; hex0=s8;end

default:

begin

hex7=sx; hex6=sx; hex5=sx; hex4=sx; hex3=sx; hex2=sx; hex1=sx; hex0=sx;

end

endcase

cnt=cnt+1;

end

end

endmodule

第五次实验——序列检测实验准备

用VerilogHDL设计0100111序列检测器,当检测到序列0100111时输出为1,否则输出为0.

画出状态转换图,给出VerilogHDL程序并仿真。

module fsm_0100111(clk,clr,x,z);

input clk,clr,x;

output reg z;

reg[2:0] state;

parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101,s6=3'b110,s7=3'b111;

always @(posedge clk,negedge clr)

begin

if(!clr) begin state<=s0; z=0; end

14

else case(state)

s0: begin if(x) begin state<=s0; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s1: begin if(x) begin state<=s2; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s2: begin if(x) begin state<=s0; z=1'b0; end

else begin state<=s3; z=1'b0; end

end

s3: begin if(x) begin state<=s2; z=1'b0; end

else begin state<=s4; z=1'b0; end

end

s4: begin if(x) begin state<=s5; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s5: begin if(x) begin state<=s6; z=1'b0; end

else begin state<=s3; z=1'b0; end

end

s6: begin if(x) begin state<=s7; z=1'b0; end

else begin state<=s1; z=1'b0; end

end

s7: begin if(x) begin state<=s0; z=1'b1; end

else begin state<=s1; z=1'b1; end

end

default:begin state<=s0;z=1'b0; end

endcase

end

endmodule

1/

1/

S0/0

0/

S1/0

0/

1/

0/

S2/0

0/

0/

1/

0/

S3/0

1/

0/

0/

S7/1

1/

S6/0

1/

S5/0

1/

S4/0

第六次实验——频率计实验准备

1 用VerilogHDL设计信号发生器,要求

1)把输入50Mhz时钟分频,输出1hz基准频率

2)把输入50Mhz时钟分频,输出学号频率

15

3)写出完整的程序

module fenpinji(clk_50M,signal_out,clk_1Hz);

input clk_50M;

output reg signal_out,clk_1Hz;

reg[29:0] cnt,cnt1;

always@(posedge clk_50M) //改变Hz的范围,自己设定的频率1Hz-999999Hz

begin

end

always@(posedge clk_50M) //50M分频产生1Hz时钟

begin

end

endmodule

2 用VerilogHDL设计频率计,要求

1)能够测量和显示999999范围内的频率

2)给出VerilogHDL程序并仿真

cnt=cnt+1;

if(cnt<=25_000_000) clk_1Hz=0;

else if(cnt==50_000_000) cnt=0;

else clk_1Hz=1;

cnt1=cnt1+1;

if(cnt1==25_000_0) begin signal_out=0;end

else if(cnt1==50_000_0) cnt1=0;

else begin signal_out=1;end

module pinlvji(signal_in,clk_50M,clk_1Hz,reset,out0,out1,out2,out3,out4,out5);

input clk_50M,reset,signal_in; //50MHz时钟输入、复位

input reg clk_1Hz;

output reg signal_out;

reg count_en; //计数允许,count_en=1时计数,下降沿到来时锁存

reg load;

reg[3:0] ge,shi,bai,qian,wan,shiwan;

reg cout1,cout2,cout3,cout4,cout5;

reg[3:0] out0,out1,out2,out3,out4,out5;

wire clr;

/*被测信号signal_in作为个位的输入,signal_in上升沿到来时ge位+1;进位输出是cout1,作为十位的

输入*/

always@(posedge signal_in or posedge reset or posedge clr)

begin if(reset) ge=0;

else if(clr) ge=0;

else begin if(count_en) begin if(ge==9) begin ge=0;cout1=1;end

else begin ge=ge+1;cout1=0;end

end

end

end

16

/*cout1作为十位的输入,cout1上升沿到来时shi位+1;进位输出是cout2,作为百位的输入*/

always@(posedge cout1 or posedge reset or posedge clr)

begin if(reset) shi=0;

else if(clr) shi=0;

else begin if(count_en) begin if(shi==9) begin shi=0;cout2=1;end

else begin shi=shi+1;cout2=0;end

end

end

end

/*cout2作为百位的输入,cout2上升沿到来时bai位+1;进位输出是cout3,作为千位的输入*/

always@(posedge cout2 or posedge reset or posedge clr)

begin if(reset) bai=0;

else if(clr) bai=0;

else begin if(count_en) begin if(bai==9) begin bai=0;cout3=1;end

else begin bai=bai+1;cout3=0;end

end

end

end

/*cout3作为千位的输入,cout3上升沿到来时qian位+1;进位输出是cout4,作为万位的输入*/

always@(posedge cout3 or posedge reset or posedge clr)

begin if(reset) qian=0;

else if(clr) qian=0;

else begin if(count_en) begin if(qian==9) begin qian=0;cout4=1;end

else begin qian=qian+1;cout4=0;end

end

end

end

always@(posedge cout4 or posedge reset or posedge clr)

begin if(reset) wan=0;

else if(clr) wan=0;

else begin if(count_en) begin if(wan==9) begin wan=0;cout5=1;end

else begin wan=wan+1;cout5=0;end

end

end

end

always@(posedge cout5 or posedge reset or posedge clr)

begin if(reset) shiwan=0;

else if(clr) shiwan=0;

else begin if(count_en) begin if(bai==9) begin shiwan=9;end

else begin shiwan=shiwan+1;end

end

end

end

/*****count_en=1时计数,count_en=0不允许计数********/

17

always@(posedge clk_1Hz or posedge reset)

begin if(reset) begin count_en=0;end

else begin count_en=~count_en;load=~count_en;end

end

/*****count_en下降沿到来时锁存数据****/

always@(negedge count_en)

begin out0=ge;

out1=shi;

out2=bai;

out3=qian;

out4=wan;

out5=shiwan;

end

endmodule

试题

一、填空题(10分,每小题1分)

1. 用EDA技术进行电子系统设计的目标是最终完

成 ASIC 的设

计与实现。

2. 可编程器件分为 FPGA 和 CPLD 。

3.随着EDA技术的不断完善与成熟, 自顶向下的设计方法更多的被应用于Verilog HDL设计当中。

4.目前国际上较大的PLD器件制造公司有 Altera 和 Xilinx 公司。 5.

完整的条件语句将产生 组合 电路,不完整的条件语句将产生时序 电路。

6.阻塞性赋值符号为 = ,非阻塞性赋值符号

为 <= 。

二、选择题 (10分,每小题2分)

1. 大规模可编程器件主要有 FPGA、CPLD两类,下列对FPGA结构与工作原理的描述

中,正确的是 C 。

A.FPGA全称为复杂可编程逻辑器件; B.FPGA是基于乘积项结构的可编程逻辑器件;

C.基于SRAM的FPGA器件,在每次上电后必须进行一次配置; D.在Altera公司生产的器件中,MAX7000

系列属FPGA结构。

2. 基于EDA软件的FPGA / CPLD设计流程为:原理图/HDL文本输入 → 综合

→___ __→ →适配→编程下载→硬件测试。正确的

是 B 。

①功能仿真 ②时序仿真 ③逻辑综合 ④配置 ⑤分配管脚

A.③①

B.①⑤

C.④⑤

D.④②

18

3. 子系统设计优化,主要考虑提高资源利用率减少功耗(即面积优化),以及提高运行

速度(即速度优化);指出下列哪些方法是面积优化 B 。

①流水线设计 ②资源共享 ③逻辑优化 ④串行化

⑤寄存器配平 ⑥关键路径法 A.①③⑤

B.②③④ C.②⑤⑥

D.①④⑥

4. 下列标识符中,____A______是不合法的标识符。

A.9moon

B.State0 C. Not_Ack_0

D. signall

5. 下列语句中,不属于并行语句的是:___D____

A.过程语句 B.assign语句 C.元件例化语句 D.case语句

三、EDA名词解释(10分)

写出下列缩写的中文含义:

ASIC: RTL:

FPGA:

SOPC: CPLD:

LPM: EDA:

IEEE: IP:

ISP:

四、简答题(10分)

1. 简要说明仿真时阻塞赋值与非阻塞赋值的区别(本题4分)。

2. 简述有限状态机FSM分为哪两类?有何区别?有限状态机的状态编码风格主要有

哪三种?FSM的三段式描述风格中,三段分别描述什么?(本题6分)

五、程序注解(20分,每空1分)

module AAA ( a ,b );

output a

input [6:0] b

reg[2:0] sum;

integer i;

reg a

always @ (b)

begin

19

sum = 0;

for(i = 0;i<=6;i = i+1)

if(b[i])

sum = sum+1;

if(sum[2]) a = 1;

else a = 0;

end endmodule

本程序的逻辑功能

是:

四、VerilogHDL语言编程题(1、2小题10分,3小题20分) 要求:写清分析设计步骤和注释。

1. 试用Verilog HDL描述一个带进位输入、输出的8位全加器。

端口:A、B为加数,CI为进位输入,S为和,CO为进位输出

2. 编写一个带异步清零、异步置位的D触发器。

端口:CLK为时钟,D为输入,CLK为清零输入端,SET为置位输入端;Q输出端。

3. 设计一个带有异步复位控制端和时钟使能控制端的10进制计数器。 端口设定如下:

输入端口:CLK:时钟,RST:复位端,EN:时钟使能端,LOAD:置位控制端,

DIN:置位数据端;

输出端口:COUT:进位输出端,DOUT:计数输出端。

一、填空题(每空2分,共20分)

1、 ASIC

2、 FPGA 和 CPLD 。 3、自顶向下

4、 Altera 和 Xilinx 5、组合 时序 6、 = <=

二、选择题 (10分,每小题2分)

1、C 2、 B 3、B 4、 A 5、D

三、EDA名词解释(10分)

ASIC 专用集成电路 RTL 寄存器传输

级 FPGA 现场可编程门阵列 SOPC 可编程片上系统

CPLD 复杂可编程逻辑器件 LPM 参数可定制宏模块

库 EDA 电子设计自动化 IEEE 电子电气工程师协

会 IP 知识产权核 ISP 在系

统可编程 四、简答题(10分)

1、简要说明仿真时阻塞赋值与非阻塞赋值的区别(本题4分)。

答:非阻塞(non-blocking)赋值方式 ( b<= a):

20

b的值被赋成新值a的操作, 并不是立刻完成的,而是在块结束时才完成; 块内的多条赋值语句在块结

束时同时赋值; 硬件有对应的电路。

阻塞(blocking)赋值方式 ( b = a): b的值立刻被赋成新值a;

完成该赋值语句后才能执行下一句的操作; 硬件没有对应的电路,因而综合结果未知。

2、 简述有限状态机FSM分为哪两类?有何区别?有限状态机的状态编码风格主要有哪三种?FSM

的三段式描述风格中,三段分别描述什么?(本题6分)

答:Mearly型,Moore型;前者与输入与当前状态有关,而后者只和当前状态有关;Binary,Gray,

One-Hot编码;分别为状态保存,状态切换,输出;

五、程序注解(20分,每空1分)

21

22

分,3小题20分) 要求:写清分析设计步骤和注释。

23

题(1、2小题10

发布评论

评论列表 (0)

  1. 暂无评论