怎样改写成三选一多路选择器的VerilogHDL 程序?

怎样改写成三选一多路选择器的VerilogHDL 程序?,第1张

//----------------------------------------------------------------------------------------

// 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) 以后循环


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7845786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存