最新日志

发表于:2008-6-26 21:09:17
标签:无标签

0

基于VHDL的数字钟设计

基本功能: 实现24小时制的计时,整点报时,小时和分钟可调.

8位数码管显示,12位显示小时,3位显示一杠,45显示分钟,6显示一杠,78显示秒.

调时的时候数码管随着时钟明暗闪烁.

 

这个是考试前的一段时间的EDA实验的设计性实验,因为要准备考试的事,没多少时间做更好的处理,所以没有做按键去抖动的部分处理.

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY szz2 IS

 


PORT( clk,SZm,szh,SCLK,sansuo:IN STD_LOGIC;
      CLEAR:IN STD_LOGIC;
      spk:OUT STD_LOGIC;
      Q:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
      SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END ;
--SCLK is the counter's driver
--SZm and szh is connect to two switch , which control the adjust of minter and hour
--clk is the driver of the led_7 's refresh


ARCHITECTURE behav OF szz2 IS
SIGNAL SELI:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL P,PL1,PL2,PL3,PH1,PH2,PH3:std_logic_vector(3 downto 0);
SIGNAL MCLK,HCLK,CLKM,CLKH,sanfen,sanshi:STD_LOGIC;
BEGIN
P_JISHU1:PROCESS (SCLK,CLEAR)
       VARIABLE tmpl,tmph :std_logic_vector(3 downto 0);
        BEGIN
           IF CLEAR='1' THEN
              tmpl:="0000";
              tmph:="0000";
      ELSIF (SCLK'EVENT AND SCLK = '1')  THEN 
            if (tmpl="1001") then
                    tmpl:="0000";                  
             if(tmph="0101") then
                      tmph:="0000"; MCLK<='1';               
                 else                  
                     tmph:=tmph+1;
                 end if;
                 else
                    tmpl:=tmpl+1; MCLK<='0';
                 end if;
           end IF;
        PL1<= tmpL;
        PH1<=tmph;                                                                           
        END  PROCESS P_JISHU1;
P_JISHU2:PROCESS (CLKM,CLEAR,SZm,SCLK,MCLK)
       VARIABLE tmpl,tmph:std_logic_vector(3 downto 0);
       BEGIN
      IF (SZm='1') THEN   CLKM<=SCLK;sanfen<='1';
         ELSE CLKM<=MCLK;sanfen<='0';
     END IF;
           IF (CLEAR='1') THEN
              tmpl:="0000";
              tmph:="0000";
      ELSIF (CLKM'EVENT AND CLKM = '1') THEN
            if (tmpl="1001") then
                    tmpl:="0000";                  
             if(tmph="0101") then
                      tmph:="0000"; HCLK<='1';               
                 else                  
                     tmph:=tmph+1;
                 end if;
                 else
                    tmpl:=tmpl+1; HCLK<='0';
                 end if;
           end IF;
        PL2<= tmpL;
        PH2<=tmph;                                                                           
        END  PROCESS P_JISHU2;
P_JISHU3:PROCESS (CLKH,CLEAR,SZh,SCLK,HCLK)
       VARIABLE tmpl,tmph :std_logic_vector(3 downto 0);
         
 BEGIN  
      IF SZh='1' THEN   CLKH<=SCLK;sanshi<='1';
 ELSE CLKH<=HCLK ;sanshi<='0';
 END IF;
           IF CLEAR='1' THEN
              tmpl:="0000";
              tmph:="0000";
      ELSIF (CLKH'EVENT AND CLKH = '1')  THEN
            if (tmpl="0011" and tmph="0010" ) or (tmpl="1001")then
                    tmpl:="0000";                  
             if(tmph="0010") then
                      tmph:="0000";               
                 else                  
                     tmph:=tmph+1;
                 end if;

                 else
                    tmpl:=tmpl+1;
                 end if;
           end IF;
        PL3<= tmpL;
        PH3<=tmph;                                                                           
        END  PROCESS P_JISHU3;
P_SEL:PROCESS(CLK,CLEAR,SELI)--clk is driver the led_7 's refresh
      BEGIN
      IF CLEAR='1' THEN SELI<="000";
      ELSIF CLK'EVENT AND CLK='1' THEN
      IF (SELI="111") THEN SELI<="000";
      ELSE
      SELI<=SELI+1;
      END IF;
      END IF;
      SEL<=SELI;
END PROCESS P_SEL;
P_XUANZE:PROCESS(SELI,PL1,PH1,PL2,PH2,PL3,PH3)
         BEGIN
         CASE SELI IS
         WHEN "000"=>p<=PL1;
         WHEN "001"=>p<=PH1;
WHEN "010"=>p<="1010";
        


WHEN "011"=>if (sanfen='1') then
if(sansuo= '1') then p<=PL2;
else p<="1011";
END IF;
else p<=PL2;
END IF;
          WHEN "100"=>if (sanfen='1') then
if(sansuo= '1') then p<=PH2;
else p<="1011";
END IF;
else p<=PH2;
END IF;

WHEN "110"=>if (sanshi='1') then
if(sansuo= '1') then p<=PL3;
else p<="1011";
END IF;
else p<=PL3;
END IF;
          WHEN "111"=>if (sanshi='1') then
if(sansuo= '1') then p<=PH3;
else p<="1011";
END IF;
else p<=PH3;
END IF;

 


WHEN "101"=>p<="1010";
        -- WHEN "110"=>p<=PL3;
        -- WHEN "111"=>p<=PH3;

 


         WHEN OTHERS=>NULL;
         END CASE;
         END PROCESS P_XUANZE;
P_XIAN:PROCESS(P)
       BEGIN
       CASE P IS
       WHEN  "0000" => Q<="0111111";
       WHEN  "0001" => Q<="0000110";
       WHEN  "0010" => Q<="1011011";
       WHEN  "0011" => Q<="1001111";
       WHEN  "0100" => Q<="1100110";
       WHEN  "0101" => Q<="1101101";
       WHEN  "0110" => Q<="1111101";
       WHEN  "0111" => Q<="0000111";
       WHEN  "1000" => Q<="1111111";
       WHEN  "1001" => Q<="1101111";
 WHEN  "1011" => Q<="0000000";
WHEN  "1010" => Q<="1000000";
       WHEN OTHERS => NULL ;
       END CASE;
END PROCESS P_XIAN;
PROCESS(ph2,pl2)
BEGIN
IF(ph2="0000" and pl2="0000") THEN
spk<='1';
ELSE spk<='0';
END IF ;
END PROCESS;
  END  behav ;

 


 

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(79)
发表于:2008-5-15 11:20:00
标签:无标签

0

电子

点击下载

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(113)
发表于:2008-4-25 16:02:20
标签:无标签

1

等精度数字频率计

最近在做课程设计,题目是等精度的数字频率计,我们队用FPGA和51单片机结合的1602液晶显示的方法,终于实现了,等精度就是等精度,误差比纯单片机实现的频率计好太多了,由于实验室的信号源只有3MHZ的产生信号,我们暂时只能测试了3M左右,精度达到千分之一,按原理来看应该至少可以测到<50MHZ的.现在先将FPGA部分的程序贴出来.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity pinlvji is

 port(
   bclk : in std_logic;
   tclk : in std_logic;
   clr  : in std_logic;
   cl   : in std_logic;
   spul : in std_logic;
   start: out std_logic;
   eend : out std_logic;
   sel  : in std_logic_vector(2 downto 0);
   data : out std_logic_vector(7 downto 0));
 end pinlvji;
 
architecture behav of pinlvji is

 signal bzq,tsq : std_logic_vector(31 downto 0);
 signal ena,pul : std_logic;
 signal ma,clk1,clk2,clk3 :std_logic;
 signal q1,q2,q3,bena :std_logic;
 signal ss : std_logic_vector(1 downto 0);

   begin
 start <= ena;
 data  <=bzq(7 downto 0)  when sel="000"  else
    bzq(15 downto 8)  when sel="001"  else
    bzq(23 downto 16)  when sel="010"  else
    bzq(31 downto 24)  when sel="011"  else
    tsq(7 downto 0)    when sel="100"  else
    tsq(15 downto 8)   when sel="101"  else
    tsq(23 downto 16)  when sel="110"  else
    tsq(31 downto 24)  when sel="111"  else
    tsq(31 downto 24);
  
 bzh : process(bclk,clr)
   begin
    if clr='1' then bzq<=(others=>'0');
    elsif bclk'event and bclk='1'  then
     if bena ='1' then bzq<=bzq+1;
     end if;
    end if;
   end process;
 
 tf : process(tclk,clr,ena)
   begin
    if clr='1' then tsq<=(others=>'0');
    elsif tclk'event and tclk='1'  then
     if ena ='1' then tsq<=tsq+1;
     end if;
    end if;
   end process;
   
 process(tclk,clr)
  begin
   if clr='1' then ena<='0';
   elsif tclk'event and tclk ='1' then ena<=cl;
   end if;
  end process;
  
 ma<=(tclk and cl) or not(tclk or cl);
 clk1<= not ma; clk2<=ma and q1; clk3<= not clk2; ss<= q2& q3;
 
 dd1 : process(clk1,clr)
  begin
   if clr='1' then q1<='0';
   elsif clk1'event and clk1='1' then q1<='1';
   end if;
  end process;
 dd2 : process(clk2,clr)
     begin
   if clr='1' then q2<='0';
   elsif clk2'event and clk2='1' then q2<='1';
   end if;
  end process;
 
 dd3 : process(clk3,clr)
     begin
   if clr='1' then q3<='0';
   elsif clk3'event and clk3='1' then q3<='1';
   end if;
  end process;
  
 pul  <='1'  when ss="10"  else
     '0';
 eend <='1'  when ss="11" else
     '0';
 bena <=ena  when spul='1' else
     pul  when spul='0' else
     pul;
  
end behav;       
     
       
  
  
    
   

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(2) | 阅读(280)
发表于:2008-3-23 14:55:56
标签:无标签

0

基于原理图输入方式的8位全加器

rar

软件是max plus

 

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(3) | 阅读(463)
发表于:2008-3-23 14:53:39
标签:无标签

0

FPGA基于LPM制作的正弦波发生器

 

software is use max plus 2rar

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(230)
发表于:2008-3-16 17:20:41
标签:无标签

0

一个加法器的程序错误的改进

library  ieee;
use  ieee.std_logic_1164.all;
use  ieee.std_logic_unsigned.all;

entity adder is
   port (
   in1  : in bit_vector;
   in2  : in bit_vector;
   pout : out bit_vector
   );
end adder; 
architecture func of adder is
begin
   process(in1,in2)
   begin
   pout <= in1 + in2 after 2 ns;
   end process;
end  func;

一开始的这个加法器的程序,在编译时通不过,出现了can't determine definition of operator'+'的这样的错误,上网找了一下,发现和我一样碰到这个问题的菜鸟(我也一样)还不在少数,经过老师的指导才知道,原来是定义输入输出数据的类型时错了,没有指明数据是多少位的,还有,after 2ns也是没必要加的,因为延迟时间只是在硬件的时候才用到.

改正的程序:

library  ieee;
use  ieee.std_logic_1164.all;
use  ieee.std_logic_unsigned.all;
entity adder is
   port (
   in1  : in STD_LOGIC_VECTOR(0 to 1);
   in2  : in STD_LOGIC_VECTOR(0 to 1);
   pout : out STD_LOGIC_VECTOR(0 to 1)
   );
end adder; 
architecture func of adder is
begin
   process(in1,in2)
   begin
   pout <= in1+in2 ;
   end process;
end  func;

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(274)
发表于:2008-3-2 10:07:41
标签:无标签

1

verilog hdl教程135例

pdf

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 转贴

评论(1) | 阅读(624)
发表于:2008-2-29 22:32:30
标签:无标签

0

我的第一个fpga实验程序(verilog hdl语言)

doc搞了几天了,终于完成了第一个FPGA的程序,速度其实也很慢了,虽然上学期就买了2C5的板,但是接着的期末考拖延了很长时间,没办法了.一步步来吧!

流水灯程序(实现7个流水灯的循环流动,类似于单片机的流水灯)

实验程序如下:

module led_8( clk, led );
input clk;
output [7:0] led;
  reg [7:0] led;
  reg [25:0] buffer;
  always @ (posedge clk)
begin
buffer = buffer +1;
if ( buffer == 26'b11111111111111111111111111)
begin
led=led<<1;
if ( led==8'b00000000 )
led=8'b11111111;
end
end
endmodule

2C5板和管脚分配如下:

#Setup.tcl
# Setup pin setting for EP2C8 main board
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
set_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFF
set_location_assignment PIN_23 -to clk                           
#seg7led
set_location_assignment PIN_103 -to led\[0\]           
set_location_assignment PIN_101 -to led\[1\]           
set_location_assignment PIN_97 -to led\[2\]           
set_location_assignment PIN_95 -to led\[3\]           
set_location_assignment PIN_92 -to led\[4\]           
set_location_assignment PIN_89 -to led\[5\]           
set_location_assignment PIN_105 -to led\[6\]
set_location_assignment PIN_107 -to led\[7\]

仿真波形图如下(时间上我缩短到2的3次方的延时,方便观看波形变化):

 

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(360)
发表于:2007-12-10 0:08:26
标签:无标签

0

科技节作品

一年一次的科技节快到了,想想也没什么好做的,后来想做个模拟街机的一种小游戏吧,一个按键来定位三个数字,在1602中显示,如果三个数字相等,刚显示一段多样流水灯

/********************************************************************************
* 描述: *
* 1602三个数字游戏 *
   有彩灯和音乐衔接
 相关接口如下:
 1602的4~14脚分别接P2^7,P2^6,P2^5,P0.0~P0.7
   按键位P2.4
 流水灯接P1口
********************************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
int i1,i2,i3;
sbit P2_4 = P2 ^ 4;//按键位
uchar dis_buf; //显示缓存
uchar temp;
sbit LCD_RS = P2^7;
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^5;
uchar code cdis1[ ] = {"GOOD LUCK"};
uchar code cdis2[ ] = {"K:"};
uchar code cdis3[ ] = {"you lose"};
uchar code cdis4[ ] = {"try again !"};
int d01,d02,d03;
uchar m;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void delay(uchar x);
void delay2(uchar x);
void delay3(uchar x);
void delay4(uchar x);
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar dat);
void lcd_init();
void lcd_pos(uchar pos);
void chushihua();
void ky0();
void ky1();
void ky2();
void liushui();
void shibai();
/*************************************************************/
/* */
/* 花样流水灯程序 */
/* */
/*************************************************************/
void liushui()
{
const unsigned char design[33]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,
               0xff,0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x18,0x3C,
      0x7e,0xff,0x81,0xc3,0xe7,0xff, 0xff,0xef,0xc3,0x81,0xff,
      0x7e,0x3c,0x18};
unsigned  int a;
unsigned  char b;
  for(b=0;b<34;b++)
    { 
     for(a=0;a<30000;a++)
P1=design[b];
 }
}
/*************************************************************/
/* */
/* 延时子程序 (快速)*/
/* */
/*************************************************************/
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++) 
{;}
}
}
/*************************************************************/
/* */
/* 延时子程序2(中速) */
/* */
/*************************************************************/
void delay2(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<150;j++) 
{;}
}
}
/*************************************************************/
/* */
/* 延时子程序3*(慢速)/
/* */
/*************************************************************/
void delay3(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<200;j++) 
{;}
}
}
/*************************************************************/
/* */
/* 延时子程序4*(很慢速)/
/* */
/*************************************************************/
void delay4(uchar x)
{ uchar j,k;
while((x--)!=0)
{ for(j=0;j<100;j++) 
{for(k=0;k<100;k++);
}
}
}
/*************************************************************/
/* */
/*检查LCD 忙状态 */
/*lcd_busy 为1 时,忙,等待。lcd-busy 为0 时,闲,可写指令与数据 */
/* */
/*************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*************************************************************/
/* */
/* LCD 初始化设定 */
/* */
/*************************************************************/
void lcd_init()
{
delay(15);
lcd_wcmd(0x38); //16*2 显示,5*7 点阵,8 位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD 的显示内容
delay(5);
}
/*************************************************************/
/* */
/* 设定显示位置 */
/* */
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | (0x80)); //数据指针=80+地址变量
}
/*************************************************************/
/* */
/* 初始化 */
/* */
/*************************************************************/
void chushihua()//初始化,显示 good luck    k:
{
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1 个字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
}
/*************************************************************/
/* */
/* 三个数值不一样时 */
/* */
/*************************************************************/
void shibai()//三个数字不一样时,显示you lose, try again please维持三秒左右
{
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1 个字符
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //显示字符
m++;
}
}
/************************************************************/
/* */
/* 0~9循环等待第一次按键 */
/* */
/*************************************************************/

