搜索
您的当前位置:首页正文

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

来源:二三娱乐
一、 实验设计

第一次实验

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,num4=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/00/S1/00/1/0/S2/00/0/1/0/S3/01/0/0/S7/11/S6/01/S5/01/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

1、 功能仿真和时序仿真有何不同?为什么?

答:由以上的的波形图可知,时序仿真有一小段时间比功能仿真中的波形多了一个BCD码——13。因为,因为时序仿真会考虑实际元器件的信号延时、输入/输出时间的延时、触发器的建立/保持时间、寄存器的性能,而功能仿真只是考虑元件的功能的实现,并没有考虑到其中的干扰。

1、状态机处于S3状态时,若再输入一个“1”,为什么状态仍停留在S3状态,而不是其它状态? 答:由序列检测器状态变化图可看出,在处于s3状态前已经输入了3个1(即111状态),所以再输入1时,只有停留在s3状态才可以检测到1110010状态时输出1 2、什么叫一位热码编码状态机(one hot state machine)?

答:一位热码编码状态机即采用n位(或n个触发器)来编码具有n个状态的状态机。

24

1、所设计的频率计有测量误差吗?误差是多少?如何减少误差?

答:有误差;一个周期;减少误差的方法是进行多次测量再取平均值或把待测信号先多次移相测量再取平均值。

2、原理图输入设计方便还是Verilog HDL输入设计方便?为什么?

答:Verilog HDL输入设计方便,因为控制模块的功能比较特殊,使用原理图的方法非常复杂,而Verilog HDL只需描述出信号的输入输出关系即可。 3、原理图输入设计还是verilog HDL输入设计方便?为什么?

答:verilog HDL更方便,只需要输入语句进行描述。

1、什么是同步清零和异步清零?

答:同步清零的清零信号的清零作用与时钟信号同步,即清零信号与时钟信号的上升沿或下降沿同时作用于电路时,电路才实现清零,具体是时钟信号的上升沿或下降沿作用则要看具体的芯片而定。异步清零则是清零到达时立刻实现清零功能。 2、BCD计数器和一般二进制计数器有何差别?

答:BCD计数器用一个4位二进制数代表一个十进制数字0~9,一般二进制计数器的4位能表示十进制数的0~15。

3、键盘为什么要防抖动?如何防抖动?(选做)

答:键盘的按键在按下的时候可能会发生抖动,使得一次按下的操作可能被计数器误认为是几次按下的操作,使操作者的输入出错。

2、 功能仿真和时序仿真有何不同?为什么? 答:由图(5)(6)(7)中可知时序仿真中的波形有一小段时间比功能仿真中的波形多了一个BCD码——13。因为功能仿真只是考虑元件的理想功能,而时序仿真考虑到实际元器件的信号延时、输入/输出时间的延时、触发器的建立/保持时间、寄存器的性能等等。

在本实验的模13BCD码计数器的设计中,由于设计方案采用的是异步清零法,清零信号不受时钟信号控制,电路容易有误操作,可把电路接为同步置零(如图(8)),提高电路可靠性。 1、本设计的测量结果在6个数码管上显示,若采用静态显示的方式,每位显示需4根输出线,共需24根据输出线;若用动态扫描方式,只需6+7=13根线。什么叫动态扫描显示方式?你能写出动态扫描输出显示的程序吗?

答:动态扫描显示就是让各位数码管按照一定的顺序轮流地发光显示. 动态扫描输出显示的程序如下: module sdfrequent; reg clk,start;

reg [3:0] led1,led2,led3,led4; wire [3:0] dip; wire [7:0] ledcode;

led led(clk,start,led1, led2,led3,led4,dip,ledcode);

25

always #:0 clk=~clk;

initial begin

start=0;clk=0;led1=1;led2=3;led3=3; #10 start=1; #10 start=0;

#650 $finish; end

endmodule

概念加程序

一、 EDA的概念

1、定义:电子(系统)设计的自动化,或电子线路或系统的计算机辅助设计。是基于计算机平台的一整套先进的设计电子系统的软件工具。

