Задача 1
Да се разработи модел на хронометър с диапазон 00.0 – 99.9 секунди, с точност 100 милисекунди.
1 2 3 4 5 6 7 8 |
module chrono( input clock,reset, output reg[3:0] d0, d1, d2 ); // TODO endmodule |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
`timescale 1ns / 1ps module chrono_tb; reg clock; reg reset; wire [3:0] d0, d1, d2; chrono uut( .clock(clock), .reset(reset), .d0(d0), .d1(d1), .d2(d2) ); parameter period = 100; initial begin clock = 0; forever #(period/2) clock = ~clock; end initial begin #100; reset = 1; #period reset = 0; for( int i=0; i<10; i++) for( int j=0; j<10; j++) for( int k=0; k<10; k++) begin @(negedge clock); assert (d0 == k) else $error("d0: expected=%1d, actual=%1d",k,d0); assert (d1 == j) else $error("d1: expected=%1d, actual=%1d",j,d1); assert (d2 == i) else $error("d2: expected=%1d, actual=%1d",i,d2); end @(negedge clock); assert (d0 == 0) else $error("d0: expected=%1d, actual=%1d",1,d0); assert (d1 == 0) else $error("d1: expected=%1d, actual=%1d",1,d1); assert (d2 == 0) else $error("d2: expected=%1d, actual=%1d",1,d2); $finish; end initial begin $monitor("%1d%1d,%1d",d2,d1,d0); end endmodule |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
module top ( input clk, input reset, output [6:0] seg, output [3:0] an ); wire clock_10Hz, clock_500Hz; wire [3:0] d0, d1, d2, d3; wire [3:0] one_digit; assign d3 = 4'b1111; clk_div #(.SCALE(50000)) m1 ( .clock_in(clk), .clock_out(clock_500Hz), .reset(reset) ); clk_div #(.SCALE(25)) m2 ( .clock_in(clock_500Hz), .clock_out(clock_10Hz), .reset(reset) ); chrono m3 ( .clock(clock_10Hz), .reset(reset), .d0(d0), .d1(d1), .d2(d2) ); disp_ctrl m4 ( .clock(clock_500Hz), .reset(reset), .d0(d0), .d1(d1), .d2(d2), .d3(d3), .an(an), .dout(one_digit) ); decoder7s m5 ( .hex(one_digit), .seg(seg) ); endmodule |
Задача 2
Да се добави start/stop бутон.