点击获取AI摘要

一、课程设计的地位与任务

《系统设计与仿真课程设计》是电子信息、通信工程专业安排的必修的一门电子电路综合技能训练课程。通过本课程的学习,使同学们掌握常用电子元器件的应用,熟练掌握模拟集成电路、数字集成电路、单片机集成电路的设计方法与应用;理解中规模、大规模集成电路的可靠性设计的概念和方法,学会电子产品的系统设计方法,为学习智能仪器等后续课程和专业技术工作打下良好的基础。

二、课程设计的基本内容和要求

第一部分: EDA技术仿真

用Verilog HDL语言设计如下数字电路,并仿真验证:

1. 多人表决器

设计1个多人表决器,同意为1,不同意为0,同意者过半则表决通过,指示灯亮,否则指示灯灭。表决人数和描述方式自行选择。

1
2
3
4
5
6
7
8
9
10
11
12
13
module vote7(
input [7:1] vote,
output reg pass);
reg [2:0] sum;
integer i;
always@(vote)
begin sum=0;
for(i=1;i<=7;i=i+1)
if(vote[i]) sum=sum+1;
if(sum[2]) pass=1;
else pass=0;
end
endmodule

7人表决器,大于4人通过(0100)
激励文件

1
2
3
4
5
6
7
8
9
10
11
12
13
module tb_vote7();
reg [7:1] vote;
wire pass;
vote7 i1(
.pass(pass),
.vote(vote));
initial begin
vote=7'b1110001;
#50 vote=7'b1100000;
#50 vote=7'b1101101;
#50 $finish;
end
endmodule

2. 流水灯控制器

流水灯控制器包含三个输入端口:时钟端,使能端和清零端。
采用有限状态机实现流水灯控制器,控制LED灯实现多种花型.

  1. 从左到右依次逐个点亮,全灭;
  2. 从两边往中间逐个亮,全灭;
  3. 循环执行上诉过程。
  4. 学生选定题目后,查找相关资料,熟悉课程题目的方向和设计要求与具体基本指标,确定可行的方案。首先进行在仿真软件,得出正确合理的仿真结果;然后进行下载和调试,最后运行其实现的功能。在基本的功能上,学生可以自我扩展电路功能,创新设计效果,完善电路实现功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
module flow(clk,clr,led,rst);
input clk,clr,rst;
output reg [7:0] led;
integer i;
always@(posedge clk)
begin
if(!rst) begin led<=8'h00;end
if(!clr) begin led<=8'h80;i<=4'b0000;end
else
begin case(i)
4'b0000:begin led<=8'h80;i=4'b0001;end
4'b0001:begin led<=8'h40;i=4'b0010;end
4'b0010:begin led<=8'h20;i=4'b0011;end
4'b0011:begin led<=8'h10;i=4'b0100;end
4'b0100:begin led<=8'h08;i=4'b0101;end
4'b0101:begin led<=8'h04;i=4'b0110;end
4'b0110:begin led<=8'h02;i=4'b0111;end
4'b0111:begin led<=8'h01;i=4'b1000;end
4'b1000:begin led<=8'h00;i=4'b1001;end
4'b1001:begin led<=8'h81;i=4'b1010;end
4'b1010:begin led<=8'h42;i=4'b1011;end
4'b1011:begin led<=8'h24;i=4'b1100;end
4'b1100:begin led<=8'h18;i=4'b1101;end
4'b1101:begin led<=8'h00;i=4'b0000;end
endcase
end
end
endmodule

这里使用16进制表示灯的花型,使用顺序编码编号状态,状态编码也可采用格雷码等实现,花型可采用一位热码编码、约翰逊编码,8421BCD等实现
激励文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module tb_flow();
parameter DELY=20;
reg clk;
reg clr;
reg rst;
wire[7:0] led;
flow i1(
.clk(clk),
.clr(clr),
.rst(rst),
.led(led));
initial begin
clk=1'b0;
clr=1'b0;
rst=1'b1;
#(DELY*2) clr=1'b1;
end
always begin
#(DELY/2) clk=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\x7eclk;
end
endmodule

第二部分:综合设计

综合设计分二部分的内容:CPLD/FPGA仿真设计。综合题目有5个,学生可以自行选择其中一个题目进行,也可以自己拟订题目,但必须征得指导老师的同意方能进行。学生选定题目后,查找相关资料,熟悉课程题目的方向和设计要求与具体基本指标,确定可行的方案。在基本的功能上,学生可以自我扩展电路功能,创新设计效果,完善电路实现功能。

1、 基于Verilog HDL数字频率计的设计

技术要求:

  1. 频率测量范围: 10hz—1Mhz
  2. 测量分辨率: 1hz
  3. 测量误差: ±1
  4. 测量显示: 6位数码管显示
    设计任务:
  5. 说明设计具体思路。
  6. 画出系统模块框图。
  7. 画出系统顶层原理图。
  8. 按设计技术要求编写程序。
  9. 画出系统功能仿真波形图。
  10. 设计出硬件实现电路图,下载测试。
    完成课程设计报告一份。

2、 基于Verilog HDL数字交通灯的设计

技术要求:
交通灯的基本工作状态:

  1. (主干道)绿灯:车辆前行;
  2. (次干道)红灯:禁止通行;
  3. (主干道)黄灯:过渡状态;
  4. (主干道)红灯:禁止车辆通行;
  5. (次干道)绿灯:车辆前行。
    ● 注:红黄绿等均为前行方向的信号指示灯。
    设计任务:
  6. 说明设计具体思路。
  7. 画出系统模块框图。
  8. 画出系统顶层原理图。
  9. 按设计技术要求编写程序。
  10. 画出系统功能仿真波形图。
  11. 设计出硬件实现电路图,下载测试。
    完成课程设计报告一份。

3、 基于Verilog HDL数字钟的设计

技术要求:

  1. 该时钟具有校准时间、闹铃、整点报时等功能。
  2. 秒表至少有3个输入端,分别为时钟输入、校准信号、复位按键,也可以考虑一些扩展功能。
  3. 秒、分钟信号、小时采用BCD码计数方式。
    设计任务:
  4. 说明设计具体思路。
  5. 画出系统模块框图。
  6. 画出系统顶层原理图。
  7. 按设计技术要求编写程序。
  8. 画出系统功能仿真波形图。
  9. 设计出硬件实现电路图,下载测试。
    完成课程设计报告一份。

4、 基于Verilog HDL数字跑表的设计

设计任务:设计一个以0.01s为基准计时信号的实用数字式跑表
技术要求:

  1. 跑表计时显示范围0.01s-59min59.99s,计时精度为10ms。
  2. 具有清零、启动计时、暂停计时功能。
  3. 时钟源误差不超过0.01s。
    设计任务:
  4. 说明设计具体思路。
  5. 画出系统模块框图。
  6. 画出系统顶层原理图。
  7. 按设计技术要求编写程序。
  8. 画出系统功能仿真波形图。
  9. 设计出硬件实现电路图,下载测试。
    完成课程设计报告一份。

5、 基于Verilog HDL 汽车尾灯控制器的设计

设计任务:汽车尾灯控制器
技术要求:

  1. 正常行驶时,指示灯不亮;
  2. 刹车时,指示灯亮;
  3. 左转时,左侧的一盏灯闪烁,亮1s,灭1s;
  4. 右转时,右侧的一盏灯闪烁,亮1s,灭1s;
  5. 发生故障和事故时,双侧的灯都闪烁,亮0.5s,灭0.5s;
    设计任务:
  6. 说明设计具体思路。
  7. 画出系统模块框图。
  8. 画出系统顶层原理图。
  9. 按设计技术要求编写程序。
  10. 画出系统功能仿真波形图。
  11. 设计出硬件实现电路图,下载测试。
    完成课程设计报告一份。


    这里我选择的是数字跑表设计
    在完成基本功能后添加了从当前时间开始倒计时,60秒倒计时,每计时1分钟短暂蜂鸣,倒计时结束持续蜂鸣功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////

