`

试验五 计数器实验

 
阅读更多

实验内容

本次实验要设计一个计数器,并在数码管上面显示计数器的计数过程。
根据实验要求,程序大体可分为三个部分:分频部分,计数部分, 显示部分。
由于开发板提供的时钟频率是50MHz,人眼睛没法达到这个速度,四个数码管也
不好显示这么高频率计数后得到的巨大数字,所以要先对50MHz进行分频,这样才能
保证计数器每计一个数的周期在一秒左右。
计数部分由多个寄存器构成,每个时钟的上升沿,寄存器里面的数值就加一,计数
器复位数值是0000,当计满到9999的时候,计数器返回0000状态,重新开始计数。

module counter(clk,rst_n,
							 seg_en0,
							 seg_en1,
							 seg_en2,
							 seg_en3,
							 data0,
							 data1,
							 data2,
							 data3,
							 data4,
							 data5,
							 data6,
							 data7
							);
							
	input          clk,rst_n                          ;
	
	output         seg_en0,seg_en1,seg_en2,seg_en3    ;
	output         data0,data1,data2,data3            ;
	output         data4,data5,data6,data7            ;
	
	reg            seg_en0,seg_en1,seg_en2,seg_en3    ;
	reg    [24:0 ] clk_cnt                            ;
	reg    [3 :0 ] cnt0,cnt1,cnt2,cnt3                ;
	reg    [7 :0 ] data_out                           ;
	reg    [3 :0 ] state                              ;
	
	wire           data0,data1,data2,data3            ;
	wire           data4,data5,data6,data7            ;          
	wire           data_en0,data_en1,data_en2,data_en3;
	wire           clk_24,clk_15                      ;
	
	wire           cntin0 = 4'b0000                   ;
	wire           cntin1 = 4'b0000                   ;
	wire           cntin2 = 4'b0000                   ;
	wire           cntin3 = 4'b0000                   ;
	
parameter    SHOW0   =   4'b0001  ,
						 SHOW1   =   4'b0010  ,
						 SHOW2   =   4'b0100  ,
						 SHOW3   =   4'b1000  ;
	
function [7 :0 ] translater3_8 ;
	input  [3 :0 ] cnt ;
	
	begin
		case ( cnt )
			4'b0000: translater3_8 = 8'b1111_1100 ;
			4'b0001: translater3_8 = 8'b0110_0000 ;
			4'b0010: translater3_8 = 8'b1101_1010 ;
			4'b0011: translater3_8 = 8'b1111_0010 ;
			4'b0100: translater3_8 = 8'b0110_0110 ;
			4'b0101: translater3_8 = 8'b1011_0110 ;
			4'b0110: translater3_8 = 8'b1011_1110 ;
			4'b0111: translater3_8 = 8'b1110_0000 ;
			4'b1000: translater3_8 = 8'b1111_1110 ;
			4'b1001: translater3_8 = 8'b1111_0110 ;
		endcase
	end
	
endfunction
	
always @ ( posedge clk or negedge rst_n )
	if( !rst_n )
		begin
			clk_cnt <= 25'b0_0000_0000_0000_0000_0000_0000 ;
		end
	else
		begin
			clk_cnt <= clk_cnt + 25'b0_0000_0000_0000_0000_0000_0001 ;
		end
		
assign clk_24 = clk_cnt[21] ;
assign clk_15 = clk_cnt[14] ;

always @ ( posedge clk_24 or negedge rst_n )
	if( !rst_n )
		begin
			cnt0 <= cntin0 ;
			cnt1 <= cntin1 ;
			cnt2 <= cntin2 ;
			cnt3 <= cntin3 ;
		end
	else
		begin
			if( (4'b1001 == cnt3) && (4'b1001 == cnt2) && (4'b1001 == cnt1) && (4'b1001 == cnt0) )
				begin
					cnt0 <= 4'b0000 ;
					cnt1 <= 4'b0000 ;
					cnt2 <= 4'b0000 ;
					cnt3 <= 4'b0000 ;
				end
			else
				begin
					if( (4'b1001 == cnt2) && (4'b1001 == cnt1) && (4'b1001 == cnt0) )
						begin
							cnt0 <= 4'b0000 ;
							cnt1 <= 4'b0000 ;
							cnt2 <= 4'b0000 ;
							cnt3 <= cnt3 + 4'b0001 ;
						end
					else
						begin
							if( (4'b1001 == cnt1) && (4'b1001 == cnt0) )
								begin
									cnt0 <= 4'b0000 ;
									cnt1 <= 4'b0000 ;
									cnt2 <= cnt2 + 4'b0001 ;
									cnt3 <= cnt3 ;
								end
							else
								begin
									if( 4'b1001 == cnt0 )
										begin
											cnt0 <= 4'b0000 ;
											cnt1 <= cnt1 + 4'b0001 ;
											cnt2 <= cnt2 ;
											cnt3 <= cnt3 ;
										end
									else
										begin
											cnt0 <= cnt0 + 4'b0001 ;
											cnt1 <= cnt1 ;
											cnt2 <= cnt2 ;
											cnt3 <= cnt3 ;
										end
								end
						end
				end
		end

assign   data_en0  =  (cnt0||cnt1||cnt2||cnt3) ? 1'b1 : 1'b0 ; 	
assign   data_en1  =  (cnt1||cnt2||cnt3) ? 1'b1 : 1'b0 ; 	
assign   data_en2  =  (cnt2||cnt3) ? 1'b1 : 1'b0 ; 	
assign   data_en3  =  (cnt3) ? 1'b1 : 1'b0 ;
//assign   data_en0  =  cnt0 ? 1'b0 : 1'b1 ; 	
//assign   data_en1  =  cnt1 ? 1'b0 : 1'b1 ; 	
//assign   data_en2  =  cnt2 ? 1'b0 : 1'b1 ; 	
//assign   data_en3  =  cnt3 ? 1'b0 : 1'b1 ; 		
		
always @ ( posedge clk_15 or negedge rst_n )
	if( !rst_n )
		begin
			state <= SHOW0 ;
			seg_en0 <= 1'b0 ;
			seg_en1 <= 1'b0 ;
			seg_en2 <= 1'b0 ;
			seg_en3 <= 1'b0 ;
			data_out <= 8'b0000_0000 ;
		end
	else
		begin
			case( state )
				SHOW0:
					begin
						seg_en0 <= data_en0 ;
						seg_en1 <= 1'b0 ;
						seg_en2 <= 1'b0 ;
						seg_en3 <= 1'b0 ;
						data_out[7:0] <= translater3_8(cnt0) ;
						state <= SHOW1 ;
					end
				SHOW1:
					begin
						seg_en0 <= 1'b0 ;
						seg_en1 <= data_en1 ;
						seg_en2 <= 1'b0 ;
						seg_en3 <= 1'b0 ;
						data_out[7:0] <= translater3_8(cnt1) ;
						state <= SHOW2 ;
					end
				SHOW2:
					begin
						seg_en0 <= 1'b0 ;
						seg_en1 <= 1'b0 ;
						seg_en2 <= data_en2 ;
						seg_en3 <= 1'b0 ;
						data_out[7:0] <= translater3_8(cnt2) ;
						state <= SHOW3 ;
					end
				SHOW3:
					begin
						seg_en0 <= 1'b0 ;
						seg_en1 <= 1'b0 ;
						seg_en2 <= 1'b0 ;
						seg_en3 <= data_en3 ;
						data_out[7:0] <= translater3_8(cnt3) ;
						state <= SHOW0 ;
					end
				default: state <= SHOW0 ;
			endcase
		end
		
assign  data0  =  data_out[0] ;
assign  data1  =  data_out[1] ;
assign  data2  =  data_out[2] ;
assign  data3  =  data_out[3] ;
assign  data4  =  data_out[4] ;
assign  data5  =  data_out[5] ;
assign  data6  =  data_out[6] ;
assign  data7  =  data_out[7] ;
				
endmodule		
/*
module test;

	reg          clk,rst_n                          ;
	
	wire         seg_en0,seg_en1,seg_en2,seg_en3    ;
	wire         data0,data1,data2,data3            ;
	wire         data4,data5,data6,data7            ; 
	
initial
	begin
		clk = 0 ;
		rst_n = 1 ;
		#10 rst_n = 0 ;
		#10 rst_n = 1 ;
		#100000000 $stop;
	end	
	always #5 clk = ~clk ;

counter cc_coun(.clk(clk),.rst_n(rst_n),
							 .seg_en0(seg_en0),
							 .seg_en1(seg_en1),
							 .seg_en2(seg_en2),
							 .seg_en3(seg_en3),
							 .data0(data0),
							 .data1(data1),
							 .data2(data2),
							 .data3(data3),
							 .data4(data4),
							 .data5(data5),
							 .data6(data6),
							 .data7(data7)
							);
							
endmodule
*/

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics