一、主模块
交通灯和七段计数
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2016/05/24 14:55:05 // Design Name: // Module Name: traffic // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module traffic( input wire clk, input wire en, input wire rst, output reg [2:0] lamp, output wire [15:0] seven_seg ); reg [7:0] num ; reg temp ; reg [7:0] red_t ; reg [7:0] yellow_t; reg [7:0] green_t ; wire clkout ; reg [1:0] state; parameter [1:0] red = 2'd0, green = 2'd2 , yellow2 = 2'd3 ; always @ ( posedge clk or negedge rst) begin if( rst == 0 ) begin state <= 2'b0 ; temp <= 1'b0 ; red_t <= 8'b0010_0101; //设置灯计时器的预置数,采用BCD码 yellow_t <= 8'b0000_0101; green_t <= 8'b0010_0000; end else begin if ( en ) begin if ( !temp ) begin temp <= 1'b1; case ( state ) //交通灯状态变换 red : begin num <= red_t ; lamp <= 3'b100; state <= green; end green : begin num <= green_t ; lamp <= 3'b001; state <= yellow2 ; end yellow2 : begin num <= yellow_t ; lamp <= 3'b010; state <= red ; end default : lamp <= 3'b100 ; endcase end else begin //倒计数 if ( num >1'b1 ) if ( num [3:0] == 0 ) begin num [ 3:0 ] <= 4'b1001; num [7:4] <= num [7:4] -1 ; end else num [3:0] <= num [3:0] -1 ; if ( num == 2 ) temp <= 0 ; end end else begin lamp <= 3'b100 ; state <= red ; temp <= 0 ; end end end /************************ 数码管译码**************************************/ reg [7:0] Y_r_1; reg [7:0] Y_r_2; assign seven_seg[7:0] ={1'b1,(~Y_r_1[6:0])}; assign seven_seg[15:8] = {1'b1,(~Y_r_2[6:0])}; always @(num[3:0] ) begin Y_r_1 = 7'b1111111; case (num[3:0] ) 4'b0000: Y_r_1 = 7'b0111111; // 0 4'b0001: Y_r_1 = 7'b0000110; // 1 4'b0010: Y_r_1 = 7'b1011011; // 2 4'b0011: Y_r_1 = 7'b1001111; // 3 4'b0100: Y_r_1 = 7'b1100110; // 4 4'b0101: Y_r_1 = 7'b1101101; // 5 4'b0110: Y_r_1 = 7'b1111101; // 6 4'b0111: Y_r_1 = 7'b0000111; // 7 4'b1000: Y_r_1 = 7'b1111111; // 8 4'b1001: Y_r_1 = 7'b1101111; // 9 4'b1010: Y_r_1 = 7'b1110111; // A 4'b1011: Y_r_1 = 7'b1111100; // b 4'b1100: Y_r_1 = 7'b0111001; // c 4'b1101: Y_r_1 = 7'b1011110; // d 4'b1110: Y_r_1 = 7'b1111001; // E 4'b1111: Y_r_1 = 7'b1110001; // F default: Y_r_1 = 7'b0000000; endcase end always @( num[7:4] ) begin Y_r_2 = 7'b1111111; case ( num[7:4] ) 4'b0000: Y_r_2 = 7'b0111111; // 0 4'b0001: Y_r_2 = 7'b0000110; // 1 4'b0010: Y_r_2 = 7'b1011011; // 2 4'b0011: Y_r_2 = 7'b1001111; // 3 4'b0100: Y_r_2 = 7'b1100110; // 4 4'b0101: Y_r_2 = 7'b1101101; // 5 4'b0110: Y_r_2 = 7'b1111101; // 6 4'b0111: Y_r_2 = 7'b0000111; // 7 4'b1000: Y_r_2 = 7'b1111111; // 8 4'b1001: Y_r_2 = 7'b1101111; // 9 4'b1010: Y_r_2 = 7'b1110111; // A 4'b1011: Y_r_2 = 7'b1111100; // b 4'b1100: Y_r_2 = 7'b0111001; // c 4'b1101: Y_r_2 = 7'b1011110; // d 4'b1110: Y_r_2 = 7'b1111001; // E 4'b1111: Y_r_2 = 7'b1110001; // F default: Y_r_2 = 7'b0000000; endcase end endmodule
二、分频
clk初始时钟25MHz,分频之后1s一个脉冲
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2016/05/24 15:04:09 // Design Name: // Module Name: clk_div // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module clk_div( input wire rst, input wire clk, output reg clkout ); reg [31:0] count1; always @ ( posedge clk or negedge rst) begin if ( rst== 1'b0 ) begin clkout <= 1'b0; count1 <= 17'b0; end else begin if ( count1 >= 32'd25000000) begin clkout <= ~clkout ; count1 <=#1 17'b0; end else begin count1 <= count1 + 1; end end end endmodule
抄了好多。
但是也改了好久好久好久好久。
Vivado真特么难用,这游戏不适合我
要回归Quartus II 。