至芯科技ZX-2开发板测评-ideal夜星海
至芯科技ZX-2开发板测评首先非常感谢,至芯给我们提供这一次非常宝贵的机会,感谢至芯给大家提供这么好的一个学习和交流平台,感谢所有至芯的老师.
能拿到这个板子对我来说 十分意外,在此我非常的感谢,至芯的王建飞学长,和李老师. 感谢他们二位到我们学校的访谈,而使我有机会接触到这个 急需学习的开发板
学习历程:
我是先接触的单片机,而后才学习的FPGA, 刚开始对FPGA的影响 就是高端神秘不可控制 ,后来慢慢发现其实就是数电...而又比数电有意思多了 , 于是我抱着 单片机能做的 我用FPGA能做的更好,更快! 慢慢的喜欢上了FPGA
测试人:陕西省安康学院11电信系电子信息工程专业2班 贺鹏
联系方式: QQ 125553253
测试概述:
学习单片机,,我当时遇到最难的设计 也许就是电子时钟了(当时真的挺麻烦) , 于是这次我抱着 挑战自己的目的..试着用ZX-2 来设计
首先介绍一下我平台环境:
X64 位LINUX (ubuntu14.04)
quartus ii 13.1
语言: Verilog HDL
设计目标 :电子表
实现正常记时可以随时设置 时 分 秒 的时间 (以实现)....并准备逐步实现...闹钟预制...整点报时 ...秒表 等功能
下面附上实际图片 9566
通过测试...我把时间调成北京时间...过了一个1个晚上..第二天起来发现..误差不超过3秒 ...由此我个人 这款板子的 时钟非常可靠 非常稳定(当然这还需要进一步的用示波器去测试(限于时间并为来的及)
实现方法 :
我先将50MCLK降成 1HZ 2HZ 4HZ6250HZ 1HZ用来正常计时 2HZ和4HZ测试 和调时闪烁 6250HZ用来 扫描数码管 和 按键
然后 通过 各个always块 并行工作 顺利实现
测试 :这次遇到的最大问题: 就是 同一个变量无法 多个always 块中赋值 ..而使 调时功能难以实现..不
为了 方便大家 查看 我将所以模块都写在一个顶层文件中 下面附上我的源码:(本人也是刚接触的新手,,代码写的不好 注释也不详细..希望大家海涵,有好的意见挺提出来哦, 另外希望广结一些喜欢设计 喜欢编程的人)
我的电子表 设计还在继续 感兴趣的朋友可以联系 我大家一起交流和学习
module ceshi1(
clk0,
duanx,
s,
weix
);
input clk0;
input s;
output duanx;
output weix;
/*分频电路*/
reg clk1hz=1;
reg clk2hz=1;
reg clk4hz=1;
reg clkx=1;
reg tmp1hz=1;
reg tmp2hz=1;
reg tmp4hz=1;
reg tmpx=1; // xian shi pin lv
always @ (posedge clk0)
begin
tmp1hz <=tmp1hz+1'b1;
tmp2hz <=tmp2hz+1'b1;
tmp4hz <=tmp4hz+1'b1;
tmpx <=tmpx+1'b1;
////////////////////////////
if(tmp1hz==25'd25_000_000)
begin
tmp1hz <=1;
clk1hz=~clk1hz;
end
///////////////////////////////
if(tmp2hz==25'd12_500_000)
begin
tmp2hz <=1;
clk2hz=~clk2hz;
end
//////////////////////////////
if(tmp4hz==25'd6_250_000)
begin
tmp4hz <=1;
clk4hz=~clk4hz;
end
/////////////////////////////////
if(tmpx==25'd4000)
begin
tmpx <=1;
clkx=~clkx;
end
////////////////////////////
end //fenpin kuai jie shu
/******fen pin jie shu*************/
/////////////////////////////////////////////////
////////////////////////////////////////////////////
/***********************************************/
/* kongzhi dian lu */
reg weix=3'b101;
reg i=0; //ji shu qi
reg shi1=0; // ge wei
reg shi2=0; //shi wei
reg fen1=0;
reg fen2=0;
reg miao1=0;
reg miao2=0;
////////////////////////
always @ (posedge clkx)
begin
weix <=weix-1'b1;
if(weix== 3'b000) weix <=3'b101;else;
end
always @ (weix)
case (weix)
3'b101 :if(x==3) i <= 4'd12;else i <= miao1;
3'b100 :if(x==3) i <= 4'd12;else i <= miao2;
3'b011 :if(x==2) i <= 4'd12;else i <= fen1;
3'b010 :if(x==2) i <= 4'd12;else i <= fen2;
3'b001 :if(x==1) i <= 4'd12;else i <= shi1;
3'b000 :if(x==1) i <= 4'd12;else i <= shi2;
endcase
wire clky1;
wire clky2;
wire clky3;
assign clky3 =(kz==0&&shanshuo==3)? s+s:clkjs ; //miao
assign clky2 =(kz==0&&shanshuo==2)? s+s:miao_clk ; //fen
assign clky1 =(kz==0&&shanshuo==1)? s+s:fen_clk ; // shi
////////////////miao ji shi///////////////////////////
reg miao_clk=1;
always @ (posedge clky3)
begin
if(kz==0&&shanshuo==3) begin miao1<=b1; miao2<=b2; end
if(kz!=0&&shanshuo==0)
begin
miao1 <=miao1+1'b1;
if(miao1==4'd9)
begin
miao1 <=0;
miao2 <=miao2+1'b1;
end
if(miao2==5&&miao1==9)
begin
miao_clk=~miao_clk;
miao1<=0;
miao2<=0;
end
end
if(miao2==2&&miao1==9)miao_clk=~miao_clk;
end
///////////////////////////////////////////
////////////////fen ji shi///////////////////////////
reg fen_clk=1;
always @ (posedge clky2)
begin
if(kz==0&&shanshuo==2) begin fen1<=b1; fen2<=b2; end
if(kz!=0&&shanshuo==0)
begin
fen1 <=fen1+1'b1;
if(fen1==4'd9)
begin
fen1 <=0;
fen2 <=fen2+1'b1;
end
if(fen2==5&&fen1==9)
begin
fen_clk=~fen_clk;
fen1<=0;
fen2<=0;
end
end
if(fen2==2&&fen1==9)fen_clk=~fen_clk;
end
////////////////////////////////////////////////////
////////////////shi ji shi///////////////////////////
reg shi_clk=0;
always @ (posedge clky1)
begin
if(kz==0&&shanshuo==1) begin shi1<=b1; shi2<=b2; end
if(kz!=0&&shanshuo==0)
begin
shi1 <=shi1+1'b1;
if(shi1==4'd9)
begin
shi1 <=0;
shi2 <=shi2+1'b1;
end
if(shi2==2&&shi1==3)
begin
// shi_clk=~shi_clk;
shi1<=0;
shi2<=0;
end
end
//if(shi2==2&&shi1==9)shi_clk=~shi_clk;
end
///////////////////////////////////////////////////
/* ce shi mo kuai */
reg clkjs=1; // ji shide clk = 1hz
reg tmpcs=0; //ce shi
reg kz=1;
always @ (posedge clk0)
begin
if(kz!=0)
begin
tmpcs <=tmpcs+1'b1;
if(tmpcs==25'd25_000_000)
begin
tmpcs <=1;
clkjs=~clkjs;
end
end
end
reg b1,b2; // linshigewei shi wei
reg shanshuo=0;
always @ (posedge clk4hz)
begin
if(s==0)
begin
kz<=0;
if(shanshuo==3)shanshuo<=shanshuo+2;else shanshuo<=shanshuo+1;
end
case (shanshuo)
0 : ;
1 : begin b1 <=shi1;b2<=shi2; end
2 : begin b1 <=fen1;b2<=fen2; end
3 : begin b1 <=miao1;b2<=miao2; end
endcase
if(kz==0&&s==0)
begin
b1 <=b1+1;
if(b1==9) begin b2<=b2+1; b1<=0; end
if(b2==5&&b1==9) begin b2<=0;b1<=0; end
end
if(kz==0&&s==0)
begin
b1 <=b1-1;
if(b1==0) begin b2<=b2-1; b1<=9; end
if(b2==0&&b1==0) begin b2<=5; b1<=9; end
end
if(s==0) begin kz<=1; shanshuo <=0;end
end
reg temp=0;
reg x=0;
regjsq=0;
always @ (posedge clk4hz)
begin
jsq<=jsq+1;
temp <= shanshuo;
x<=0;
if(jsq==1) x<=temp;
end
/*-------------------------------------------------*/
/* yi ma qi */
reg duanx = 8'b1000_0000;
always @(i)
case (i)
4'd0 :duanx=8'b1100_0000;
4'd1 :duanx=8'b1111_1001;
4'd2 :duanx=8'b1010_0100;
4'd3 :duanx=8'b1011_0000;
4'd4 :duanx=8'b1001_1001;
4'd5 :duanx=8'b1001_0010;
4'd6 :duanx=8'b1000_0010;
4'd7 :duanx=8'b1111_1000;
4'd8 :duanx=8'b1000_0000;
4'd9 :duanx=8'b1001_0000;
default:duanx=8'b1111_1111;
endcase
endmodule 哦 对了 忘了附引脚配置了
to,location
clk0,pin_23
s,pin_69
s,pin_70
s,pin_71
s,pin_72
weix,pin_119
weix,pin_115
weix,pin_114
duanx,pin_127
duanx,pin_128
duanx,pin_124
duanx,pin_121
duanx,pin_120
duanx,pin_126
duanx,pin_129
duanx,pin_125 同一个变量不能同时在几个always块里面赋值是语法规定的不可逾越,这不应该成为设计中的难题!想要实现一个设计的方法很多,可以试着变换自己实现的思路。而且一个成功的设计都是由易到难的一个过程,建议先实现时、分、秒的计数,然后可以设计时,然后设置分。最后设置秒,之后再逐步的加入其它如闹铃等功能。要学会把一个复杂的东西简单化.
页:
[1]