2、研究对象:电子电路与系统设计的全过程:低频、高频、微波电路、线性与非线性电路、模拟和数字电路、分离电路和集成电路。 3、设计的层次 三个层次: ➢ 系统级 ➢ 电路级

➢ 物理实现级。

4.EDA技术发展的三个阶段

➢ CAD阶段(70s):EDA的初级阶段。利用功能有限的计算机进行简单的电路性能分析和预测,PCB的

计算机辅助布局布线,如smart work。 ➢ CAE阶段(80s):CAD工具逐步完善和发展,将许多单点工具集成在一起使用, EDA阶段(90s):

超大规模集成电路时代,集成电路工艺水平达到深亚微米,一个芯片可集成上千万个晶体管,速度达giga bit/s,对电子设计的工具提出了更高的要求,同时也促进了设计工具的发展。出现了众多的ICCAD工具,如CADENCE,MENTOR GRAPHICS,SYNOPSIS等著名公司的EDA软件;中国的熊猫系统等。

6、现代EDA 技术的特点

1)采用硬件描述语言(HDL);具有如下突出优点:语言的公开性和可利用性、设计与工艺无关、宽范围的描述能力、便于大规模系统设计和设计的可复用、交流、保存、修改;

2)高层综合和优化:开发工具支持系统级的综合和仿真,可更好地支持自上而下的设计方法; 3)并行工程:系统化的、集成化的、并行的产品及相关过程的开发模式,支持多人同时并行进行设计工作。 4)开放性和标准化:EDA工具的相互兼容,有利于资源共享。 二、数字系统的设计思想

系统级设计功能级描述功能仿真门级描述时序仿真;自上而下逐级细化的设计方法。设计需要经过 “设计-验证-修改-再验证”的过程。 三、IP核复用技术与SOC

26

1、IP复用技术

1)何谓IP复用技术:Intellectual Property(IP)原指知识产权、著作权等,在IC设计领域指具有某种功能的虚拟电路模块。设计系统时使用或反复使用某些IP称IP复用。

2)IP分硬核、固核和软核三种。硬核指固定的版图模块,用户不能修改;软核指用HDL描述的功能模块,用户可以进行修改;固核介于硬核和软核之间,用户可进行一些修改。 2、SOC

1)定义:System On a Chip系统芯片,即把整个系统集成在一片芯片中。 2)硬件和软件技术发展到今天,用户已经可以通过编程设计自己的系统,该系统可以包括微处理器(MCU)、RAM/ROM和逻辑电路等。 四、数字系统的实现方式

1、全定制(full custom)方式:基于版图的设计方法,分通用和专用集成电路设计; 2、半定制(semi custom)设计:是在厂家提供的基本单元的基础上的进行的二次设计,又有一下三种方式:

 门阵列(gate array):在半成品基础上的设计方式。半成品含有加工好的大量的晶体管和IO焊盘,

但没有布线。布线由用户设计,实现特定的功能。  标准单元(standard cell):利用厂家的标准单元进行设计的方式。  PLD方式:器件已经制造好,用户自己编程便可实现各种功能。 5、硬件描述语言的不足

➢ 电路采用高级的简明结构HDL描述,它意味着放弃了对电路门级实现定义的控制; ➢ 由综合工具生成的逻辑实现效果不好; ➢ 工具的不同导致综合质量的不同。

第二部分 可编程逻辑器件(PLD)

1、ASIC:Application Specific Integrated Circuits,即专用集成电路,是面向特定用户、具有专门用途的芯片,并依此区别于通用芯片.

2、PLD,Programmable Logic Devices,是20世纪70s发展起来的一种新型器件,它的应用和发展不仅简化了电路设计,降低了成本,提高了系统的可靠性,且给数字系统的设计带来了革命性变化。 (二)PLD的分类 (p18)

(四)CPLD的结构与特点(EMP7032内部结构图)

27

CPLD是在PAL、GAL的基础上发展起来的阵列型PLD,具有高密度高速度的优点。从结构上看,CPLD一般包括3种结构:

 宏单元:主要包括与或阵列、触发器和多路选择器 等电路,可独立配置为组合逻辑或时序逻辑;

 可编程IO单元:可独立配置为输入、输出和双向 IO;

 可编程内部连线(PIA):其作用是在各逻辑宏单 元之间以及宏单元和IO之间提供互连网络。 (五)FPGA的结构与特点(FLEX10K10内部结构图)

