elsed<=1;end
循环扫码模块如下,由于sel的变化频率和系统时钟相同,所以肉眼辨别不出来在跳动,可以通过其分别选择数码管并将个位十位百位呈现在数码管上,同时配有译码程序。
always@(sel)
begin
case(sel)
0:
a=bw;
1:
a=sw;
2:
a=gw;
default:
a=0;
endcase
case(a)
0:
SG<=8'b00111111;1:
SG<=8'b00000110;
2:
SG<=8'b01011011;3:
SG<=8'b01001111;
4:
SG<=8'b01100110;5:
SG<=8'b01101101;
6:
SG<=8'b01111101;7:
SG<=8'b00000111;
(五)实验截图
仿真时用CLK代替分频频率便于观察.总体图
Rst可以实现计数的清零。
当M为1时实现了模30的计数,同时标志位为1
当M为0时实现了模100的计数,同时标志位为1
使能信号en为0时计数保持不变
(六)实验总结
初步进行了自己设计程序和仿真一系列工作,加深了对设计过程和语句使用的理解。
进而对软硬件的操作使用都有了进一步的熟练,遇到的基础问题也能想办法去解决了,不像第一次那样手足无措了。
语法语句也大概有了了解。
三、序列信号发生和检测器设计
(一)实验目的
1、进一步熟悉EDA实验装置和QuartusⅡ软件的使用方法;
2、学习有限状态机法进行数字系统设计;
3、学习使用原理图输入法进行设计。
(二)设计要求
完成设计、仿真、调试、下载、硬件测试等环节,在EDA实验装置上实现一个串行序列信号发生器和一个序列信号检测器的功能,具体要求如下:
1、先用设计011101101100100100序列信号发生器,其最后6BIT数据用LED显示出来;
2、再设计一个序列信号检测器,检测上述序列信号,若检测到串行序列“110110”则输出为“1”,否则输出为“0”;
(三)主要仪器设备
1、微机1台
2、QuartusII集成开发软件1套
3、EDA实验装置1套
(四)实验思路
首先画出状态转移图
总体程序如下
modulexulieji2(clk,rst,en,date,SOUT);
parameters0=1,s1=2,s2=3,s3=4,s4=5,s5=6,s6=7;
inputclk,rst,en;
outputdate,SOUT;
wireSOUT;
reg[8:
0]cnt;
reg[6:
0]ST,NST;
reg[5:
0]date;
reg[16:
0]sdate;
assignSOUT=(NST==s6);
always@(posedgeclkornegedgerst)
begin
if(!
rst)begin
ST<=s0;
date<=6'b000000;
sdate<=17'b011101101100100100;
cnt<=16;end
elseif(en)begin
ST<=NST;
date[5:
1]<=date[4:
0];
date[0]<=sdate[cnt];
cnt<=cnt-1;;end
elsecnt<=0;
case(ST)
s0:
beginif(date[0]==1'b1)NST<=s1;elseNST<=s0;end
s1:
beginif(date[0]==1'b1)NST<=s2;elseNST<=s0;end
s2:
beginif(date[0]==1'b0)NST<=s3;elseNST<=s2;end
s3:
beginif(date[0]==1'b1)NST<=s4;elseNST<=s0;end
s4:
beginif(date[0]==1'b1)NST<=s5;elseNST<=s0;end
s5:
beginif(date[0]==1'b0)NST<=s6;elseNST<=s2;end
s6:
beginif(date[0]==1'b0)NST<=s0;elseNST<=s4;end
default:
NST<=s0;
endcaseend
endmodule
这里用到了状态机技术,状态机可以方便的设置程序满足什么条件然后去往什么状态,利用状态机可以实现检测到110110时的状态,同时可以在不满足时准确的调往正确的状态以便于下一步的判断。
状态机简写为FSM(FiniteStateMachine),主要分为2大类:
第一类,若输出只和状态有关而与输入无关,则称为Moore状态机;第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机。
要特别注意的是,因为Mealy状态机和输入有关,输出会受到输入的干扰,所以可能会产生毛刺(Glitch)现象,使用时应当注意。
事实上现在市面上有很多EDA工具可以很方便的将状态图的描述转换成可以综合的程序代码。
状态机可归纳为4个要素,即现态、条件、动作、次态。
这样的归纳,主要是出于对状态机的内在因果关系的考虑。
“现态”和“条件”是因,“动作”和“次态”是果。
详解如下:
①现态:
是指当前所处的状态。
②条件:
又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
③动作:
条件满足后执行的动作。
动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。
动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④次态:
条件满足后要迁往的新状态。
“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
赋值模块
parameters0=1,s1=2,s2=3,s3=4,s4=5,s5=6,s6=7;
inputclk,rst,en;
outputdate,SOUT;
wireSOUT;
reg[8:
0]cnt;
reg[6:
0]ST,NST;
reg[5:
0]date;
reg[16:
0]sdate;
assignSOUT=(NST==s6);
s1到s6为状态机的不同状态,clk为控制序列输入的信号,rst为清零信号,en为使能信号,SOUT为检测到序列110110时的输出信号1,cnt为控制哪一位数据进行检测的数,ST和NST为状态机现在的状态和下一时刻将要到来的状态,date为检测到的6为数据,sdate为输入序列,当检测到状态为s6时,通过assignSOUT=(NST==s6)可以让SOUT输出为1.
输入序列模块
always@(posedgeclkornegedgerst)
begin
if(!
rst)begin
ST<=s0;
date<=6'b000000;
sdate<=17'b011101101100100100;
cnt<=16;end
elseif(en)begin
ST<=NST;
date[5:
1]<=date[4:
0];
date[0]<=sdate[cnt];
cnt<=cnt-1;;end
elsecnt<=0;
Clk为序列输入信号,rst为清零信号,rst为低电平时将初始状态设为s0,初始6位待检测数据为000000,17位输入序列为011101101100100100,先从最高位从左往右输入,所以cnt开始时为16。
en为使能信号,当en为1时可以将下一状态NST赋予现在状态ST,同时将序列进行移位,待检测信号进行输入,同时cnt减1指向下一数据。
如果en为0,则保持现在的状态不进行工作。
状态转移模块
case(ST)
s0:
beginif(date[0]==1'b1)NST<=s1;elseNST<=s0;end
s1:
beginif(date[0]==1'b1)NST<=s2;elseNST<=s0;end
s2:
beginif(date[0]==1'b0)NST<=s3;elseNST<=s2;end
s3:
beginif(date[0]==1'b1)NST<=s4;elseNST<=s0;end
s4:
beginif(date[0]==1'b1)NST<=s5;elseNST<=s0;end
s5:
beginif(date[0]==1'b0)NST<=s6;elseNST<=s2;end
s6:
beginif(date[0]==1'b0)NST<=s0;elseNST<=s4;end
default:
NST<=s0;
endcaseend
Endmodule
通过这个状态转移语句可以正确的实现检测到110110便可使状态到达s6,即便序列为110110110时也是可以的,原理附状态转移图。
(五)时序仿真
可以清楚的看出,当检测到110110序列时sout便为1,即便是连续的110110110也可以检测出来,证明了这个程序的正确性。
(六)实验总结
要求画出状态转移图,我把书上的状态机部分仔细阅读,参考了书上的程序编写了这个程序,一开始检查的时候不符合要求,后来检查是状态转移图弄错了,修改之后进行仿真,便得到了正确的结果。
状态机在EDA的程序设计中应用广泛。
经过这次实验深刻掌握了状态机技术和状态转移图的画法,进一步激发了我对eda的兴趣。
四、交通灯控制器设计
(一)实验目的
1、学习与日常生活相关且较复杂数字系统设计;
2、进一步熟悉EDA实验装置和QuartusⅡ软件的使用方法;
3、学习二进制码到BCD码的转换;
(二)设计要求
完成设计、仿真、调试、下载、硬件测试等环节,在型EDA实验装置上实现一个由一条主干道和一条乡间公路的汇合点形成的十字交叉路口的交通灯控制器功能,具体要求如下:
1、有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;
2、交通灯由绿转红前有4秒亮黄灯的间隔时间,由红转绿没有间隔时间;
3、乡间公路右侧各埋有一个串连传感器,当有车辆准备通过乡间公路时,发出请求信号S=1,其余时间S=0;
4、平时系统停留在主干道通行(MGCR)状态,一旦S信号有效,经主道黄灯4秒(MYCR)状态后转入乡间公路通行(MRCG)状态,但要保证主干道通行大于一分钟后才能转换;
5、一旦S信号消失,系统脱离MRCG状态,即经乡道黄灯4秒(MRCY)状态进入MGCR状态,即使S信号一直有效,MRCG状态也不得长于20秒钟;
6、控制对象除红绿灯之外,还包括分别在主干道和乡间公路各有一个两位十进制倒计时数码管显示。
(三)主要仪器设备
1、微机1台
2、QuartusII集成开发软件1套
3、EDA实验装置1套
(四)实验思路
总体程序如下
程序大体分为S=1与S=0的情况,不同情况对应不同处理方法,每一次COUNTER均为0时根据S的1和0来改变数码管的计数的灯的情况,具体原理在注释中有。
modulejiaotong(S,clk,LED,COUNTER,LED1,sel);
inputclk;
regCPB;//时钟
inputS;
output[2:
0]sel;
reg[2:
0]sel;//指明乡村路口是否有汽车的通行信号
reg[3:
0]a;
output[5:
0]LED;//信号灯的显示
output[7:
0]LED1;//显示时间的十位
output[8:
0]COUNTER;//数码的显示
reg[5:
0]LED;
reg[7:
0]COUNTER;
reg[7:
0]LED1;
reg[35:
0]i;
regflag1;
regflag2;
reg[7:
0]cnt;
initial
begin
flag2='b0;
flag1='b0;
COUNTER[7:
0]='D60;
LED[5:
0]<=6'b001100;//主干道是绿灯乡村道是红灯
end
always@(posedgeclk)
begi