音乐计算器的设计与实现 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA实验一
实验报告
一、实验设计思路
1、键盘输入状态机设计
控制键盘输入的电路分为5个模块:
(1)扫描信号电路
其状态转换图如下:
状态根据扫描频率自动跳转,在S0~S3状态下分别输出0001、1000、0100、0010,该电路的输出用于数码管的选通(接位选线)和键盘信号的检测(接H)。
(2)键值信号电路
该电路的功能是输出按键对应的值,按键按下时,就跳到键值相应的状态,并输出相应的值。
(3)按键信号电路
电路的状态转换图如下:
当数字按键被按下时,状态跳转到S1并输出高电平,如果不长按键,等一小段时间后,状态会自动回到S0并输出低电平。如果长按键,那么状态会停留在S1处,这样就不会重复地输出按键信号了。
(4)运算符号电路
状态转换图如下:
该电路的功能是记录运算符号,按下符号按键就跳转到相应的状态,S0为初始状态,输出为000,当按下数字键时,任何状态都会跳转回S0;S1、S2、S3、S4和S5分别为加、减、与、或和比较运算对应的状态,输出分别为001、010、011、100、101;S6为按下等号键会跳转到的状态,输出为110。
(5)控制电路
该电路的功能是选择移位寄存器、得到清零信号。当第一次输出数字是,control选通其中一个移位寄存器;当按下运算符号时,电路跳转到下一个状态,control选通另外一个移位寄存器。清零信号在按下等号键(正常规则下)或在得到运算结果后再次输入时,将移位寄存器的数据和运算符号等清空。
2、ALU运算逻辑
ALU完成高8位和低8位运算的状态转换图,实际上是Process模块的状态转换图。在设计里,ALU只要求完成8位二进制数的运算,其进位、借位的处理由Process模块执行。
状态转换图如下(Process模块程序中的S6、S7是无用的状态,这里不画出):
(1)状态含义及跳转条件:
S0为初始状态,按下数字键或等号键时,停留在S0;按下运算符号键(下称符号键)时,跳转到S1。在S1状态下,按下数字键或符号键时,停留在S1,并取最后输入的运算符号;按下等号键时,跳转到S2。在S2状态下,按下等号键停留在S2,按下数字键跳转到S1,按下符号键跳转到S5,S5是一个记录运算结果用的状态,在S5会立刻跳转到S3。S3和S4的含义和跳转条件与S1、S2类似,是进行继续运算用的状态。当Reset键被按下时,状态S1~S4都会跳转回状态S0。
(2)各状态下的数据输出:
S1状态下,输出给ALU模块的数是两个数(记为A、B)的低8位,carry_in根据运算符号设置,加法为0,减法为1。S2状态下,输出给ALU模块的数是A、B的高8位,carry_in
则取S1状态时ALU的carry_out。
对于状态S3,输出给ALU模块的数变为记录了的运算结果的低8位和新键入的数的低8位,S4则是两个数的高8位,它们的carry_in的设置与S1、S2类似。
(3)ALU的进位、借位设置:
ALU的进位、借位根据运算符号和前一步的运算结果的正负来判断,运算结果的正负用D1记录。D1的初值为0,当运算结果为非负数时,D1为0,当运算结果为负数时,D1为1。设计的ALU模块是利用补码进行运算的。
进行加法运算时,若D1为0,则运算结果的进位和正负判断作通常处理;若D1为1,则对前一步的运算结果取补码再运算,当新的运算结果的符号位为1时,carry_out为1,且carry_in 为1时,运算时将加上二进制数11111111,这其实是向高位借位(符号位为1,说明运算结果为负,所以要借位)。当高8位运算结果的符号位为1时,说明运算结果为负数。
进行减法运算时,若D1为0,则借位、结果正负的判断与进行加法运算且D1为1的情况类似,只是carry_out和carry_in的0、1值调转过来。若D1为1,则将补码相加后,在结果不为0的情况下,若符号位为0或者符号位为1但运算结果为0时,carry_out为0,其他情况carry_out为1。符号位为1、运算结果为0是指两个负数的低8位刚好加起来为-256的情况,这个时候应该是有借位的。
3、显示模块的控制逻辑
显示的功能由Process模块和Seg模块共同实现。其中,Seg模块的功能主要是将运算结果转换为十进制数,并按顺序显示该数的高位、低位。而Process模块的功能则是根据按键的情况选择要显示的数。
Process模块的状态转换图已给出,在S0状态下,显示输入的数;在S1状态下,在没有输入新数的情况下,显示原来输入的数,输入后显示新输入的数;在S2状态下,显示运算结果。对于S3、S4,显示的输出类似。
对于运算结果的显示,需要根据运算符号和运算结果的正负进行判断。比如,当前一步的结果为非负数,且进行加法运算时,直接显示运算结果;当前一步的结果为非负数,且进行减法运算时,若carry_out为1,则低8位的显示要对运算结果取补(得到原码),若取补后低8位为0,则高8位的显示要取反加一,否则直接取反。
4、特殊情况的处理
(1)输入超过3位:
在移位寄存器的D触发器中,设置了参数count,输入一次数,count加一,输入三次后,count变为3,此时触发器的输出不再变化,再输入数也不会被记入寄存器;
(2)长按键:
长按键的处理涉及到Clk_test模块的设计,在该模块中也设置了count参数,具体代码如下:always @ (posedge clks)
begin
if (H[3:0]==4'b1000)
if (V[3:0]==0)
count<=count+3'b001;
else
count<=0;