SOC FPGA论坛首页-ChipDebug-第11页

该帖子部分内容已隐藏
付费阅读
已售 1
3积分
此内容为付费阅读,请付费后查看
没有找到uart例子上的P52\P57引脚,它们在哪个位置呀?-ChipDebug没有找到uart例子上的P52\P57引脚,它们在哪个位置呀?-ChipDebug没有找到uart例子上的P52\P57引脚,它们在哪个位置呀?-ChipDebug
热门评论
chipdebug的头像-ChipDebugchipdebug徽章-创作大使-ChipDebug等级-LV3-ChipDebug超级版主2
实话讲,你就是想抄个作业而已,小站助人为乐,帮你抄一个 评论图片-ChipDebug

//********************************************************
//   Copyright(c)2016, STEP FPGA 
//   All rights reserved
//   File name       :   divide.v
//   Module name     :   divide
//   Author          :   STEP
//   Email           :   info@stepfpga.com
//   Data            :   2016/08/01
//   Version         :   V1.0
//   Description     :   
//
//   Modification history
//   ----------------------------------------------------------------------------
// Version       
// Description
//
//********************************************************
 
 
//*******************
//DEFINE MODULE PORT
//*******************
module divide
(
	//INPUT
	clk			,
	rst_n			,
	//OUTPUT
	clkout			
);
	//*******************
	//DEFINE PARAMETER
	//*******************
	parameter WIDTH	= 3;
	parameter N = 5;
 
	//*******************
	//DEFINE INPUT
	//*******************
	input 	clk,rst_n;     
 
    //*******************
	//DEFINE OUTPUT
	//*******************
	output	clkout;
 
	//********************
	//OUTPUT ATTRIBUTE
	//********************
	//REGS
	reg 	[WIDTH-1:0]	cnt_p,cnt_n;
	reg			clk_p,clk_n;
 
	assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;
 
	//Sequential logic style
	always @ (posedge clk)
		begin
			if(!rst_n)
				cnt_p<=0;
			else if (cnt_p==(N-1))
				cnt_p<=0;
			else cnt_p<=cnt_p+1;
		end
 
	always @ (negedge clk)
		begin
			if(!rst_n)
				cnt_n<=0;
			else if (cnt_n==(N-1))
				cnt_n<=0;
			else cnt_n<=cnt_n+1;
		end
 
	always @ (posedge clk)
		begin
			if(!rst_n)
				clk_p<=0;
			else if (cnt_p>1))  
				clk_p<=0;
			else 
				clk_p<=1;
		end
 
	always @ (negedge clk)
		begin
			if(!rst_n)
				clk_n<=0;
			else if (cnt_n>1))  
				clk_n<=0;
			else 
				clk_n<=1;
		end
endmodule     
接下来就是利用三段式状态机实现的交通灯部分:

// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name    : traffic.v
// Module name  : traffic
// Author       : STEP
// Description  : 
// Web          : www.stepfpga.com
// 
// --------------------------------------------------------------------
// Code Revision History : 
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2017/03/02   |Initial ver
// --------------------------------------------------------------------
// Module Function:简易交通灯
 
 
module traffic
(
	clk		,    //时钟
	rst_n		,    //复位
	out		     //三色led代表交通灯
);
 
	input 	clk,rst_n;     
	output	reg[5:0]	out;
 
	parameter      	S1 = 4'b00,    //状态机状态编码
			S2 = 4'b01,
			S3 = 4'b10,
			S4 = 4'b11;
 
	parameter	time_s1 = 4'd15, //计时参数
			time_s2 = 4'd3,
			time_s3 = 4'd7,
			time_s4 = 4'd3;
	//交通灯的控制
	parameter	led_s1 = 6'b101011, // LED2 绿色 LED1 红色
			led_s2 = 6'b110011, // LED2 蓝色 LED1 红色
			led_s3 = 6'b011101, // LED2 红色 LED1 绿色
			led_s4 = 6'b011110; // LED2 红色 LED1 蓝色
 
	reg 	[3:0] 	timecont;
	reg 	[1:0] 	cur_state,next_state;  //现态、次态
 
	wire			clk1h;  //1Hz时钟
 
	//产生1秒的时钟周期
	divide #(.WIDTH(32),.N(12000000)) CLK1H (
					.clk(clk),
					.rst_n(rst_n),
					.clkout(clk1h));
	//第一段 同步逻辑 描述次态到现态的转移
	always @ (posedge clk1h or negedge rst_n)
	begin
		if(!rst_n) 
			cur_state <= S1;
        else 
			cur_state <= next_state;
	end
	//第二段 组合逻辑描述状态转移的判断
	always @ (cur_state or rst_n or timecont)
	begin
		if(!rst_n) begin
		        next_state = S1;
			end
		else begin
			case(cur_state)
				S1:begin
					if(timecont==1) 
						next_state = S2;
					else 
						next_state = S1;
				end
 
                S2:begin
					if(timecont==1) 
						next_state = S3;
					else 
						next_state = S2;
				end
 
                S3:begin
					if(timecont==1) 
						next_state = S4;
					else 
						next_state = S3;
				end
 
                S4:begin
					if(timecont==1) 
						next_state = S1;
					else 
						next_state = S4;
				end
 
				default: next_state = S1;
			endcase
		end
	end
	//第三段  同步逻辑 描述次态的输出动作
	always @ (posedge clk1h or negedge rst_n)
	begin
		if(!rst_n==1) begin
			out <= led_s1;
			timecont <= time_s1;
			end 
		else begin
			case(next_state)
				S1:begin
					out <= led_s1;
					if(timecont == 1) 
						timecont <= time_s1;
					else 
						timecont <= timecont - 1;
				end
 
				S2:begin
					out <= led_s2;
					if(timecont == 1) 
						timecont <= time_s2;
					else 
						timecont <= timecont - 1;
				end
 
				S3:begin
					out <= led_s3;
					if(timecont == 1) 
						timecont <= time_s3;
					else 
						timecont <= timecont - 1;
				end
 
				S4:begin
					out <= led_s4;
					if(timecont == 1) 
						timecont <= time_s4;
					else 
						timecont <= timecont - 1;
				end
 
				default:begin
					out <= led_s1;
					end
			endcase
		end
	end
