EDA实验(Quartus Ⅱ+fpga) (二)---时序电路的设计-模可变计数器设计

前言:
本文主要介绍了EDA原理与应用这门课程的相关实验及代码。使用的软件是Quartus Ⅱ,该实验使用fpga芯片为cycloneⅤ 5CSEMA5F31C6。
(一)实验目的
(1)进一步熟悉EDA开发板和QuartusⅡ软件的使用方法。
(2)学习静态数码管的使用和7段数码显示译码器设计;
(3)掌握时钟在时序电路中的作用;
(4)掌握分频电路的实现方法。
(二)实验要求
设计模可变计数器,可任选模的大小(例模15、模115),实验要求:
(1)设置一位控制位M,要求M=0:模X计数;M=1:模Y计数;
(2)计数结果用3位数码管显示,显示BCD码;
(3)给出此项设计的仿真波形;
(4)选择实验电路验证此计数器的功能。
设置涉及2个开关和一个按键,一个开关控制改变模值,另一开关作为使能控制,按键作为异步清0。
(三)实验程序

module   CNT(
            input             rst,	  //异步置位-低电平起效
            input             en,     //使能
            input             m,      //模转换
            input             clk,   
            
            output   reg   [6:0]  SG0,      //数码管
            output   reg   [6:0]  SG1,
            output   reg   [6:0]  SG2,
            output   reg   [6:0]  cnt_count,
				output reg led
);

wire  [3:0]    bw;                          //百位
wire  [3:0]    sw;                          //十位
wire  [3:0]    gw;                          //个位

assign   bw = cnt_count / 100;
assign   sw = cnt_count % 100 / 10;
assign   gw  = cnt_count  % 10;

reg [30:0] cnt;
reg clk1;

//分频器
//仿真
always @(posedge clk)
	begin cnt=cnt+1;
		if(cnt>1)	begin clk1=1'b1; cnt=0;end
		else clk1=1'b0;
	end
//跑板子,50MHZ-49999999
/*
always @(posedge clk)
	begin cnt=cnt+1;
		if(cnt>49999999)	begin clk1=1'b1; cnt=0;end
		else clk1=1'b0;
	end
*/



//计数
always   @(negedge clk1 or negedge  rst) 
	begin
		if(!rst)
			cnt_count <= 7'd0;  
		else if (en) 
			begin 
				if(m) //m=1-120模值
					begin 
						if(cnt_count <7'd120)
							begin
								cnt_count <= cnt_count + 7'd1;
								led<=1'b0;
							end
						else
						begin
							cnt_count <= 7'd0;
							led<=1'b1;
							end
					end
				else  //m=0-20模值
					begin
						 if(cnt_count <7'd20)
						 begin
							cnt_count <= cnt_count + 7'd1;
							led<=1'b0;
							end
						else
							begin
								cnt_count <= 7'd0;    
								led<=1'b1;
							end
					end
			end
	end
//数码管显示
always  @(posedge clk1 or negedge rst) 
	begin
		if(!rst) 
			begin
				SG0 <= 7'b1000000;
				SG1 <= 7'b1000000;
				SG2 <= 7'b1000000;
			end
		else 
			begin
				case (gw)
						0:SG0<=7'b1000000; 1:SG0<=7'b1111001;
						2:SG0<=7'b0100100; 3:SG0<=7'b0110000;
						4:SG0<=7'b0011001; 5:SG0<=7'b0010010;
						6:SG0<=7'b0000010; 7:SG0<=7'b1111000;
						8:SG0<=7'b0000000; 9:SG0<=7'b0010000; 
						default: SG0<=7'b1111111;    
				endcase
				case (sw)
						0:SG1<=7'b1000000; 1:SG1<=7'b1111001;
						2:SG1<=7'b0100100; 3:SG1<=7'b0110000;
						4:SG1<=7'b0011001; 5:SG1<=7'b0010010;
						6:SG1<=7'b0000010; 7:SG1<=7'b1111000;
						8:SG1<=7'b0000000; 9:SG1<=7'b0010000; 
						default: SG1<=7'b1111111;        
				endcase
				case (bw)
						0:SG2<=7'b1000000; 1:SG2<=7'b1111001;
					default : SG2<=7'b1111111;     
				endcase
			end 
	end
endmodule

(四)管脚分配
Input
clk AF14 en AB12-S0
m AF9-S2 rst AC12-S1
Output
cnt_led1 数码管0 cnt_led3 数码管2
cnt_led2 数码管1 led Y21-led9

上一篇:vue cli加时间戳 解决更新服务器缓存问题


下一篇:运算符_算术运算符