module chronograph(
input clk,pause,reset,reversal,cnt,
output reg[3:0] bai1,bai2,miao1,miao2,fen1,fen2,buzzer=0);//buzzer蜂鸣不用4位寄存器,懒得另外写了
always @(posedge clk, posedge reset)//百分秒计时
if(!reversal)
begin
if(reset)begin bai1<=0;bai2<=0; end //复位信号 //else if(pause);//begin bai1<=bai1;a<=bai1;end
else if(!pause)
begin if(bai2==9&&bai1==9) begin bai2<=0;bai1<=0;miao1<=miao1+1; end //百分秒计满后秒进位
else begin
if(bai1==9) begin bai1<=0;bai2<=bai2+1;end //百分秒第一位进位
else begin bai1<=bai1+1;end
end
end
end
else if(reversal) //倒计时
begin
if(reset)begin bai1<=0;bai2<=0; end//复位
else if(!pause&&cnt==0)//从当前时间倒计时
begin if(bai2==0&&bai1==0&&miao1>0) begin bai2<=9;bai1<=9;miao1<=miao1-1; end
else if(bai2==0&&bai1==0&&miao1==0&&miao2>0)begin miao1<=9;bai1<=9;bai2<=9;miao2<=miao2-1;end//代码有瑕疵,其实还有别的情况,但是懒得改了,功能基本完成
else begin//同正常计时的逆向
if(bai1==0&&bai2>0) begin bai1<=9;bai2<=bai2-1;end
else if(bai2==0&&bai1==0&&miao1==0);
else begin bai1<=bai1-1;end
end
end
else if(!pause&&cnt)
begin fen2<=0;fen1<=0;miao2<=6;miao1<=0;bai2<=0;bai1<=0;end
end
else if(reset)begin bai1<=0;bai2<=0; end
always @(bai1,bai2,pause,reset)//秒计时,基本和百分秒相同
if(!reversal)
begin
if(reset)begin miao1<=0;miao2<=0;end //else if(pause);//begin miao1<=miao1;end
else if(!pause)
begin if(miao2==5&&miao1>9) begin miao2<=0;miao1<=0;fen1<=fen1+1; end
else begin
if(miao1>9) begin miao1<=0;miao2<=miao2+1;end
end
if(miao1==9&&miao2==5&&bai1==9&&bai2==9) buzzer<=1;//在每次计时到59秒99时短暂蜂鸣
else buzzer<=0;
end
end
else if(reversal)
begin
if(reset)begin miao1<=0;miao2<=0;end
else if(!pause&&cnt==0)
begin if(miao2==0&&miao1==0&&(fen1>0||fen2>0)) begin miao2<=5;miao1<=9; bai2<=9;bai1<=9;fen1<=fen1-1; end
else begin
if(miao1==0&&miao2>0) begin miao1<=9;miao2<=miao2-1;end
if(miao1==0&&miao2==0&&bai1==0&&bai2==0) buzzer<=1;//倒计时结束后持续蜂鸣,可能还要加上分也等于0?
else buzzer<=0;
end
end
else if(!pause&&cnt)
begin fen2<=0;fen1<=0;miao2<=6;miao1<=0;bai2<=0;bai1<=0;end//cnt信号表示进行60秒倒计时
end
else if(reset)begin miao1<=0;miao2<=0;end
always @(miao1,miao2,pause,reset)//分计时
if(!reversal)
begin
if(reset)
begin fen1<=0;fen2<=0;end //else if(pause);//begin fen1<=fen1;end
else if(!pause)
begin if(fen2==5&&fen1>9)begin fen2<=0;fen1<=0;end
else begin
if(fen1>9)begin fen1<=0; fen2<=fen2+1;end
end
end
end
else if(reversal)
begin
if(reset)begin fen1<=0;fen2<=0;end
else if(!pause&&cnt==0)
begin if(fen1==0&&fen2>0)begin fen1<=9;miao2<=5;miao1<=9; bai2<=9;bai1<=9;fen2<=fen2-1;end
end
end
else if(!pause&&cnt)
begin fen2<=0;fen1<=0;miao2<=6;miao1<=0;bai2<=0;bai1<=0;end
else if(reset) begin fen1<=0;fen2<=0;end
endmodule

激励文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////

module tb_chronograph();
reg clk,pause,reset,reversal,cnt;
wire [3:0] bai1,bai2,miao1,miao2,fen1,fen2,buzzer;
chronograph i1(
.clk(clk),
.pause(pause),
.reset(reset),
.bai1(bai1),
.bai2(bai2),
.miao1(miao1),
.miao2(miao2),
.fen1(fen1),
.fen2(fen2),
.reversal(reversal),
.cnt(cnt),
.buzzer(buzzer)
);
initial begin
clk = 1;reset = 1;pause = 0;reversal=0;cnt=0;
#1;reset = 0;
#5;pause = \x7epause;//时延可以设置为相同,之前以为这个数字是连续的正常时间才把间隔越搞越大,实际上就是时间间隔
#10;pause = \x7epause;
#15;pause = \x7epause;
#20;pause = \x7epause;
#3000;reset=0;reversal=1;
#7000;reversal=0;
#15000;reset=0;reversal=1;cnt=1;
#15010;cnt=0;
end
always begin
#1 clk=\x7eclk;end
endmodule

仿真波形图

基础计时 重置时间和暂停功能.png

基础计时 重置时间和暂停功能

从当前时间倒计时.png

从当前时间倒计时

正常计时至59秒99时短暂蜂鸣.png

正常计时至59秒99时短暂蜂鸣

倒计时状态下计时结束持续蜂鸣.png

倒计时状态下计时结束持续蜂鸣

60秒信号停止输入且倒计时信号继续输入开始从60秒倒计时.png

60秒信号停止输入且倒计时信号继续输入开始从60秒倒计时

取消倒计时后正常计时停止蜂鸣.png

取消倒计时后正常计时停止蜂鸣

倒计时和60秒信号同时触发60秒倒计时_未设置上升沿触发导致不同步_.png

倒计时和60秒信号同时触发60秒倒计时未设置上升沿触发导致不同步

整体情况.png

整体情况

一次比较简单的课程设计,主要考察Verilog HDL的基础运用,时间原因未设计编译码模块并连接开发板测试实际效果,文章如有错误还望指出!