这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » theskyofsnail的进程贴

共14条 1/2 1 2 跳转至

theskyofsnail的进程贴

助工
2012-10-10 15:30:51     打赏

 theskyofsnail的FPGA开发进程

时间 项目名称 连接位置
2012-10-10 开发板焊接调试 1楼
2012-10-16 8位数码管的动态显示 4楼
2012-10-16 8位数码管的静态显示 5楼
2012-10-22 VGA256色显示 6楼
 2012-10-22  拨码开关控制LED亮灭  7楼
 2012-11-6  作业(一)---LED篇1  8楼
 2012-11-6  作业(二)---LED篇2  9楼
 2012-11-6  作业(三)---LED篇3流水灯向左移  10楼
 2012-11-6  作业(四)---LED篇4跑马灯向左  11楼
 2012-11-6  作业(五)---LED篇5花样灯加拨码开关控制   12楼
 2012-11-6  作业(六)---数码管篇1拨码开关控制显示静态数码管  13楼
 2012-11-6  作业(七)---数码管篇2模为60的计数器,数码管动态显示  14楼
 2012-11-6  关于管脚快速、免去一一分配引脚------分配文件TCL文件的建立与使用  移步
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

 

 
我选的是方案一,只购买板子,元件自己买以及焊接,自己有常规的元件。国庆节后,板子和元件全都到了(等的好辛苦)!拆开板子的包装,黑板,排版还行!核心板能独立工作,这我非常赞赏!不过国庆时,家里台式机的希捷硬盘(希捷!)坏了,在亚马逊买了块2.5的顶着用,昨天在网上一搜,原来我这块硬盘竟然赶上了著名的希捷固件门!(咋那么多门)折腾了大半天,用了以前做的TI的MSP430F149开发板上的PL2303电路给修复好了,中途出了各种小意外!如有哪位客官不用中招,可以联系我,我搜集了至少可以用的整套资料哈,当然买的那块2.5寸硬盘理所当然买了块硬盘盒,关于硬盘盒搜集了两天,买了一,各种各种啊!需要交流的也可以联系哈。说了那么多还是开工焊接吧,给板子滚锡时才发现,过孔没有阻焊,很容易和焊盘粘连,断断续续花了两天时间把板子焊接完毕(ADC,DAC么有焊接,元件还路上,免费送的样片呵呵)。
低压上电后,发现电流不正常,当加到输入5V时,输入电流竟然有1.5A,果断不敢继续加电了,在QQ群上,咨询得到了很多人的帮助,在此非常感谢!后来仔仔细细的观察板子和电路后,发现是有源晶振焊接反了,(只耍过无源晶振的孩子伤不起),3.3V,1.5A加在了小小的晶振上,所幸没有烧坏,不过为了以后少麻烦,还是换掉了,取下来留着备用吧。
FPGA芯片我采用的EP2C8Q208,比标配的资源多一点,不过为了买这片FPGA还是在淘宝上花了些时间,多数卖家都不卖单片。

有了晶振的教训后,再仔细的检查了下,电源等一切正常后,上电,输入电流在几十ma,红色电源指示灯看着不太舒服,换了颗手机的白色LED。写了一个简单的流水灯程序下载成功!

后面又将就这个程序,改了下IO口,大致看了下其他外围电路,目前没有发现问题。


至此正式开始俺的FPGA征程吧!

 




关键词: theskyofsnail     进程    

院士
2012-10-10 16:08:37     打赏
2楼
不错,关注~~~

工程师
2012-10-10 16:19:23     打赏
3楼
板子焊得很不错,

助工
2012-10-16 11:39:07     打赏
4楼


接着上面的静态显示稍微修改了些,实现了简单的动态显示,等时间充裕,一定会改进些。
上图



代码:
module disp_seg7(clk,
   rst_n,
   seg_duan,
   seg_wei);   
input clk;  //50MHZ
input rst_n; //复位,低电平有效
output [7:0] seg_duan;
output [7:0] seg_wei;
reg[25:0] cnt_1s; //1s计数器,0-4999999
reg[2:0] duan; //段码显示
reg[2:0] wei; //位码选择

