verilog实验报告流水灯数码管秒表交通灯

  • 格式:doc
  • 大小:131.50 KB
  • 文档页数:9

1

流水灯

实验目的:

在basys2开发板上实现LED灯的花样流水的显示,如隔位显示,依次向左移位显示,依次向右移位显示,两边同时靠中间显示。

实验仪器:

FPGA开发板一块,计算机一台。

实验原理:

当一个正向的电流通过LED时,LED就会发光。当阳极的电压高于阴极的电压时,LED就会有电流通过。当在LED上增添一个典型值为1.5V—2.0V之间的电压时,LED就会有电流通过并发光。

实验内容:

顶层模块:输入信号:clk_50MHz(主时钟信号),rst(重置信号),输出信号:[7:0] led(LED灯控制信号)。

module led_top(clkin,rst,led_out);

input clkin, rst;

output [7:0] led_out;

wire clk_1hz;

divider_1hz d0(clkin, rst, clk_1hz);

led l0(clk_1hz, rst, led_out);

endmodule

分频模块:

module divider_1hz(clkin,rst,clkout);

input clkin,rst;

output reg clkout;

reg [24:0] cnt;

always@(posedge clkin, posedge rst)

begin

if(rst) begin

cnt<=0;

clkout<=0; end

else if(cnt==24999999) begin

cnt<=0;

clkout=!clkout; end

else cnt<=cnt+1;

end

endmodule

亮灯信号模块:

2 module led(clkin,rst,led_out);

input clkin,rst;

output [7:0] led_out;

reg [2:0] state;

always@(posedge clkin, posedge rst)

if(rst) state<=0;

else state<=state+1;

always@(state)

case(state)

3'b000:ledout<=8'b0000_0001;

3'b001:ledout<=8'b0000_0010;

3'b010:ledout<=8'b0000_0100;

3'b011:ledout<=8'b0000_1000;

3'b100:ledout<=8'b0001_0000;

3'b101:ledout<=8'b0010_0000;

3'b110:ledout<=8'b0100_0000;

3'b111:ledout<=8'b1000_0000;

endcase

endmodule

实验中存在的问题:

1 芯片选择问题

automotive spartan3E

XA3S100E XA3S250E CPG132

spartan3E

XC3S100E XC3S250E CP132

2 时序逻辑部分,阻塞赋值和非阻塞赋值混用

always@(posedge clk)

begin

a=b+c;

d<=e+f;

end

3 UCF文件格式错误

NET “CLK” LOC = “B8”;

NET “a” LOC = “N11”;

NET “b” LOC = “G13”;

NET “c[0]” LOC =“K11;

数码管

实验目的:

设计一个数码管动态扫描程序,实现在四位数码管上动态循环显示“1”、“2”“3”“4”;

实验仪器:

3 FPGA开发板一块,计算机一台。

实验原理:

实验内容:

1、数码管显示模块:输入端口dataone,datatwo,datathree,datafour,clk,rst,输出端口current_state, digit_select;

module display_scan(current_showdata, scan_current_state, rst, dataone, datatwo,

datathree, datafour, clk_scan

);

output reg [7:0] current_showdata;

output reg [3:0] scan_current_state;

input rst, clk_scan;

input [3:0] dataone, datatwo, datathree, datafour;

wire [7:0] data1,data2,data3,data4;

code_change d1(dataone,data1);

code_change d2(datatwo,data2);

code_change d3(datathree,data3);

code_change d4(datafour,data4);

parameter stateone = 4'b0111,

statetwo = 4'b1011,

statethree = 4'b1101,

statefour = 4'b1110;

always@(posedge rst or posedge clk_scan)

begin

if(rst) scan_current_state <= stateone;

else

case(scan_current_state)

stateone: begin scan_current_state <= statetwo;

4 current_showdata <= data2; end

statetwo: begin scan_current_state <= statethree;

current_showdata <= data3; end

statethree: begin scan_current_state <= statefour;

current_showdata <= data4; end

statefour: begin scan_current_state <= stateone;

current_showdata <= data1; end

default:begin scan_current_state <= stateone;

current_showdata <= data1; end

endcase

end

end

endmodule

2、译码模块

module code_change(datain, dataout);

output [7:0] dataout;

input [3:0] datain;

reg [7:0] dataout;

always@(datain)

case(datain)

1: dataout = 8'b10011111;

2: dataout = 8'b00100101;

3: dataout = 8'b00001101;

4: dataout = 8'b10011001;

5: dataout = 8'b01001001;

6: dataout = 8'b01000001;

7: dataout = 8'b00011111;

8: dataout = 8'b00000001;

9: dataout = 8'b00001001;

0: dataout = 8'b00000011;

endcase

endmodule

Verilog HDL常见错误:

1、进程赋值语句的左侧变量没有声明为寄存器变量;

2 、begin-end没有匹配

3 、写二进制数时忘了标记数基(即’b)。这样,编译器会认作十进制数

4、 inlclude和表示数基的语句使用了错误的撇号;

5 、声明语句的末尾忘了写分号

5 秒表

实验目的:

设计一个秒表,0.001s作为扫描时钟,0.01秒作为百分秒时钟。

实验仪器:

FPGA开发板一块,计算机一台。

实验原理:

把0-99的BCD码计数过程转化成BCD码计数的百分秒、分等过程。

实验内容:

分频模块 divider (0.001s作为扫描时钟,0.01秒作为百分秒时钟);

module miaobiao(mh,ml,sh,sl,msh,msl,clk,clr,pause);

output [3:0] mh,ml,sh,sl,msh,msl;

input clk,clr,pause;

reg [3:0] mh,ml,sh,sl,msh,msl;

reg cn1,cn2;

秒表计时模块 (百分秒模块 秒模块 分模块);

百分秒模块:

always@(posedge clk,posedge clr)

begin

if(clr) begin msh<=0;msl<=0;cn1<=0;end

else if(!pause)

begin

if(msl==9)

begin

msl<=0;

if(msh==9) begin msh<=0;cn1<=1;end

else msh<=msh+1;

end

else begin msl<=msl+1;cn1<=0;end

end

end

秒模块

always@(posedge cn1,posedge clr)

begin

if(clr) begin sh<=0;sl<=0;cn2<=0;end

else

begin

if(sl==9)

begin

sl<=0;

if(sh==5) begin sh<=0;cn2<=1;end

else sh<=sh+1;

end