电子科技大学ASIC第一次试验报告

  • 格式:docx
  • 大小:26.43 KB
  • 文档页数:5

秒表计时电路的设计报告
一、实验目的:
(1)掌握怎样设计分频器、状态机的设计
(2)掌握如何使用modelsim仿真
(3)明白实际电路实现与软件实现的区别
二、实验内容:
(1)秒表计时功能,显示分、秒、0.01秒
(2)具有启动、暂停、停止和清空功能
(3)增加有趣的流水灯
(4)输入信号:4bit按键,50MHz时钟
(5)输出信号:6位数码管
三、实验器材:
DE2开发板
四、设计思路框图
clk10ms →clk100ms →clk1s →clk10s →clk1min →clk10min →clk1h
我基本按照老师给的设计思路、但是在具体细节处理有又不同。

我采用模块化设计,顶层调用。

五、代码实现
500000分频采用五个十分频雨一个五分频的级联构成
分频代码如下:
module ddiv10(clock1,reset,pulse1);
input clock1,reset;
output pulse1;
reg pulse1;
parameter STARTCOUNT1=4'b0000,
ENDCOUNT1=4'b1001;
reg[3:0] count1;
always@(posedge clock1 or reset)
begin
if(reset)
begin
count1<=STARTCOUNT1;
pulse1<=0;
end
else if (count1==ENDCOUNT1)
begin
count1<=STARTCOUNT1;
pulse1<=1;
end
else
begin
count1<=count1+1;
pulse1<=0;
end
end
endmodule
状态机代码如下:
module FSM(clk,reset,s1,s2,y);
input clk,reset,s1,s2;
output reg[1:0] y;
reg[1:0] currentstate,nextstate; 当前状态、下一状态
parameter ST0=0,ST1=1,ST2=2; 状态分别为:初始状态、运行状态、停止状态always@(s1 or s2 or currentstate)
begin
nextstate=0;
case(currentstate)
ST0:begin
y=1;
if(s1)
nextstate=ST1;
else
nextstate=ST0;
end
ST1:begin
y=2;
if(s2)
begin
if(s1)
nextstate=ST1;
else
nextstate=ST2;
end
else
nextstate=ST1;
end
ST2:begin
y=3;
if(s1)
nextstate=ST1;
else
nextstate=ST2;
end
endcase
end
always@(posedge clk or negedge reset) begin
if(reset)
currentstate<=ST0;
else
currentstate<=nextstate;
end
endmodule
我实现暂停、开始、清零的代码:
module dddiv10(clk1,reset1,ww,pulse1,count1); input reset1,clk1;//clk2;
input [1:0]ww;
output pulse1;
reg pulse1;
reg pulse2;
reg [3:0]count2;
output [3:0] count1;
parameter STARTCOUNT1=4'b0000,
ENDCOUNT1=4'b1001;
reg[3:0] count1;
always@(posedge clk1 or negedge reset1 ) begin
if(!reset1) 清零信号
begin
count1<=0;
pulse1<=0;
end
else
begin
if(ww==2'b01)
begin
count1<=4'b0000;
pulse1<=0;
end
else if(ww==2'b10)
begin
if (count1==ENDCOUNT1)
begin
count1<=STARTCOUNT1;
pulse1<=1;
end
else
begin
count1<=count1+1;
pulse1<=0;
end
end
else
begin
count1<=count1;
end
end
end
endmodule
顶层模块:
module miaobiao(clk,reset1,s1,s2,yy);//reset1???? reset2??? S1??? S2??????? input clk,s1,s2,reset1;
output [41:0]yy;
wire pulse1,pulse2,pulse3,pulse4,pulse5,pulse6,clk1;
wire [3:0] count1,count2,count3,count4,count5,count6;
wire [1:0] w0;
wire w1,w2,w3,w4;
ddiv5 U1(clk,reset1,w1);
ddiv10 U2(w1,reset1,w2),
U3(w2,reset1,w3),
U4(w3,reset1,w4),
U5(w4,reset1,clk1);//50000 ?? 10ms
FSM U6(clk1,reset1,s1,s2,w0);//???
dddiv10 U7(clk1,reset1,w0,pulse1,count1),//10ms/div
U8(pulse1,reset1,w0,pulse2,count2),//100ms/div
U9(pulse2,reset1,w0,pulse3,count3);//1s/div
dddiv6 U10(pulse3,reset1,w0,pulse4,count4);//10s/div
dddiv10 U11(pulse4,reset1,w0,pulse5,count5); //1min/div
dddiv6 U12(pulse5,reset1,w0,pulse6,count6);
yima U13(clk1,count1,yy[6:0]),//?????
U14(clk1,count2,yy[13:7]),
U15(clk1,count3,yy[20:14]),
U16(clk1,count4,yy[27:21]),
U17(clk1,count5,yy[34:28]),
U18(clk1,count6,yy[41:35]);
endmodule
六、实验结果:
初步达到预定的目标,能实现秒表的暂停、清零、开始功能。

通过对本次实验使我对硬件和软件的各个方面的理解加深。

试验中遇到的问题:
(1)硬件实现的时候只能但边缘触发,不能在两个边缘同时触发。

(2)硬件实现的时候两个always不能同时对同一变量赋值。

这次实验中遇到的问题我争取不在下一次实验遇到
七、关于本实验的一些思考
(1)我觉得需要对自己的控制进行优化,使之更好
(2)时钟的级联太多,会造成延时很大,是秒表的精确度下降。