与CPLD相比,FPGA具有更高的集成度、更强的逻辑功能和更大的灵活性。一般由3部分组成:

 可配置逻辑块(CLB,Configurable Logic Block )  输入输出模块(IOB)  可编程互连线(PI)  片内RAM

(五)FPGA的结构与特点

1、可配置逻辑块(CLB,Configurable Logic Block ):是FPGA的基本结构单元,不仅能实现逻辑函数,还可以配置成RAM等形式。其显著特点是内部有查找表(LUT); 2、输入输出模块(IOB):作用同CPLD; 3、可编程互连线(PI):作用同CPLD,不同点是其布线延时不固定,与路径有关,而CPLD的固定。

4、片内RAM:其读的速度(3-4ns)和写的速度(5ns)非常快,比任何片外解决方案快很多倍,可配置成各种形式。

六)在系统可编程(ISP)与边界扫描(BST)技术

1、在系统可编程:ISP,In System Programmable,指的是对器件、电路板或整个电子系统的逻辑功能可随时进行修改或重构的能力。

2、边界扫描测试(BST)技术:由于器件越来越复杂,表面封装技术和电路板制造技术的进步,使得电路板的变小变密,传统的测试方法很难实现。 (七)PLD产品概述:PLD的发展趋势

 向大规模、高集成度方向发展;

 向低电压、低功耗、低价格的方向发展;  向高速可预测延时方向发展;  在PLD内嵌入多种功能模块;  向模数混合可编程的方向发展。 二、ALTERA可编程逻辑器件 (二)MAX7000系列器件 MAX7000系列内部结构:组成模块:

(1)LAB: Logic Array Block,逻辑阵列块,内含16个宏单元,是器件的主要组成部分;

(2)MC:Macrocell,宏单元,由逻辑阵列、乘积项选择矩阵和可编程触发器组成,用于实现各种逻辑;(宏单元结构图)

(3)EPT:Expander Product Term,扩展乘积项,用于辅助逻辑阵列实现复杂的逻辑;

(4)PIA:Programmable Interconnect Array,可编程连线阵列,把LAB相互连接构成所需的逻辑。这个全局总线是可编程通道,它把器件中任何信号源连到其目的地;MAX系列的PIA有固定的布线延时,而FLEX系列的布线延时与路径有关;

(5)I/O Control Block:I/O控制块,它允许每个I/O单独地配置为输入、输出和双向输入输出中的一种方

28

式。(图)

(三)FLEX10K系列内部结构:小结 1)FLEX系列器件的特点:

1.容量大,用于实现复杂的电路和系统 2.内部含有ROM/RAM;

3.内部含LUT,尽量采用查表法实现逻辑函数; 4.FLEX器件内部布局布线的延时与路径有关。 2)器件的特性设定

1.电压摆率(Slew-Rate)设定:设置低噪声/高速度方式; 2.漏极开路(Open-Drain)设定:

3.多电压(MultiVolt)I/O接口:FLEX10K的核和外围IO可以工作于不同的电压,其中Vccin引脚为内核和输入缓冲器提供工作电压,Vccio为I/O引脚提供工作电压。

第三部分 可编程逻辑器件开发软件

第四部分:基于原理图输入的数字电路(系统)设计

2参数化计数器的使用( lpm_counter) 1)输入信号选择

 data[]:数据输入,用于预置数;  clock:输入时钟;

 clk_en:输入时钟使能;  cnt_en:计数器使能;

 updown:加(1)减(0)法选择;  aclr:异步清零;

 aset:异步置数(AVALUE);  aload:异步置数(data[]);  sclr:同步清零;

 sload:同步置数(data[]);  sset:同步置数(SVALUE)。 2)输出信号选择

 q[]:计数值输出;

29

 eq[15..0]:计数值译码输出:

q[]=0 eq[0]=1; q[]=1 eq[1]=1;……q[]=15 eq[15]=1;