endmodule
3. 引脚分配 4路按键和4路开关,可以用来作为输入信号分别控制数码管的输出。按照下面表格定义输入输出信号 配置好以后编译下载程序。您也可以试试修改程序,观察修改代码对于FPGA内部电路所造成的影响。 4. 小结 状态机是一类很重要的时序逻辑电路,是许多数字系统的核心部件,掌握状态机的使用是利用FPGA与CPLD进行开发的一项必会技能,本小节的交通灯程序即是利用三段式状态机描述方法实现的,希望读者能够快速掌握这项技能。
该帖子部分内容已隐藏
付费阅读
已售 2
3积分
此内容为付费阅读,请付费后查看
热门评论
ICMaker的头像-ChipDebugICMaker徽章-资深玩家-ChipDebug等级-LV3-ChipDebug版主3
这个比较简单,就不专门出教程了,我给你贴代码进行说明。 我们提供的DEMO4同时提供了OSC和PLL的用法示便。 评论图片-ChipDebug 1. ELF2 器件包含一个 CMOS 环形振荡器, 环形振荡器的输出可以作为全局时钟的输入, 也可以作为 PLL的参考时钟。 环形振荡器在全局时钟路径上, 插入的可配置分频器可以对 OSC 的频率进行 1-128 任意整数分频。 可以动态配置分频系数, 不使用时可以关闭 OSC 以节省功耗。环形振荡器中心频率 287MHz, 芯片个体之间频率误差较高, 误差范围达到 30%。 即 每一片EF2之间的频率可能在这个频率附近30%范围内,但可以校准。

	EF2_PHY_OSCDIV inst(
	.rstn(1), //复位,高有效
	.stdby(0), // 休眠,高有效
	.div(7'b000_0100), //分频系数
	.clko(clko)); //出来的时钟
它有一些注意事项: 1. OSC、 OSCDIV 输出可以接 PLL, 但不能直接 Fabric, 可以通过 GCLK 连接到 Fabric。 2. ELF2系列器件不建议使用OSC+PLL的组合方式, 建议使用内部的EF2_PHY_OSCDIV (rstn, stdby, div,clko)。我们的示例工程就是这么个用法。 3. OSC 输出时钟最大偏差在 30%以内, 对时钟精度要求较高的场景不建议使用。 2. 关于PLL的例化其实没有什么要说的,其实在我们的很多demo中都有PLL的用法, PLL的端口例表如下: 评论图片-ChipDebug 比较简单的如下:

	PLL u_pll(
		.refclk  ( clk_osc    ),  
		.reset   ( ~cnt_rst[7] ), 
		.psclk   ( clk_osc    ), 
		.psdown  ( S_psdown   ),
		.psstep  ( S_psstep   ),
		.psclksel( S_psclksel ),
		.extlock (            ),
		.psdone  ( S_psdone   ),
		.clk0_out( O_clk0     ),
		.clk1_out( O_clk1     )

);
而Demo4中的PLL代码由于进行了动态调相,所以看起来相对复杂。

wire clk_osc;
wire clko;
OSC_DIV u_oscdiv(.rstn(1), .stdby(0), .div(7'b000_0100), .clko(clko)); //58.47M

EF2_LOGIC_BUFG BUFG_inst(
.o(clk_osc),
.i(clko)
);

reg [7:0] rst_cnt;
always @(posedge clk_osc) if (!rst_cnt[7]) rst_cnt <= rst_cnt + 1'b1;

wire sys_rst_n;
wire clk100m, clk50m, clk12m;
osc_pll u_osc_pll(
        .refclk(clko),
        .reset(~rst_cnt[7]),
        .stdby(0),
        .extlock(sys_rst_n),
        .clk0_out(clk100m),
        .clk1_out(clk50m),
        .clk2_out(clk12m));
相较于上面主要是下面这几个端口的区别: 评论图片-ChipDebug
该帖子内容已隐藏,请评论后查看

登录后继续评论

该帖子部分内容已隐藏
付费阅读
1积分
此内容为付费阅读,请付费后查看
该帖子部分内容已隐藏
付费阅读
已售 5
40积分
此内容为付费阅读,请付费后查看