写在前面:以下仿真实验设计应用的是Xilinx Vivado。
一、题目要求
题目要求应用Verilog语言进行设计,题目内容为某控制板外接入8路数字音频脉冲信号,控制板有8个按键(K1~K8) 与这8路信号相对应,每次只允许有一个按键按下。 按键按下后,与按键相对应的输入信号被选中输出至扬声器,同时有一个LED数码管显示所按键序号,最终需提交整个工程文件以及波形图分析。
二、分析题目
首先,我们分析题目,主要要求就是一个简单的八按键检测问题,所以,我们先找到主要逻辑,即一共有八个按键,每次按键只能有一个按键按下去,这一句话的意思笔者的理解是如果按下多个按键,或者不按按键一律不输出任何东西,如果按下一个按键我们则输出相应的声音信号以及用LED输出按键序号。
三、开始设计
和上一篇文章一样,在正式设计之前,我们还是需要知道输入输出是什么,从分析题目的结果来,看我们的输入应该是按键按下去,输出即为我们需要验证的波形图,对于这一道题而言我们的输出即为声音信号以及LED按键序号,之后用数码管显示。
分析完输入输出之后,我们就要正式开始设计了,在按键进行变化时数码管的值进行改变,与此同时声音的信号进行改变,然后进行输出,废话不多说直接上代码:
always @(Button)
begin
case(Button)
8'b00000001: ButtonNum <= 4'd1;
8'b00000010: ButtonNum <= 4'd2;
8'b00000100: ButtonNum <= 4'd3;
8'b00001000: ButtonNum <= 4'd4;
8'b00010000: ButtonNum <= 4'd5;
8'b00100000: ButtonNum <= 4'd6;
8'b01000000: ButtonNum <= 4'd7;
8'b10000000: ButtonNum <= 4'd8;
default: ButtonNum <= 3'bxxx;
endcase
end
always @(ButtonNum)
begin
case(ButtonNum)
1: Display <= 7'b0110000;
2: Display <= 7'b1101101;
3: Display <= 7'b1111001;
4: Display <= 7'b0110011;
5: Display <= 7'b1011011;
6: Display <= 7'b1011111;
7: Display <= 7'b1110000;
8: Display <= 7'b1111111;
default: Display <= 7'bxxxxxxx;
endcase
Sound <= ButtonNum;
end
以上代码中Button用来表示八个按键,ButtonNum用来表示这个按键是第几个按键,sound用来表示是第几个声音信号与按键相对应,Display用来七段数码管的数字显示(笔者使用共阴数码管)就这样这个复杂的问题就设计完了。
数码管的表示在上一篇文章已经写过了,这一次就不多加说明,将以下表示附上即可。
0: 7'b1111110;
1: 7'b0110000;
2: 7'b1101101;
3: 7'b1111001;
4: 7'b0110011;
5: 7'b1011011;
6: 7'b1011111;
7: 7'b1110000;
8: 7'b1111111;
9: 7'b1111011;
逻辑设计已经结束,之后就是测试代码的书写了,此题测试代码依旧比较好写,废话不多说,测试代码如下:
`timescale 1s / 1ps
module sim_ButtonCheck();
reg[7:0] Button;
wire[3:0] ButtonNum;
wire[3:0] Sound;
wire[6:0] Display;
ButtonCheck U1(
.Button(Button),
.ButtonNum(ButtonNum),
.Sound(Sound),
.Display(Display)
);
initial Button = 8'd0;
always #5 Button = Button + 1;
endmodule
四、结果分析
对于结果分析,笔者不多做解释,直接贴上仿真实验波形图,读者自行分析即可。
1 - 4 以及其他情况的显示 5 以及其他情况的显示8 以及其他情况的显示
五、最后的话
此设计笔者未贴出整个代码以及整个傻瓜式教程,是因为笔者认为这种东西只有自己实际的做一遍才算掌握,对于这一道类型的题目,如果还有问题的话,欢迎联系笔者QQ:2428425170,查看整个工程文件。