3 参数化RAM/ROM的使用( lpm_rom) 设计要点1:存储器输入输出的选择:

INPUTS OUTPUTS

address[] :输入地址 q[]:存储器输出 Inclock :输入锁存时钟 Outclock :输出锁存时钟 memenab:使能 (六) 小结

(一)基于PLD的数字系统设计的优点 1、系统开发周期短

 设计输入方法灵活多样;  软件仿真,错误自动定位  修改方便;

2、系统体积小 3、系统可靠性好 4、系统保密性好

5、价格?可进一步降低价格。 (二)系统的设计思想

1、TOP-DOWN:用于设计性能级:概念-〉产品说明书(性能指标)-〉系统输入输出图(黑匣子); 功能级:系统输入输出图-〉系统框图(功能划分)-〉功能实现-〉仿真-〉网表; 结构级:原理图网表-〉版图布局-〉版图布线-〉后仿真-〉网表 物理级:基本逻辑单元的设计。 重要概念:

 from concept to netlist;  from concept to layout;  from concept to product;

2、bottom-up:用于实现基本逻辑单元-〉子功能模块-〉子系统-〉系统 (三)基于MAXPLUS II的系统设计流程 3.1概念-〉功能模块 3.2设计输入

1、原理图输入方法

 最基本的方法;

30

 充分利用已有基本单元,74XX等;

 缺点:不够灵活(虽然编译时可自动消除冗余电路),如32位加法器等。

例1:多路选择器

输入信号:in1[3..0],in2[3..0],in3[3..0],d[2..0]; 输出信号:q[3..0];

要求:d[]=110时,q[]=in1[]; d[]=101时q[]=in2[];d[]=011时q[]=in3[]; 点评:该多路选择器不属于常规电路,没有现成的电路(74XX),用原理图输入非常麻烦,但用文本输入则方便快捷。

SUBDESIGN trymux (

in1[3..0],in2[3..0],in3[3..0],d[2..0] :INPUT; q[3..0] :OUTPUT; ) begin

defaults q[]=GND; end defaults; case d[] is

when B\"110\"=>q[]=in1[]; when B\"101\"=>q[]=in2[]; when B\"011\"=>q[]=in3[]; end case; end;

例2:地址发生器 输入信号:clk;

输出信号:111->110->101->011->110…;

要求:每来一个时钟脉冲,产生循环地址110、101、011;初始值为111。 点评:1)本地址发生器也不是规范电路,用原理图输入方法非常麻烦,但用AHDL非常方便;2)在AHDL中,状态机是非常好用的工具,可方便地实现各种时间序列,如计数器、序列发生器、地址发生器、波形发生器等。

31

3.3 设计编译

编译的功能为:逻辑综合、逻辑试配

1、选择一个器件系列,不知具体选用哪个型号时选AUTO; 2、打开Design Doctor,进行错误检测和错误定位; 3、打开保护位:

 选择是否设置保护位;

 选择保留资源(reserved sources)的比例;I/O和逻辑单元一般留10%,使器件留有修改的余地。 4、选择全局的项目逻辑综合方式:选择是否自动选全局clock、clear、preset、output enable(缺省); 5、打开FLOOR PLAN EDITOR观察试配结果

 可以为某些型号指定引脚号;

 一般不能全部指定,否则影响试配的成功; 3.4 设计仿真

1、编辑输入波形,注意要覆盖设计电路的所有功能;

2、输入/输出信号可以从SNF选择,把有用的、关键的信号选出,不重要的中间波形可不选; 3、信号可选group形式或单个形式; 4、选择前仿真还是后仿真; 5、结果不对时,重新设计电路。 3.5 设计的下载

1、用编程卡+主编程器+适配器下载;

2、用BYTE BLASTER/BIT BLASTER下载(ISP器件); 3.5 通电试验

1、每个VCC 与GND之间要加0.1μF的电容; 2、通电后器件微微发热,是正常现象; 3、学会一些调试手段和方法; (三)系统设计的要点

1、概念-〉功能模块的能力训练; 2、熟练运用三种设计输入方法,特别是综合运用原理图输入和文本输入方法;文本输入方法中必须掌握组合逻辑电路和状态机的设计方法;

