蓝桥杯FPGA赛道第二次模拟题代码

一、顶层文件

module test(
input  wire sys_clk,
input  wire sys_rst,
input  wire [3:0]key_in,
output reg  [7:0]led,

output wire scl,
inout  wire sda,//i2c的信号

output wire [7:0]sel,
output wire [7:0]seg//数码管的驱动
);

wire [23:0] data ;
reg  [31:0] dsp_data;
reg  [23:0]	bcd;

wire S1_debounce,S1_debounce_reg;
wire S2_debounce,S2_debounce_reg;
wire S3_debounce,S3_debounce_reg;

localparam KEY1_STATE1=2'b00;//停止状态
localparam KEY1_STATE2=2'b01;//启动状态

localparam KEY2_STATE1=2'b00;
localparam KEY2_STATE2=2'b01;

reg [1:0] key1_state;//当前状态
reg [1:0] key2_state;//当前状态

//显示eeprom读取的数据
always @(posedge sys_clk or negedge sys_rst)begin
	if(!sys_rst)begin
		dsp_data <={4'd11,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10};//初始值,表示没有效数字时钟的显示
		led <=8'b11111111;
	end else begin
		if(S1_debounce_reg&&!S1_debounce)begin
	led[0]<=~led[0];
	end 
	
		bcd[7:4]<=data[7:0]/10;
		bcd[3:0]<=data[7:0]%10;
		
		bcd[11:8]<=data[15:8]%10;
		bcd[15:12]<=data[15:8]/10;
		
		bcd[19:16]<=data[23:16]%10;
		bcd[23:20]<=data[23:16]/10;
	  dsp_data<={4'd11,bcd[23:16],4'd10,bcd[15:8],4'd10,bcd[7:4]};
  end 
end 
//按键一的状态
always @(posedge sys_clk or negedge sys_rst)begin
	if(!sys_rst)begin 
	key1_state<=KEY1_STATE1;
	end else begin
	   if(S1_debounce_reg&&!S1_debounce) begin
			key1_state <= (key1_state ==KEY1_STATE1) ? KEY1_STATE2:KEY1_STATE1;
		end
	end 
end 
//检测按键二的状态
always @(posedge sys_clk or negedge sys_rst)begin
	if(!sys_rst)begin 
		key2_state<=KEY2_STATE1;
	end else begin
	   if(S2_debounce_reg&&!S2_debounce) begin
			key2_state <= (key2_state ==KEY2_STATE1) ? KEY2_STATE2:KEY2_STATE1;
		end
	end 
end

wire [23:0] rd_data;
wire  rd_data_vld;
//reg define
reg [23:0] wr_data;
reg  wr_req;
reg  rd_req=0;

//检测写入EEPROM的条件
always @(posedge sys_clk or negedge sys_rst)begin
 if(!sys_rst)begin
	wr_req<=1'b0;
 end 
    else if({key1_state==KEY1_STATE2&&(S1_debounce_reg&&!S1_debounce)}||{key1_state==KEY1_STATE1&&(S2_debounce_reg && !S2_debounce)})begin
		wr_data <=data;
	   wr_req <=1'b1;
 end 
 else 
     wr_req<=1'b0;
 end 
 
reg [3:0] state=0;
reg [15:0] debounce_couter=0;//去抖计数器
reg [15:0] debounce_couter2=0;//去抖计数器

//上电读取eeprom的数据
   always @(posedge sys_clk or negedge sys_rst)begin
	if(!sys_rst) begin
	state <=0;
	rd_req<=0;
	debounce_couter <=16'b0;
	end else begin 
		case(state)
		0:begin
		//状态0:等待读取开始
			state<=1;
		end 
	   1:begin
		//状态1;从EEprom读取数据
		 rd_req<=1;
		 if(debounce_couter<=16'hFFFF)
			debounce_couter <=debounce_couter+1;
		 else
			state <=2;
		   end
		2:begin
		//状态2:数据加载完毕
		//进一步处理逻辑
		rd_req<=0;
		debounce_couter<=16'b0;
		end 
		default:state <=0;
	 endcase
	end
end	
//eeprom module
eeprom inst_eeprom(
 .clk(sys_clk),
 .rst(sys_rst),
 .wr_req(wr_req),
 .rd_req((~key_in[2])||rd_req),//read data from EEProm
 .device_id(),
 .reg_addr(8'h03),
 .reg_addr_vld(1'b1),
 .wr_data(wr_data),
 .wr_data_vld(wr_req),
 .rd_data(rd_data),
 .rd_data_vld(rd_data_vld),
 .ready(),
 .scl(scl),
 .sda(sda)
);
//按键模块
key debounce_L1(
.sys_clk(sys_clk),
.rst(sys_rst),
.key_in(key_in[0]),
.S_debounce(S1_debounce),
.S_debounce_reg(S1_debounce_reg)
);

key debounce_L2(
.sys_clk(sys_clk),
.rst(sys_rst),
.key_in(key_in[1]),
.S_debounce(S2_debounce),
.S_debounce_reg(S2_debounce_reg)
);

key debounce_L3(
.sys_clk(sys_clk),
.rst(sys_rst),
.key_in(key_in[2]),
.S_debounce(S3_debounce),
.S_debounce_reg(S3_debounce_reg)
);
//时间计数模块
counter_time u_couter_time(
.clk(sys_clk),
.rst_n(sys_rst),
.key_in1(S1_debounce_reg &&!S1_debounce),
.key_in2(S2_debounce_reg &&!S2_debounce),
.key_in3(S3_debounce_reg &&!S3_debounce),
.rd_req(rd_req),
.rd_data(rd_data),
.din_out(data)
);
//数码管显示模块
segdisplay segdisplay_inst(
	.clk(sys_clk),
	.rst(sys_rst),
	.dsp_data(dsp_data),
	.seg(seg),
	.sel(sel)
);
endmodule 

二、数码管驱动

module segdisplay
(
	input	   wire 		      clk						,
	input 	wire 			   rst						,
	input 	wire	[31:0] 	dsp_data				,
	output 	reg 	[7:0] 	seg					,//段选端
	output 	reg 	[7:0] 	sel					//位选段
);
	
localparam [7:0] DIGIT0 =8'b1100_0000 ;//16精制C0
localparam [7:0] DIGIT1 =8'b1111_1001 ;//F9
localparam [7:0] DIGIT2 =8'b1010_0100;//A4
localparam [7:0] DIGIT3 =8'b1011_0000;//B0
localparam [7:0] DIGIT4 =8'b1001_1001;//99
localparam [7:0] DIGIT5 =8'b1001_0010;//92
localparam [7:0] DIGIT6 =8'b1000_0010;//82
localparam [7:0] DIGIT7 =8'b1111_1000;//F8
localparam [7:0] DIGIT8 =8'b1000_0000;//80
localparam [7:0] DIGIT9 =8'b1001_0000 ;//90
localparam [7:0] DIGITX =8'b1011_1111 ;//
localparam [7:0] DIGOFF =8'b1111_1111 ;//FF
localparam [7:0] DIGITC =8'hC6 ;
localparam 		DSP_COUNT = 20'
<think>好的,用户需要查找与蓝桥杯竞赛相关的FPGA模拟题或练习题以及题目解析。首先,我需要回顾用户提供的引用内容,看看是否有相关信息。引用[1]提到了蓝桥杯EDA组十三届省赛真题,虽然用户问的是FPGA,但EDA和FPGA在电子设计竞赛中可能有相关性。引用[3]提到了蓝桥杯比赛的备考指南,包括图论和算法,但未直接涉及FPGA。其他引用如[2]和[4]是关于化工自动化和起重机械的,似乎不相关。 接下来,我需要确认蓝桥杯是否有专门的FPGA组别。根据公开资料,蓝桥杯确实有EDA设计与开发组,可能涉及FPGA开发,尤其是在数字电路设计方面。因此,用户需要的FPGA练习题可能属于EDA组的一部分。 然后,我应该检查用户提供的引用中的项目地址,引用[1]的项目地址是gitcode上的开源工具包,可能包含相关真题。用户可能需要访问该链接获取具体的FPGA题目。此外,建议用户参考官方资源,如蓝桥杯官网或合作平台,因为历年真题通常会在这些地方发布。 另外,考虑到FPGA设计通常涉及硬件描述语言(如Verilog或VHDL),练习题可能包括数字电路设计、状态机实现、时序分析等。题目解析部分需要结合具体题目,分析设计思路和实现方法。 用户可能需要更多的资源,比如在线编程平台或技术社区,寻找FPGA相关的练习。例如,GitHub、优快云或电子技术论坛可能有往届参赛者分享的经验和题目解析。同时,推荐FPGA开发板的学习资料,如Xilinx或Altera的官方教程,这些内容有助于巩固基础知识。 最后,需要确保回答中的建议符合用户的需求,即直接相关的模拟题和解析,并引导用户到正确的资源获取处。同时,生成的相关问题应围绕如何获取资源、备考方法以及FPGA设计的关键知识点展开。</think>### 蓝桥杯 FPGA 相关资源与解析 根据蓝桥杯竞赛的 EDA 组真题和 FPGA 设计特点,以下是相关资源整理和分析: #### 1. **官方真题与模拟题** 蓝桥杯 EDA 组竞赛题目通常包含 FPGA 开发相关内容,例如: - **数字电路设计**:如使用 Verilog 实现计数器、状态机、数据采集系统等[^1]。 - **时序逻辑与组合逻辑**:涉及分频器设计、按键消抖、数码管动态扫描等基础模块。 - **通信协议实现**:如 UART、SPI、I²C 等接口的 FPGA 实现。 **获取途径**: - **官方资源库**:引用[1]中的项目地址(`https://gitcode.com/open-source-toolkit/a27af`)可能包含历届真题和参考设计。 - **合作平台**:蓝桥杯官网或合作教育平台(如立创EDA)会发布往届赛题和解析。 #### 2. **FPGA 练习题示例与解析 **题目示例**: 设计一个 4 位二进制计数器,要求: - 时钟频率为 50MHz; - 通过按键复位; - 输出通过 LED 显示。 **Verilog 实现**: ```verilog module counter( input clk, input rst, output reg [3:0] led ); always @(posedge clk or posedge rst) begin if (rst) led <= 4'b0000; else led <= led + 1; end endmodule ``` **解析**: - 使用时钟上升沿触发计数器递增。 - 复位信号高电平时,计数器归零。 - 频率较高时需注意按键消抖(可添加去抖动模块)[^3]。 #### 3. **关键知识点与备考建议** - **数字电路基础**:掌握组合逻辑(如译码器、编码器)和时序逻辑(如触发器、计数器)设计。 - **FPGA 开发流程**: ```mermaid graph LR A(需求分析) --> B(Verilog 编码) B --> C(仿真测试) C --> D(综合与布局布线) D --> E(下载到 FPGA 验证) ``` - **工具链熟悉**:如 Quartus Prime、Vivado 或国产工具(符合蓝桥杯 EDA 组要求)[^1]。 #### 4. **扩展学习资源** - **开源项目参考**:GitHub 搜索“蓝桥杯 FPGA”可找到往届选手的代码仓库。 - **技术社区**:电子发烧友论坛、优快云 博客中有详细题目解析和调试技巧。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值