|
本帖最后由 springvirus 于 2022-5-1 10:41 编辑
最近搜到个开源的FPGA项目,看着心痒痒,就是牛逼哄哄的ZX-UNO !!主要还是想弄个超级阿里奥的游戏,在FPGA+自家电视上跑跑~~~
于是开始自学FPGA,一大堆对于我来说,陌生的新名词层出不穷,例如半定制化开发,SOPC builder, Avalon总线,IP核,时序约束,时序分析,JTAG烧录(这个还行,单片机也有),AS烧录。。。。
再看看ZX-UNO源码,路径ZX-UNO\zxuno-master\cores\NES\src下的代码,都是6502核相关的,比如PPU, APU, MMU,看来还得恶补下NES的相关知识
搜到个不错的网站 -》 https://www.nesdev.org/wiki/Nesdev_Wiki
正好有块远古时期的Cycone I 开发板,玩玩verilog编程,板子型号为HSNIOS1C VER4.0,主控为 EP1C6Q240
编译环境是quartus II 9.1 64-bit
先玩玩4个LED和2个数码管,记得使用pin planner,对应原理图,指定相关引脚
USB-Blaster连接JTAG
这里说一点,这块板子的AS接口没用到,用JTAG接口,既能烧SOF文件(掉电丢失),也能烧JIC文件(烧进板载的EPCS1配置芯片,掉电保存)
有个小坑,就是这里转换SOF文件到JIC文件时,记得用properities -> Compression,压缩一下,否则总提示
size of files in EPCS1 exceeds memory capacity !!!
烧录JIC成功,重启板子后,看到流水灯效果
v源码文件如下
module FPGA_EP1C6Q240_led_20220429 (
input sys_clk,
input sys_rst_n,
output reg [3:0] led,
//7 seg shumaguan segment select
output reg [7:0] seg_sel,
//7 seg shumaguan bit select
output reg [1:0] bit_sel
);
reg [23:0] counter;
reg [23:0] magic_liushui_divider_counter;
reg [7:0] magic_liushui_counter;
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
begin
magic_liushui_divider_counter <= 24'd0;
magic_liushui_counter <= 8'd0;
//seg1 and sel0 select valid.
bit_sel <= 2'd3;
end
else if(magic_liushui_divider_counter < 24'd300_0000)
begin
magic_liushui_divider_counter <= magic_liushui_divider_counter + 24'd1;
end
else if(magic_liushui_divider_counter == 24'd300_0000)
begin
magic_liushui_divider_counter <= 24'd0;
if(magic_liushui_counter < 8'd7)
magic_liushui_counter <= magic_liushui_counter + 8'd1;
else if(magic_liushui_counter == 8'd7)
magic_liushui_counter <= 8'd0;
end
end
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
begin
end
else if(magic_liushui_divider_counter == 24'd300_0000)
begin
if(magic_liushui_counter == 8'd0)
//seg a is on
seg_sel <= 8'b0000_0001;
else if(magic_liushui_counter == 8'd1)
//seg b is on
seg_sel <= 8'b0000_0010;
else if(magic_liushui_counter == 8'd2)
//seg g is on
seg_sel <= 8'b0100_0000;
else if(magic_liushui_counter == 8'd3)
//seg e is on
seg_sel <= 8'b0001_0000;
else if(magic_liushui_counter == 8'd4)
//seg d is on
seg_sel <= 8'b0000_1000;
else if(magic_liushui_counter == 8'd5)
//seg c is on
seg_sel <= 8'b0000_0100;
else if(magic_liushui_counter == 8'd6)
//seg g is on
seg_sel <= 8'b0100_0000;
else if(magic_liushui_counter == 8'd7)
//seg f is on
seg_sel <= 8'b0010_0000;
end
end
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
begin
counter <= 24'd0;
end
//24'd1000_0000
else if(counter < 24'd1000_0000)
begin
counter <= counter + 24'd1;
end
else if(counter == 24'd1000_0000)
begin
counter <= 24'd0;
end
end
//high level turn on the led, low level turn off the led
//when counter == 24'd1000_0000, level 1 left shift,
//[3:0] = 0001 -> [3:0] = 0010 -> [3:0] = 0100 -> [3:0] = 1000
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
led <= 4'b0001;
else if(counter == 24'd1000_0000)
begin
led[3:0] <= {led[2:0], led[3]};
end
else
led <= led;
end
endmodule
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|