3、熟练掌握以上数字系统设计的各个环节。

第五部分 Verilog HDL

(一) 硬件描述语言的概念

 硬件描述语言(Hardware Description Language),是电子系统硬件行为描述、结构描述、数据流

描述的语言。

 硬件描述语言诞生原因:在计算机辅助电子设计的过程中,逻辑图、分立元件作为整个越来越复杂

的电子系统的设计已经不适应,需要一种硬件描述语言来作为EDA工具的工作语言。

32

二、Verilog HDL语言介绍 1、Verilog HDL实例

module adder1(cout,sum,a,b,cin,enable); //模块声明 output[7:0] sum; //输出声明 output cout;

input[7:0] a,b; //输入声明 input cin,enable;

reg cout; //变量类型声明 reg[7:0] sum;

always@(posedge enable) //always语句 begin

{cout,sum}=a[7:0]+b[7:0]+cin; end

endmodule

2、Verilog HDL程序基本结构

module<顶层模块名>(输入输出端口列表) output 端口名1,。。。,端口名N; input 端口名1,。。。,端口名M; wire //结果信号名 assign

always@(敏感信号表达式) begin end

元件例化:and myand(a,b,c); Endmodule

33

3、Verilog HDL中逻辑功能的定义 1)用assign语句

Assign F=~((A&B)|(C&D)); 2)用元件例化

And myand3(f,a,b,c);

3)用always@语句描述各种逻辑功能 (二) 数据类型及常量、变量 1、常量的表示 8’b11000101 8’hc5 197

6’b1001xx-------------不定值 8’b1010zzzz----------高阻态 Parameter SEL=8, CODE=8’ha3; 2、变量的表示 Wire 数据名1,。。。,数据名n;

Verilog HDL的缺省输入输出信号类型,只能用assign赋值,取值为0,1,x,z。 Reg 数据名1,。。。,数据名n; Reg[7:0] data;

Reg[7:0] mymem[1023:0] 变量小结:

1.nets型变量:其输出始终根据输入的变化而更新其值的变量,它一般指硬件电路中的各种物理连接。如wire变量。

2.register变量:它对应的是具有状态保持作用的电路元件,如触发器、寄存器等。如reg, integer变量。

3.register与nets变量的根本区别:前者有记忆性,后者无。 (三)运算符及表达式

6、缩减运算符

&:与;~&:与非;|:或;~|:或非;^:异或;^~, ~^:同或 缩减运算符是单目运算符,对单个操作数进行运算。 例若定义 reg[3:0] a; 则:b=&a等效为

b=a[0]&a[1]&a[2]&a[3]; 又如,若A=5’b11001,则

34

&A=0; |A=1;

7、移位运算符

>>:右移 <<:左移; 例:若A=5’b11001,则A>>2的值为:5‘b00110 8、条件运算符----?:

是一种三目运算符,对三个操作数进行运算。其用法如下: Signal=condition? true_expression : false_expression

Condition=1时执行true_expression,condition=0时执行false_expression. 9、位拼接运算符:{ }

作用:把两个或多个信号的某些位拼接起来。 例如:全加器的描述

input[3:0] ina,inb; ina+inb+cin的进位自动放入 input cin; output[3:0] sum;

output cout; assign {cout, sum}=ina+inb+cin; (三)运算符及表达式:运算符的优先级

不清楚优先级时,用扩号()来控制运算的优先级。

(四)赋值语句

1、连续赋值语句(continue assignments)assign为连续赋值语句,它对wire型变量进行赋值。例如:assign c=a&b;这里a b c为wire型变量,a和b信号的任何变化都随时反映到c上来,因此称为连续赋值方式;

2、过程赋值语句(procedural assignments)对寄存器型(reg)变量进行赋值。分为非阻塞赋值语句和阻塞赋值语句。

(1)非阻塞赋值(non-blocking):b<=a;

特点:非阻塞赋值必需在块结束时才完成赋值操作,即b的值不是立刻就变的。 (2)阻塞赋值(blocking):b=a;

