求fpga的verilog程序

求fpga的verilog程序,第1张

always@(posedge clk)

begin

buffer<=buffer+1;

if(buffer==16'd500)

begin buffer<=0;t_clk<=~t_clk; end

end

always@(posedge t_clk)

begin

//if(reset==0) state<=2'b00;

case(state)

2'b00: begin CS<=0;WR<=0;RD<=1;state<=2'b01;read_data<=0; end

2'b01: begin

if(INTR==0) begin CS<=0;WR<=0;RD<=1;state<=2'b10;

read_data<=0;end

else state<=2'b00; end

2'b10: begin CS<=0;WR<=1;RD<=0;state<=2'b11;read_data<=1; end

2'b11: begin CS<=1;WR<=1;RD<=1;state<=2'b00;read_data<=0; end

endcase

end

always@(posedge t_clk)

begin

if(read_data==1) p<=data_in;

end

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<=agreen; LAMPA<=2; counta<=1; end //count=0 绿灯亮(LAMPA[1]=1),点亮40秒(agreen <=8'd40),40秒后转到下一状态,绿灯灭,黄灯亮(counta<=1)

1: begin numa<=ayellow; LAMPA<=4; counta<=2; end // count=1 黄灯亮(LAMPA[2]=1),点亮5秒(ayellow <=8'd5),5秒后转到下一状态,黄灯灭,左转灯亮(counta<=2)

2: begin numa<=aleft; LAMPA<=1; counta<=3; end // count=2 左转灯亮(LAMPA[0]=1),点亮15秒(aleft <=8'd15),15秒后转到下一状态,左转灯灭,黄灯亮(counta<=3)

3: begin numa<=ayellow; LAMPA<=4; counta<=4; end // count=3 黄灯亮(LAMPA[2]=1),点亮5秒(ayellow <=8'd5),5秒后转到下一状态,黄灯灭,红灯亮(counta<=4)

4: begin numa<=ared; LAMPA<=8; counta<=0; end // 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<=0; tempa<=0;

end

end

always @(posedge CLK) //该进程控制B 方向的四种灯

begin

if (EN)

begin

if(!tempb)

begin

tempb<=1;

case (countb) //控制亮灯的顺序

0: begin numb<=bred; LAMPB<=8; countb<=1; end

1: begin numb<=bgreen; LAMPB<=2; countb<=2; end

2: begin numb<=byellow; LAMPB<=4; countb<=3; end

3: begin numb<=bleft; LAMPB<=1; countb<=4; end

4: begin numb<=byellow; LAMPB<=4; countb<=0; end

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<=0; countb<=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) 以后循环

module Verilog(A,B,C,D,Y);

input [3:0] A,B,C,D;

output Y;

wire [7:0] X;

reg Y;

assign X={A,3'b0}+{B,2'b0}+{C,1'b0}+D;

always @(X)

begin

if ((X>8'h4)&&(X<=8'hf))

Y=1'b1;

else

Y=1'b0;

end

endmodule

该程序经过仿真,结果正确。

以上就是关于求fpga的verilog程序全部的内容,包括:求fpga的verilog程序、求大神用verilog HDL编写程序 :、请解释下Verilog HDL程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9682712.html

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

发表评论

登录后才能评论

评论列表(0条)

保存