//-----------------------------
//2ms扫描定时
always @(posedge clk or negedge rst_n)
 if(!rst_n) cnt_1s <= 26'd0;
 else if(cnt_1s == 26'd99999) cnt_1s <= 26'd0;
 else cnt_1s <= cnt_1s+1'b1;
 wire done_1s = (cnt_1s == 25'd99999);
//显示数字每秒递增
always @(posedge clk or negedge rst_n)
 if(!rst_n) begin duan <= 4'd0;
   wei <= 3'd0;
   end
 else if(done_1s)
   begin duan <= duan + 1'b1;
   wei <= wei + 1'b1;
   end
//-----------------------------------------
reg[7:0] seg_duan; //段选信号
reg[7:0] seg_wei; //位选信号
always @(wei)
begin
 case(wei)
3'h0 : seg_wei = 8'hfe; //选中第0位
3'h1 : seg_wei = 8'hfd; //选中第1位
3'h2 : seg_wei = 8'hfb; //选中第2位
3'h3 : seg_wei = 8'hf7; //选中第3位
3'h4 : seg_wei = 8'hef; //选中第4位
3'h5 : seg_wei = 8'hdf; //选中第5位
3'h6 : seg_wei = 8'hbf; //选中第6位
3'h7 : seg_wei = 8'h7f; //选中第7位
 endcase
end
always @(duan)
begin   
 case (duan)
   4'h0 : seg_duan = 8'hc0;   // "0"
   4'h1 : seg_duan = 8'hf9;   // "1"
   4'h2 : seg_duan = 8'ha4;   // "2"
   4'h3 : seg_duan = 8'hb0;   // "3"
   4'h4 : seg_duan = 8'h99;   // "4"
   4'h5 : seg_duan = 8'h92;   // "5"
   4'h6 : seg_duan = 8'h82;   // "6"
   4'h7 : seg_duan = 8'hf8;   // "7"
   4'h8 : seg_duan = 8'h80;   // "8"
   4'h9 : seg_duan = 8'h90;   // "9"
   4'ha : seg_duan = 8'h88;   // "a"
   4'hb : seg_duan = 8'h83;   // "b"
   4'hc : seg_duan = 8'hc6;   // "c"
   4'hd : seg_duan = 8'ha1;   // "d"
   4'he : seg_duan = 8'h86;   // "e"
   4'hf : seg_duan = 8'h8e;   // "f"
 endcase
end

endmodule


助工
2012-10-22 11:56:34     打赏
5楼


PS:此贴是16号编辑的,当时没发对,今天更改一下
今天焊接的数码管,所为了调试一下数码管电路,就先编写了数码管的程序,结果数码管竟然有坏的一段,哎……人品哟!本来想花哨点,但小弟水平有限,花哨点很费时间(脑袋笨,不能灵活运用),代码有不成熟的地方还望不要笑话我。(PS:元件已经全部焊接完毕,冒充还是学生向TI求助了些元件,呵呵……再次感谢TI)
上图
有位数码管的一段为坏滴,这个不会扣分吧?


详细代码:
module seg_7(clk,
   rst_n,
   seg_duan,
   seg_wei);   
input clk;  //50MHZ
input rst_n; //复位,低电平有效
output [7:0] seg_duan;
output [7:0] seg_wei;
reg[25:0] cnt_1s; //1s计数器,0-4999999
reg[3:0] duan; //段码显示
reg[2:0] wei; //位码选择

//-----------------------------
//1S定时计数
always @(posedge clk or negedge rst_n)
 if(!rst_n) cnt_1s <= 26'd0;
 else if(cnt_1s == 26'd49999999) cnt_1s <= 26'd0;
 else cnt_1s <= cnt_1s+1'b1;
 wire done_1s = (cnt_1s == 25'd24_999_999);
//显示数字每秒递增
always @(posedge clk or negedge rst_n)
 if(!rst_n) duan <= 4'd0;
  wei <= 3'd0;
 else if(done_1s) duan <= duan + 1'b1;
  wei <= wei + 1'b1;
//-----------------------------------------
reg[7:0] seg_duan; //段选信号
reg[7:0] seg_wei; //位选信号
always @(wei)
begin
 case(wei)
3'h0 : seg_wei = 8'h
always @(duan)
begin   
 case (duan)
   4'h0 : seg_duan = 8'hc0;   // "0"
   4'h1 : seg_duan = 8'hf9;   // "1"
   4'h2 : seg_duan = 8'ha4;   // "2"
   4'h3 : seg_duan = 8'hb0;   // "3"
   4'h4 : seg_duan = 8'h99;   // "4"
   4'h5 : seg_duan = 8'h92;   // "5"
   4'h6 : seg_duan = 8'h82;   // "6"
   4'h7 : seg_duan = 8'hf8;   // "7"
   4'h8 : seg_duan = 8'h80;   // "8"
   4'h9 : seg_duan = 8'h90;   // "9"
   4'ha : seg_duan = 8'h88;   // "a"
   4'hb : seg_duan = 8'h83;   // "b"
   4'hc : seg_duan = 8'hc6;   // "c"
   4'hd : seg_duan = 8'ha1;   // "d"
   4'he : seg_duan = 8'h86;   // "e"
   4'hf : seg_duan = 8'h8e;   // "f"
 endcase
end

endmodule



助工
2012-10-22 12:13:02     打赏
6楼

此程序参考了众多例程序,搞腾了两天时间才完工(本人愚钝,请勿见笑),程序修改了无数次,经历了20多个版本,因为多数例子都是显示的8色,16色之类的,所以在256色显示上,本人走了太多的弯路,感慨万千,一下是我所做过的弯路实现的功能吧。
 



 
 
 

以上是两天内的各种版本的缩影,还参照了51FPGA的部分程序,以下是最终的版本,实现了256色的显示,虽然我自己看着也不像256色,但是程序上讲,是实现的,色差可能与分压电阻有关系。
程序代码如下:
module vga(
   clk,rst_n,
   hsync,vsync,
   vga_r,vga_g,vga_b
  ); input clk;  //50MHz
input rst_n; //低电平复位
output hsync; //行同步信号
output vsync; //场同步信号
output[2:0] vga_r;
output[2:0] vga_g;
output[1:0] vga_b; //--------------------------------------------------
reg[10:0] x_cnt; //行坐标
reg[9:0] y_cnt; //列坐标 always @ (posedge clk or negedge rst_n)
 if(!rst_n) x_cnt <= 11'd0;
 else if(x_cnt == 11'd1039) x_cnt <= 11'd0;
 else x_cnt <= x_cnt+1'b1; always @ (posedge clk or negedge rst_n)
 if(!rst_n) y_cnt <= 10'd0;
 else if(y_cnt == 10'd665) y_cnt <= 10'd0;
 else if(x_cnt == 11'd1039) y_cnt <= y_cnt+1'b1; //--------------------------------------------------
wire valid; //有效显示区标志 assign valid = (x_cnt >= 11'd187) && (x_cnt < 11'd987)
     && (y_cnt >= 10'd31) && (y_cnt < 10'd631); wire[9:0] x_dis,y_dis; //有效显示区坐标 assign x_dis = x_cnt-11'd187;
assign y_dis = y_cnt-10'd31; //--------------------------------------------------
reg hsync_r,vsync_r; //同步信号产生 always @ (posedge clk or negedge rst_n)
 if(!rst_n) hsync_r <= 1'b1;
 else if(x_cnt == 11'd0) hsync_r <= 1'b0; //产生hsync信号
 else if(x_cnt == 11'd120) hsync_r <= 1'b1;
 
always @ (posedge clk or negedge rst_n)
 if(!rst_n) vsync_r <= 1'b1;
 else if(y_cnt == 10'd0) vsync_r <= 1'b0; //产生vsync信号
 else if(y_cnt == 10'd6) vsync_r <= 1'b1; assign hsync = hsync_r;
assign vsync = vsync_r;
//--------------------------------------------------
 // VGA色彩信号产生
/*
一共800*600个像素点,需要显示256种颜色;
大约每块区域显示50*38
*/
 
reg[7:0] vga_rgb; // VGA色彩显示寄存器 always @ (posedge clk)
 if(!valid) vga_rgb <= 8'd0;
 else begin
  case(x_dis)
   10'd0: begin  //当x坐标回到0时,让显示色彩数据根据当前的y坐标值重新复位
     if(y_dis >= 10'd0 && y_dis < 10'd38) vga_rgb <= 8'd0;
     else if(y_dis >= 10'd38 && y_dis < 10'd76) vga_rgb <= 8'd16;
     else if(y_dis >= 10'd76 && y_dis < 10'd114) vga_rgb <= 8'd32;
     else if(y_dis >= 10'd114 && y_dis < 10'd152) vga_rgb <= 8'd48;
     else if(y_dis >= 10'd152 && y_dis < 10'd190) vga_rgb <= 8'd64;
     else if(y_dis >= 10'd228 && y_dis < 10'd266) vga_rgb <= 8'd80;
     else if(y_dis >= 10'd266 && y_dis < 10'd304) vga_rgb <= 8'd96;
     else if(y_dis >= 10'd304 && y_dis < 10'd342) vga_rgb <= 8'd112;
     else if(y_dis >= 10'd342 && y_dis < 10'd380) vga_rgb <= 8'd128;
     else if(y_dis >= 10'd418 && y_dis < 10'd456) vga_rgb <= 8'd144;
     else if(y_dis >= 10'd456 && y_dis < 10'd494) vga_rgb <= 8'd160;
     else if(y_dis >= 10'd494 && y_dis < 10'd532) vga_rgb <= 8'd176;
     else if(y_dis >= 10'd532 && y_dis < 10'd570) vga_rgb <= 8'd192;
     else if(y_dis >= 10'd570 && y_dis < 10'd608) vga_rgb <= 8'd208;
     else if(y_dis >= 10'd608 && y_dis < 10'd644) vga_rgb <= 8'd224;
     else vga_rgb <= 8'd240;
    end
   10'd50,10'd100,10'd150,10'd200,10'd250,10'd300,10'd350,10'd400,10'd450,10'd500,
   10'd550,10'd600,10'd650,10'd700,10'd750,10'd800: vga_rgb <= vga_rgb+1'b1; //每40个横坐标像素点后显示色彩数据增1变化
  default: ;
  endcase
 end  //r,g,b控制液晶屏颜色显示
assign vga_r = vga_rgb[7:5];
assign vga_g = vga_rgb[4:2];
assign vga_b = vga_rgb[1:0]; endmodule

助工
2012-10-22 17:15:24     打赏
7楼
很搞笑的是这个程序我竟然想了很久,偶然上厕所时才想通,原来它是如此的简单,哎……新手就是这样,把简单的问题超复杂化。
当然除了程序本身的问题,编译过程中,也遇到了问题,就是第108脚始终无法定义(我用的是EP2CQ208C8,用EP2C5Q208的童鞋可能也会遇到)查datasheet也无果。

 
51FPGA的一句话提醒了俺,虽然么有说具体怎么做,此管脚需要配置一下,具体配置方法如下: 对altera的EP2CQ208进行设计,在跑工程时,发现有个管脚,一直提示error,

基本意思是该管脚被两个信号驱动, 其中一个信号并不是我所定义的信号,而是芯片内部的信号:

如下:

Error: Can't place multiple pins assigned to pin location Pin_W20 (IOC_X65_Y2_N2)
        Info: Pin EA[7] is assigned to pin location Pin_W20 (IOC_X65_Y2_N2)
        Info: Pin ~LVDS150p/nCEO~ is assigned to pin location Pin_W20 (IOC_X65_Y2_N2)


我在这里把处理的方法写上:

在QII中的Assignments----Device----Device and pin option-----(选项卡)Dual purpose pin

将nCE0 的设置改为: use as regular  IO 
//-----------------------------------------------------------------------------
效果图片如下:


视频:

视频地址:http://union.bokecc.com/flash/player.swf?vid=16B77E64FE9C2936&siteid=290666218ACBA694&playerid=EEA982EE6B20F4D1&playertype=1

程序代码如下:
module led_control(clk,rst_n,LED,SW);
input clk;  //50MHz
input rst_n; //低电平复位
input[7:0] SW;   // 按键接口
output[7:0] LED;  // LED等接口 //--------------------------------
reg[7:0] value;
always @(posedge clk or negedge rst_n)
if(!rst_n) value <= 8'hff;
 else value = SW;
 
assign LED = value;
endmodule

助工
2012-11-06 11:58:26     打赏
8楼
程序代码如下(就是照着敲,哈哈)
module led(clk,
   rst_n,
   led_out);
input clk;
input rst_n;
output[7:0] led_out;
assign led_out=8'hfe;
endmodule

助工
2012-11-06 12:00:57     打赏
9楼
好久没上论坛了,电脑被老板拿走了,这是客观原因,主管原因是懒咯,代码如下(也是照着敲,哈哈)
module led_flicker(clk,
     rst_n,
     led_out);
input clk; // 50MHZ
input rst_n; //系统复位,低电平有效
output [7:0] led_out; //输出8位LED
reg [7:0] led_out; 
reg [24:0] delay;
//-----------------------------
always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   delay <= 25'd0;
  else
   begin
    if(delay == 25'd24999999)
     delay <= 25'd0;
    else
     delay <= delay + 1'b1;
    end
  end
//-----------------------------------
always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   led_out <= 8'hff;
  else
  begin
   if(delay == 25'd24999999)
    led_out <= ~led_out;
    else
    led_out <= led_out;
  end
 end
 endmodule

助工
2012-11-06 12:03:39     打赏
10楼

作业(三)---LED篇3流水灯向左移,改一下就行了,
视频如下:


视频地址:http://union.bokecc.com/flash/player.swf?vid=D93C888FA1C0E08E&siteid=290666218ACBA694&playerid=EEA982EE6B20F4D1&playertype=1
代码如下
module led_water(clk,
    rst_n,
    led_out);
input clk; //50MHZ
input rst_n; //系统复位,电平有效
output led_out; //8位led输出

reg[7:0] led_out;
reg[24:0] delay;
//--------------------------------
always@(posedge clk or negedge rst_n)
  if(!rst_n)
   delay <= 25'd0;
else begin
 if(delay == 25'd24999999)
  delay <= 25'd0;
 else
  delay<=delay+1'b1;
 end
//----------------------------------
always@(posedge clk or negedge rst_n)
 if(!rst_n)
 led_out<=8'hff;
 else
  begin
   if(delay==25'd24999999)
    begin
     led_out<=led_out>>1;
     if(led_out==8'b0)
      led_out<=8'hff;
    end
    else led_out<=led_out;
  end
endmodule


共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]