特点:赋值语句结束时就完成赋值操作,即b的值在赋值语句结束后立刻就变。 (五)条件语句

1、if –else语句(p144)

语句若为多句,用begin-end括起来。 2、case语句(p145)

要点:敏感表达式一般为一个变量或表达式;一般要列出敏感表达式的所有可能取值,不能穷举时,剩余其它情况执行 default语句;

35

2)casez与casex语句

当case的分支取值每些位为高阻z,那末对这些位不予比较,只比关注别的位的比较结果,这时用casez语句;当case的分支取值每些位为高阻z或不定值x,那末对这些位不予比较,只比关注别的位的比较结果,这时用casex语句;可以用“?”标识x或z,表示无关值.如: Casez(select) 4’b1: out=a;

4’b??10: out=b; //优先编码器 4’b?100: out=c; 4’b1000: out=d; endcase

3、条件语句小结:

1)使用条件语句时,应注意列出所有条件分支,否则编译器认为条件不满足时,会引进一个触发器保持原值;

2)不可能列出所有分支时,if 语句后加else,case语句最后加default语句; 例6.9:

Module burried_ff(c,b,a); Output c; Input b, a; Reg c;

Always @ (a or b) begin

if ((a==1)&&(b==1)) c=1; end

endmodule

实现的功能为 实现的电路为

例6.10

Module tryand2(c,b,a); Output c; Input b, a; Reg c;

Always @ (a or b) begin

if (a==1)&&(b==1) c=1;

36

else c=0; end

endmodule

实现的功能为 实现的电路为

(六)循环语句:for 语句

For(表达式1;表达式2;表达式3)

表达式1:循环变量初值;表达式2:循环结束条件;表达式3:循环变量增值。 Module voter7(pass,vote); Output pass;

Input [6:0] vote; Reg [2:0] sum; Integer i; Reg pass; Always@(vote) Begin sum=0;

for(i=0;i<=6;i=i+1) if(vote[i]) sum=sum+1;

if(sum[2]) pass=1;//4人以上为1。 else pass=0; end

(七)结构说明语句:always@语句 格式:always@(<敏感信号表达式>)

敏感信号表达式:又称敏感表,当该表达式的值改变时,就会执行一遍块内的语句。例如: always@(in0 or in1 or in2 or in3);

always@(posedge clk or negedge clear);上升沿posedge;下降沿negedge (八)语句的顺序执行与并行执行

always@块内的语句按照指定的顺序执行;always@块语句、assign语句、元件例化语句之间并行执行。

module serial1(q,a,clk); always@(posedge clk) input clk; begin output q,a; q=~q; reg q,a; a=~q;

37

end always@(posedge clk) endmodule begin module serial2(q,a,clk); a=~q; input clk; q=~q; output q,a; end reg q,a; endmodule 再如:

module paral1(q,a,clk); module paral2(q,a,clk); input clk; input clk; output q,a; output q,a; reg q,a; reg q,a; always@(posedge clk) always@(posedge clk) begin begin a=~q; q=~q; end end always@(posedge clk) always@(posedge clk) begin begin q=~q; a=~q; end end endmodule endmodule 注:两个模块的功能是一样的!

(九)不同抽象级别的Verilog HDL模型 Verilog HDL的门级描述(p179):调用门原语(primitive)进行电路描述。 Verilog HDL行为级描述(p180):用各种语句进行电路描述。

对于设计者而言,采用的描述级别越高,设计越容易。但对综合器而言,有可能无法将某些抽象级别高的描述转化为电路。因此设计者应了解综合器的性能。

第六部分:用Verilog HDL语言设计数字电路

一、常用组合电路的设计 (一)、基本门电路的设计 1)调用门原语的描述方法

module gate1(f,a,b,c,d); 2)用assign语句描述

input a,b,c,d; module gate1(f,a,b,c,d); output f; input a,b,c,d; nand(f1,a,b); output f;

and(f2,b,c,d); assign f=(!(a&b))|(b&c&d); or(f,f1,f2); endmodule endmodule

3) 用always语句的描述方法 module gate1(f,a,b,c,d); input a,b,c,d; output f;

38

