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