//----------------------------------------------------------------------------------------
// File name: Eighth_Select
// Last modified Date: 2020年5月19日10点31分
// Last Version: V1.1
// Descriptions: 8选一多路选择器设计
//----------------------------------------------------------------------------------------
module Eignth_Select(out,in0,in1,in2,in3,in4,in5,in6,in7,sel)
output out
input in0,in1,in2,in3,in4,in5,in6,in7
input[2:0] sel
reg out //输出信号,可观察输出信号波形判断仿真是否正确
always @(in0 or in1 or in2 or in3 or in4 or in5 or in6 or in7 or sel)
case(sel) //根据sel的不同选通in0,in1,in2,in3,in4,in5,in6,in7
3'b000: out=in0
3'b001: out=in1
3'b010: out=in2
3'b011: out=in3
3'b100: out=in4
3'b101: out=in5
3'b110: out=in6
3'b111: out=in7
default: out=1'bx
endcase
endmodule
典型的FPGA器件主要包含3类基本资源:可编程逻辑块(configurablelogicblock,CLB)、布线资源和可编程输入/输出模块。可编程逻辑块四周被预制的布线资源通道包围,可编程输入/输出模块分布在FPGA四周,除了上述3种资源以外,通常在FPGA中还包含块RAM、乘法器等可选资源。
在FPGA各种资源中,可编程逻辑块是实现用户功能的基本单元,每个可编程逻辑块包含1个互连开关矩阵和4个SLICEs,其中每个SLICE包括2个查找表(Look-Up-Table,LUT)、2个触发器和一些多路选择器。互连开关矩阵主要由不同长度导线和多个布线开关组成。
module canlender(a,b,option1,option2,option3,option4,led_result)inpput [9:0] a
input [9:0] b//以1023以内的加减乘除举例
input option1,option2,option3,option4//四个按键,低电有效
//数字也不是这么表达的,而是每个按键对应一个数字,后一个按下前一个还要个位变十位
//为了简化,这么写的。你自己要想明白。可综合计算器程序也不是几十行就能描述的
output led_result//显示屏上的led显示数字,只显示结果
//每一步按下数字按理也要显示,这里不赘述了
reg[19:0] result
reg a_r,b_r//锁存两个 *** 作数
reg option1_r,option2_r,option3_r,option4_r//锁存 *** 作运算,防止手指抬起时复位”1“
always
begin
a_r=a
b_r=b
end
always @(a or b or option) //如果任何一个键值按下。
begin
if(!option1_r) ///如果加法运算
result=a_r+b_r
。。。
。。。
assign led_result=result//这句是错的。只是为了直观表达连续赋值语句在led那里显示
....
endmodule
/* 信号定义与说明:CLK:为同步时钟;
EN:使能信号,为1的话,则控制器开始工作;
LAMPA:控制A方向四盏灯的亮灭其中,LAMPA0~LAMPA3,分别控制A方向的左拐灯、绿灯、黄灯和红灯;
LAMPB:控制B 方向四盏灯的亮灭其中,LAMPB0 ~ LAMPB3,分别控制B方向的
左拐灯、绿灯、黄灯和红灯;
ACOUNT: 用于A方向灯的时间显示,8位,可驱动两个数码管;
BCOUNT: 用于B方向灯的时间显示,8位,可驱动两个数码管。
module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT)
output[7:0] ACOUNT,BCOUNT
output[3:0] LAMPA,LAMPB
input CLK,EN
reg[7:0] numa,numb
reg tempa,tempb
reg[2:0] counta,countb
reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft
reg[3:0] LAMPA,LAMPB
always @(EN)
if(!EN)
begin //设置各种灯的计数器的预置数
ared <=8'd55//55 秒
ayellow <=8'd5//5 秒
agreen <=8'd40//40 秒
aleft <=8'd15//15 秒
bred <=8'd65//65 秒
byellow <=8'd5//5 秒
bleft <=8'd15//15 秒
bgreen <=8'd30//30 秒
end
assign ACOUNT=numa
assign BCOUNT=numb
always @(posedge CLK) //该进程控制A 方向的四种灯
begin
if(EN)
begin
if(!tempa) //tempa=0进入A方向状态改变模式;tempa=1,进入A方向在当前状态下的倒计时模式
begin
tempa<=1
case(counta) //控制亮灯的顺序 //状态机方式控制A方向的4盏灯,counta表示当前A方向的状态 ;
LAMPA[的4位由高到低,分别控制A方向的红灯、黄灯、绿灯、左转灯,某一位为“1”,则该位控制的灯点亮;
numa 表示某盏灯亮的时间,在计数器的预置数中可以修改该值
0: begin numa<=agreenLAMPA<=2counta<=1end //count=0 绿灯亮(LAMPA[1]=1),点亮40秒(agreen <=8'd40),40秒后转到下一状态,绿灯灭,黄灯亮(counta<=1)
1: begin numa<=ayellowLAMPA<=4counta<=2end// count=1 黄灯亮(LAMPA[2]=1),点亮5秒(ayellow <=8'd5),5秒后转到下一状态,黄灯灭,左转灯亮(counta<=2)
2: begin numa<=aleftLAMPA<=1counta<=3end // count=2 左转灯亮(LAMPA[0]=1),点亮15秒(aleft <=8'd15),15秒后转到下一状态,左转灯灭,黄灯亮(counta<=3)
3: begin numa<=ayellowLAMPA<=4counta<=4end // count=3 黄灯亮(LAMPA[2]=1),点亮5秒(ayellow <=8'd5),5秒后转到下一状态,黄灯灭,红灯亮(counta<=4)
4: begin numa<=aredLAMPA<=8counta<=0end // count=4 红灯亮(LAMPA[3]=1),点亮55秒(ared <=8'd55),55秒后转到下一状态,红灯灭,绿灯亮(counta<=0)
default: LAMPA<=8
endcase
end
else begin //倒计时 //根据当前状态,某盏灯应该点亮的时间来倒计时
if(numa>1) //判断倒计时是否结束,当前状态倒计时结束后 把tempa置0,下1秒,系统进入状态改变模式,切换到下一状态
if(numa[3:0]==0) //倒计时显示的个位为0,十位要退位
begin
numa[3:0]<=4'b1001
numa[7:4]<=numa[7:4]-1
end
else numa[3:0]<=numa[3:0]-1 //倒计时显示的个位不为0,十位保持,个位减1
if (numa==2) tempa<=0 //tempa置0后,下1秒,状态才能改变,所以要提前1秒,置tempa为0
end
end
else begin
LAMPA<=4'b1000
counta<=0tempa<=0
end
end
always @(posedge CLK) //该进程控制B 方向的四种灯
begin
if (EN)
begin
if(!tempb)
begin
tempb<=1
case (countb) //控制亮灯的顺序
0: begin numb<=bredLAMPB<=8countb<=1end
1: begin numb<=bgreenLAMPB<=2countb<=2end
2: begin numb<=byellowLAMPB<=4countb<=3end
3: begin numb<=bleftLAMPB<=1countb<=4end
4: begin numb<=byellowLAMPB<=4countb<=0end
default: LAMPB<=8
endcase
end
else
begin //倒计时
if(numb>1)
if(!numb[3:0]) begin
numb[3:0]<=9
numb[7:4]<=numb[7:4]-1
end
else numb[3:0]<=numb[3:0]-1
if(numb==2) tempb<=0
end
end
else begin
LAMPB<=4'b1000
tempb<=0countb<=0
end
end
endmodule
B方向类似A方向
整个系统:
A方向 绿灯(1s-40s) 黄灯(41s-45s) 左转(46s-60s) 黄灯(61s-65s) 红灯(66s-120s) 绿灯(121s-160s) 以后循环
B方向 红灯(1s-65s) 绿灯(66s-95s) 黄灯(96s-100s) 左转(101s-115s) 黄灯(116s-120s) 红灯(121s-185s) 以后循环
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)