reg f;--------------------注意 always@(a or b or c or d) begin

f=!(a&b)|(b&c&d); end

endmodule (二)、编码译码器 1、3-8译码器

module decoder_38(out,in); output[7:0] out; input[2:0] in; reg[7:0] out; always@(in) begin

case(in)--------------------------设计要点:采用case语句。 3'd0:out=8'b11111110; 3'd1:out=8'b11111101; 3'd2:out=8'b11111011; 3'd3:out=8'b11110111; 3'd4:out=8'b11101111; 3'd5:out=8'b11011111; 3'd6:out=8'b10111111; 3'd7:out=8'b01111111;

Endcase------------------------此处加不加default语句?? end

endmodule (二)、编码译码器

2、8-3优先编码器 要点:用if-else语句。 module else if(g) outtemp=4'b0110; try83coder(none_on,outcode,a,b,c,d,e, else if(f) outtemp=4'b0101; f,g,h); else if(e) outtemp=4'b0100; output none_on; else if(d) outtemp=4'b0011; output[2:0] outcode; else if(c) outtemp=4'b0010; input a,b,c,d,e,f,g,h; else if(b) outtemp=4'b0001; reg[3:0] outtemp; else if(a) outtemp=4'b0000; assign {none_on,outcode}=outtemp; else outtemp=4'b1000; always@(a or b or c or d or e or f or end g or h) endmodule begin if(h) outtemp=4'b0111;

39

用case语句实现8-3优先编码器 module

try83coder(none_on,outcode,a,b,c,d,e,f,g,h);

output none_on;

output[2:0] outcode; input a,b,c,d,e,f,g,h; reg[3:0] outtemp;

assign {none_on,outcode}=outtemp;

always@(a or b or c or d or e or f or g or h)

begin casez({a,b,c,d,e,f,g,h}) 8’b1: outtemp=4'b0111; 3、BCD-7段码译码器

二、常用时序电路模块的设计 1、D触发器1:基本D触发器 Module DFF(Q,D,CLK); Output Q; Input D,CLK; Reg Q;

Always@(posedge CLK) begin

Q=D; end

endmodule

2、D触发器2:带置位和清零端 Module DFF(Q,D,CLK,CLR,PRESET);

3、数据寄存器 (特点:边沿敏感) Module reg8(data_in,data_out, clk,clr); Input[7:0] data_in; Input clk,clr;

Output[7:0] data_out; Reg[7:0] data_out;

40

8’b10 : outtemp=4'b0110; 8’b100: outtemp=4'b0101; 8’b1000: outtemp=4'b0100; 8’b10000: outtemp=4'b0011; 8’b??100000: outtemp=4'b0010; 8’b?1000000: outtemp=4'b0001; 8’b10000000: outtemp=4'b0000; default: outtemp=4’b1000; endcase end

endmodule

Output Q;

Input D,CLK,CLR,PRESET; Reg Q;

Always@(posedge CLK or posedge PRESET ) begin

If(PRESET) Q=1; else if(CLR) Q=0; else Q=D; end

endmodule

Always@ (posedge clk or posedge clr) begin

if(clr) data_out=0; else data_out=data_in; end

endmodule 4、移位寄存器

Module shifter(din,clk,clr,dout); Input din,clk,clr; Output[7:0] dout; Reg[7:0] dout;

Always@(posedge clk) Begin

If(clr) dout=8’b00000000; else

begin dout=dout>>1; dout[7]=din; end end

endmodule

5、8位加法/减法计数器 module begin counter(d,clk,clear,load,up_down,q) if(!clear) cnt=8’h00; input[7:0] d; else if(load) cnt=d; input clk,clear,load,up_down; else if(up_down) cnt=cnt+1; output[7:0] q; else cnt=cnt-1; reg[7:0] cnt; end assign q=cnt; ednmodule always@(posedge clk)

