verilog课程设计交通灯
『壹』 数字电路verilog HDL语言设计交通灯控制器
mole LIGHT_CTRL(
clk , //sys clk 24mhz
rst_n , //n_reset
road_a_grn , //Road A Green
road_a_red , //Road A Red
road_b_grn , //Road B Green
road_b_red //Road B Red
);
//Input PIN
input clk ; //sys clk 24mhz
input rst_n ; //n_reset
//Output PIN
output road_a_grn ; //Road A Green
output road_a_red ; //Road A Red
output road_b_grn ; //Road B Green
output road_b_red ; //Road B Red
//Register And Wire
//1sec pulse
wire n_1s_cnt_end ;
wire n_500ms_pls ;
reg [31:0] r_cnt ;
//light ctrl state(1sec pls transition)
reg [2:0] r_state ;
//second cnt
reg [4:0] r_sec_cnt ;
//second cnt
reg r_blk_flg ;
//light output
wire n_road_a_grn ;
wire n_road_a_red ;
wire n_road_b_grn ;
wire n_road_b_red ;
reg road_a_grn ;
reg road_a_red ;
reg road_b_grn ;
reg road_b_red ;
//***RTL***
//1sec pulse and 500ms pulse
assign n_1s_cnt_end = (r_cnt == 32'h016E_35FF)? 1'b1 : 1'b0; //when cnt=23999999,1s pulse
assign n_500ms_pls = (r_cnt == 32'h00B7_1AFF)? 1'b1 : 1'b0; //when cnt=11999999,500ms pulse
always @(posedge clk or negedge rst_n) begin
if (~) begin
r_cnt <= 32'h0000_0000;
end
else begin
if(n_1s_cnt_end == 1'b1)
r_cnt <= 32'h0000_0000;
else
r_cnt <= r_cnt + 1'b1;
end
end
//light ctrl state(1sec pls transition)
//1st 24sec:00
//1st 3sec :10
//2nd 3sec :11
//others :goto 00
always @(posedge clk or negedge rst_n) begin
if (~rst) begin
r_state <= 3'b000;
end
else begin
if(n_1s_cnt_end == 1'b1)
if((r_state[1:0] == 2'b00) && (r_sec_cnt == 5'b1_0111)
r_state <= {r_state[2],2'b10};
else if((r_state[1:0] == 2'b10) && (r_sec_cnt == 5'b0_0010)
r_state <= {r_state[2],2'b11};
else if((r_state[1:0] == 2'b11) && (r_sec_cnt == 5'b0_0010)
r_state <= {~r_state[2],2'b00};
else if(r_state[1:0] == 2'b01)
r_state <= 3'b000;
else
r_state <= r_state;
else
r_state <= r_state;
end
end
................................
做完了 你确认了 我把程序发给你qq
『贰』 急!verilog编写的交通灯
建议使用三段状态机描述,可以避免毛刺的出现,代码如下(已经编译通过)
mole traffic(clk,rst,b,L0,L1,L2,L3);
input clk,rst,b;
output L0,L1,L2,L3;
reg l0,l1,l2,l3;
parameter S0 = 2'b00;
parameter S1 = 2'b01;
parameter S2 = 2'b10;
parameter S3 = 2'b11;
reg [1:0] counter;
reg [1:0] cs,ns;
reg b_req;
always@(posedge clk or posedge rst) begin
if(rst) b_req <= 1'b0;
else if(b)
b_req <= 1'b1;
end
always@(posedge clk or posedge rst)begin
if(rst)begin
counter <= 2'b0;
end
else begin
counter <= counter + 1'b1;
end
end
always@(posedge clk or posedge rst)begin
if(rst) begin
cs <= S0;
end
else begin
cs <= ns;
end
end
always@(b or b_req or cs or rst or counter)
begin
ns = 2'bx;
case(cs)
S0: begin
if(counter == 2'b11)begin
if(b_req) ns = S2;
else ns = S1;
end
else
ns = S0;
end
S1: begin
if(counter == 2'b11)begin
if(b_req) ns = S3;
else ns = S0;
end
else
ns = S1;
end
S2: begin
if(counter == 2'b11)
ns = S1;
else
ns = S2;
end
S3: begin
if(counter == 2'b11)
ns = S0;
else
ns = S3;
end
default:;
endcase
end
always@(posedge clk or posedge rst)begin
if(rst)begin
l0 <= 1'b0;
l1 <= 1'b0;
l2 <= 1'b0;
l3 <= 1'b0;
end
else begin
case(ns)
S0: begin
b_req <= 1'b0;
l0 <= 1'b1;
l1 <= 1'b0;
l2 <= 1'b0;
l3 <= 1'b1;
end
S1: begin
b_req <= 1'b0;
l0 <= 1'b0;
l1 <= 1'b1;
l2 <= 1'b1;
l3 <= 1'b0;
end
S2: begin
l0 <= 1'b0;
l1 <= 1'b1;
l2 <= 1'b0;
l3 <= 1'b1;
end
S3: begin
l0 <= 1'b0;
l1 <= 1'b1;
l2 <= 1'b0;
l3 <= 1'b1;
end
default:;
endcase
end
end
assign L0 = l0;
assign L1 = l1;
assign L2 = l2;
assign L3 = l3;
endmole
不知道reset的要求,随便写了一个reset
别的应该问题不大,可能3秒还是4秒会有点问题
水平有限,请指正
『叁』 用Verilog设计一个交通灯,程序已经写好。就是不知道把各个模块连接起来。
如果有多个模块的话写个顶层模块,通过例化调用每个子模块就好了;
『肆』 verilog语言设计交通灯的问题
我们将问题分解为2部分,来自同步时钟域信号的处理和来自异步时钟域信号的处理。前者要简单许多,所以先讨论前者,再讨论后者。
1.同步时钟域信号的处理
一般来说,在全同步设计中,如果信号来自同一时钟域,各模块的输入不需要寄存。只要满足建立时间,保持时间的约束,可以保证在时钟上升沿到来时,输入信号已经稳定,可以采样得到正确的值。但是如果模块需要使用输入信号的跳变沿(比如帧同步信号),千万不要直接这样哦。
always @ (posedge inputs)
begin
...
end
因为这个时钟inputs很有问题。如果begin ... end语句段涉及到多个D触发器,你无法保证这些触发器时钟输入的跳变沿到达的时刻处于同一时刻(准确的说是相差在一个很小的可接受的范围)。因此,如果写出这样的语句,EDA工具多半会报clock skew > data delay,造成建立/保持时间的冲突。本人曾经也写出过这样的语句,当时是为了做分频,受大二学的数字电路的影响,直接拿计数器的输出做了后面模块的时钟。当初用的开发工具是max+plusII,编译也通过了,烧到板子上跑倒也能跑起来(估计是因为时钟频率较低,6M:lol:),但后来拿到 QuartusII中编译就报clock skew > data delay。大家可能会说分频电路很常见的啊,分频输出该怎么用呢。我一直用的方法是采用边沿检测电路,用HDL语言描述大概是这样:
always @ (posedge Clk)
begin
inputs_reg <= inputs;
if (inputs_reg == 1'b0 && inputs == 1'b1)
begin
...
end
...
end
这是上跳沿检测的电路,下跳沿电路大家依此类推。
2.异步时钟域信号的处理
这个问题也得分单一信号和总线信号来讨论。
2.1单一信号(如控制信号)的处理
如果这个输入信号来自异步时钟域(比如FPGA芯片外部的输入),一般采用同步器进行同步。最基本的结构是两个紧密相连的触发器,第一拍将输入信号同步化,同步化后的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少(注意是减少)亚稳态带来的影响。这种最基本的结构叫做电平同步器。
如果我们需要用跳变沿而不是电平又该怎样处理呢,还记得1里面讲的边沿检测电路么?在电平同步器之后再加一级触发器,用第二级触发器的输出和第三级触发器的输出来进行操作。这种结构叫做边沿同步器。
always @ (posedge Clk)
begin
inputs_reg1 <= inputs;
inputs_reg2 <= inputs_reg1;
inputs_reg3 <= inputs_reg2;
if (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0)
begin
...
end
...
end
以上两种同步器在慢时钟域信号同步入快时钟域时工作的很好,但是反过来的话,可能就工作不正常了。举一个很简单的例子,如果被同步的信号脉冲只有一个快时钟周期宽,且位于慢时钟的两个相邻跳变沿之间,那么是采不到的。这时就需要采用脉冲同步器。这种同步器也是由3个触发器组成,同时需要对发送信号做一些处理,具体结构大家可以在网上搜。
2.2总线信号的处理
如果简单的对异步时钟域过来的一组信号分别用同步器的话,那么对这一组信号整体而言,亚稳态出现的几率将大大上升。基于这一观点,对于总线信号的处理可以有两种方式。
如果这组信号只是顺序变化的话(如存储器的地址),可以将其转换为格雷码后再发送,由于格雷码相邻码字只相差一个比特,上面说的同步器可以很好的发挥作用。
但是如果信号的变化是随机的(如存储器的数据),这种方法便失效了,这时可以采用握手的方式或者采用FIFO或DPRAM进行缓存。RAM缓存的方式在突发数据传输中优势比较明显,现在高档一点的FPGA中都有不少的BlockRAM资源,且支持配置为DPRAM或FIFO,这种处理方法在通信电路中非常常用。
『伍』 verilog语言交通灯实验
这个可以的,有硬件平台吗?
懂事电子设计 vgz
『陆』 我在做数电的课设,设计交通灯,用verilog写,关于黄灯闪烁的部分怎么解决谢谢
hi 兄弟,
黄灯闪烁其实就是,灯亮一阵子,灯在暗一阵子.
以下是流程
我不知道你时专钟多快,我就属假设 1M Hz.
a. 用8 bit计数器,每次都算到 249 (0.25sec),
b. 将计数计重置 (设回8'b0)
c. 然后把黄灯 = ~黄灯;
还看不懂再说,这电路不难的.
『柒』 用Verilog设计交通灯
交通灯控制器
/* 信号定义与说明:
CLK: 为同步时钟;
EN: 使能信号,为1 的话,则控制器开始工作;
LAMPA: 控制A 方向四盏灯的亮灭;其中,LAMPA0~LAMPA3,分别控制A 方向的
左拐灯、绿灯、黄灯和红灯;
LAMPB: 控制B 方向四盏灯的亮灭;其中,LAMPB0 ~ LAMPB3,分别控制B 方向的
左拐灯、绿灯、黄灯和红灯;
ACOUNT: 用于A 方向灯的时间显示,8 位,可驱动两个数码管;
BCOUNT: 用于B 方向灯的时间显示,8 位,可驱动两个数码管。*/
mole 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)
begin
tempa<=1;
case(counta) //控制亮灯的顺序
0: begin numa<=agreen; LAMPA<=2; counta<=1; end
1: begin numa<=ayellow; LAMPA<=4; counta<=2; end
2: begin numa<=aleft; LAMPA<=1; counta<=3; end
3: begin numa<=ayellow; LAMPA<=4; counta<=4; end
4: begin numa<=ared; LAMPA<=8; counta<=0; end
default: LAMPA<=8;
endcase
end
else begin //倒计时
if(numa>1)
if(numa[3:0]==0) begin
numa[3:0]<=4'b1001;
numa[7:4]<=numa[7:4]-1;
end
else numa[3:0]<=numa[3:0]-1;
if (numa==2) 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
endmole
『捌』 verilog交通灯设计修改
//定义输出变量初始值
red1= 1′回b0; yellow1= 1′b0; green1= 1′b0;
red2= 1′b0; yellow2= 1′b0; green2= 1′b0;
这部分需要用答
if(reset)
begin
red1= 1′b0; yellow1= 1′b0; green1= 1′b0;
red2= 1′b0; yellow2= 1′b0; green2= 1′b0;
end
else....
『玖』 verilog HDL交通灯设计中各模块的原理及作用
traffic(clk,urgency,east_west,south_north,led);
input clk;
input urgency;
output [7:0]east_west,south_north;
output [5:0]led;
reg [7:0]east_west,south_north;
reg [5:0]led;
initial begin
east_west<=8'b0;
south_north<=8'b0;
led<=6'b100001;end
always @(posedge clk)
begin if(urgency==1) led<=6'b100100;
else if(east_west==8'b0 && south_north==8'b0) begin
east_west<=8'b00101101;
south_north<=8'b00101000;
led<=6'b100001;end
else if(east_west==8'b00000110 && south_north==8'b1) begin
east_west<=8'b00000101;
south_north<=8'b00000101;
led<=6'b100010; end
else if(east_west==8'b1 && south_north==8'b1 && led[5]==1'b1) begin
east_west<=8'b00101000;
south_north<=8'b00101101;
led<=6'b001100; end
else if(east_west==8'b1 && south_north==8'b00000110) begin
east_west<=8'b00000101;
south_north<=8'b00000101;
led<=6'b010100;end
else if(east_west==8'b1 && south_north==8'b1 && led[2]==1'b1) begin
east_west<=8'b00101101;
south_north<=8'b00101000;
led<=6'b100001; end
else if(east_west[3:0]==4'b0000) begin
east_west<=east_west-8'b111;
south_north<=south_north-1'b1; end
else if(south_north[3:0]==4'b0000) begin
east_west<=east_west-1'b1;
south_north<=south_north-8'b111; end
else begin
east_west<=east_west-1'b1;
south_north<=south_north-1'b1;
end
end
endmole
自己前段时间写的简单交通灯控制模块。定义了两个输入,三个输出。两个输入分别是时钟信号和紧急情况信号。输出信号分别是南北,东西,以及led灯信号。具体实现方式是先给紧急情况下定义个状态,然后通过计数器来实现各个状态的改变。