数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2592|回复: 19

[ARM] 玩玩远古FPGA-Cyclone I系列 EP1C6Q240

[复制链接]
发表于 2022-4-30 11:43:07 | 显示全部楼层 |阅读模式
本帖最后由 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

打赏

参与人数 1家元 +10 收起 理由
jf201006 + 10 謝謝分享

查看全部打赏

 楼主| 发表于 2022-5-6 08:28:08 | 显示全部楼层
devcang 发表于 2022-5-5 16:04
手头有差不多的,找不到老版本的开发环境了,新版的太大了。

稍等,我上传到网盘,给你链接
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-6 08:38:35 | 显示全部楼层
devcang 发表于 2022-5-5 16:04
手头有差不多的,找不到老版本的开发环境了,新版的太大了。

发站内消息给你了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-10 08:27:22 | 显示全部楼层
bg4iww 发表于 2022-5-9 15:38
那个ZX-UNO我按照GitHub上的开源资料打了板都焊接完成了,可就是没研究出来应该如何往里烧录固件 ...

看了GITHUB上的ZX UNO,相关说明资料很少,源码目录有cores和firmware,前者是FPGA的源码,后者里面有不少汇编程序,但是看原理图又只有FPGA的片子,也没搞懂汇编跑在哪个片子里,难道类似于SOPC builder + NIOS ii,这样的架构吗
正在结合miSTer(另一款开源平台)的源码一起看,在Cyclone上自搭一套NES的系统
miSTer的源码结构相对清晰,比如有顶层的v文件和sv文件

https://github.com/zxdos/zxuno

https://github.com/MiSTer-devel/Main_MiSTer/wiki
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-28 17:39:00 | 显示全部楼层
bh4qix 发表于 2024-3-27 11:52
楼主还在继续 FPGA 吗?

感觉FPGA有些难度,暂时放一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-2 17:46 , Processed in 0.247014 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表