问题:1、该计数器的特点?2、任意进制计数器的设计? 6、模60BCD码计数器 module count_60(qout,cout,data,load,reset,clif(qout[3:0]==9) //模10控制 k); begin output[7:0] qout; qout[3:0]=0; output cout; if(qout[7:4]==5) input[7:0] data; qout[7:4]=0; //模60控制; input load,clk,reset; else reg[7:0] qout; qout[7:4]=qout[7:4]+1; always@(posedge clk) end begin else qout[3:0]=qout[3:0]+1; if(reset) qout=0; //同步复位 end else if(load) qout=data; //同步end 置数; assign cout=(qout==8b’01011001)?1:0; else //进位控制; begin endmodule 三、有限状态机 1、状态机的概念

moor状态机:输出只与当前状态有关;mealy状态机:输出与当前状态和输入有关; 2、moor状态机的实现:用case 语句和else-if语句实现。 module input clk, reset, in; moor_fsm(clk,reset,in,state_out); output state_out;

41

reg state_out;

reg[3:0] current, next;

parameter ST1=4'b0001, ST2=4'b0010, ST3=4'b0100, ST4=4'b1000;

always@(posedge reset or posedge clk) begin

if(reset) begin state_out=0; current=ST1;end else begin case(current)

ST1:begin state_out=0;

if(in) next=ST2; else next=ST1;end ST2:begin state_out=1;

4、状态机的应用

• 实现各种计数器; • 实现各种序列发生器; • 实现序列检测; • 其它时序电路。

例1:用状态机实现模7计数器 模7计数器状态图

if(in) next=ST3; else next=ST2;end ST3:begin state_out=1;

if(in) next=ST4; else next=ST3;end ST4:begin state_out=0;

if(in) next=ST1; else next=ST4;end default: next=ST1; endcase end current=next; End

endmodule

module counter_fsm(clk,clear,co,q); input clk,clear; output co; output[3:0] q; reg co;

reg[3:0] current,next,q; parameter

ST0=0,ST1=1,ST2=2,ST3=3,ST4=4,ST5=5,ST6=6;

always@(posedge clk) begin

if(!clear) begin q=0;co=0;next=ST1;end

42

else begin case(current) ST0:begin

q=current;co=0;next=ST1;end ST1:begin

q=current;co=0;next=ST2;end ST2:begin

q=current;co=0;next=ST3;end ST3:begin

q=current;co=0;next=ST4;end ST4:begin

q=current;co=0;next=ST5;end ST5:begin

q=current;co=0;next=ST6;end end ST6:begin current=next; q=current;co=1;next=ST0;end end default: next=ST0; endmodule endcase

四、层次化设计的实现

设计思想:分析采用自上而下的方法;实现采用自下而上的方法。 层次化设计的实现方法:

• 原理图输入设计方法;

• 原理图输入与文本输入混合设计方法; • 文本输入设计方法

(一)原理图输入与文本输入混合设计方法 1、设计要点:

• 把系统细分为小的功能模块,直到划分出来的功能模块易于实现;

• 功能模块若用原理图输入设计方法方便就用原理图输入法;若用文本输入设计方

法方便就用文本输入法;

• 顶层用原理图输入设计方法比较方便。 2、文本输入设计生成Symbol的方法: 用File\\Create Default Symbol命令 层次化设计实现方法1:复制法 脉冲发生器实例

module pulse2(in,clk,out); // input in,clk; output out; reg out1,out;

pulse1 mypulse1(in,clk,out1); //调用pulse1

pulse1 mypulse2(!out1,clk,out); endmodule

module pulse1(in,clk,out); //被调用模块

input in,clk; output out; …

endmodule

43

五、利用纯Verilog HDL语言单层数字电路或系统的设计 实例1:数字跑表的设计

always@(posedge CLK or posedge CLR) //该块用于对百分秒进行计数,满100,cn1产生一个进位; always@(posedge cn1 or posedge CLR) //该块对秒进行计数,计满60,cn2产生一个进位; always@(posedge cn2 or posedge CLR) //该块对分钟进行计数,计满60,系统自动清零;

特点:1)每个块相当于一个计数器,每个计数器之间巧妙用进位信号连接起来。2)计数值分别在每个模块直接输出。

实例2:频率计的设计:用单层语言描述法 实例3:交通灯控制器 实例4:多功能数字钟

44

因篇幅问题不能全部显示,请点此查看更多更全内容

Top