void ky0()//无按键按下
{
i1=0;
P2_4=1;
for(i1=0;i1<10;i1++)
{
dis_buf = i1;//键值入显示缓存
dis_buf = dis_buf & 0x0f;
dis_buf = dis_buf+0x30;
lcd_wcmd(0xc3);
lcd_wdat(dis_buf);
delay3(250);//慢速循环
d01=i1;
if(P2_4!=1)//有一次按键按下
{
delay(5);
if(P2_4!=1)
ky1();
}
}
ky0();
}
/************************************************************/
/* */
/* 9~0循环等待第二次按键按下 */
/* */
/*************************************************************/
void ky1()//一次按键情况
{
i2=0;
P2_4=1;
for(i2=9;i2>=0;i2--)
{
dis_buf = i2;//键值入显示缓存
dis_buf = dis_buf & 0x0f;
dis_buf = dis_buf+0x30;
lcd_wcmd(0xc4);
lcd_wdat(dis_buf);
delay2(250);//中速循环
d02=i2;
if(P2_4!=1)//第二次按键按下
{
delay(5);
if(P2_4!=1)
ky2();
}
}
ky1();
}
/************************************************************/
/* */
/* 0~9循环等待第三次按键按下,如果有第三次按键按下,处理显示的数值是否相等的问题 */
/* */
/*************************************************************/
void ky2()//二次按键情况
{
i3=0;
P2_4=1;
for(i3=0;i3<10;i3++)
{
dis_buf = i3;//键值入显示缓存
dis_buf = dis_buf & 0x0f;
dis_buf = dis_buf+0x30;
lcd_wcmd(0xc5);
lcd_wdat(dis_buf);
delay(250);//快速循环
d03=i3;

if(P2_4!=1)//第三次按键按下
{
delay(5);
if(P2_4!=1)
{

if(d01==d02&&d02==d03&&d03==d01)//判断三个数值是否相等
{
liushui();//花样流水灯程序
P1=0xFF;
delay(5);
chushihua();//初始化
d01=d02=d03=0;
delay(5);
ky0();
}

else
{
shibai();
delay4(80);
chushihua();
d01=d02=d03=0;
ky0();
}

}

}

}
ky2();
}
/*************************************************************/
/* */
/*判断键是否按下 */
/* */
/*************************************************************/
main()
{
P0=0xFF; //置P0 口
P2=0xFF; //置P2 口
chushihua();//初始化
while(1)
{
ky0();
}
}
/************************************************************/

点击此处查看原文 >>

系统分类: 单片机   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(312)
发表于:2007-11-24 21:57:43
标签:无标签

0

自制了一条51下载线

以前一直用的是买的那块单片机随板送的下载线,后来单片机板卖了,不得已要自己再做一条,花了半天时间,终于做好了,虽然它外表不是很好看,但是能用就好.点击看大图

用的是74LS373的图,不过听说不支持AVR的,反正暂时没学AVR,先用着吧..

点击此处查看原文 >>

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(551)
总共 , 当前 /,2下一页