集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1907|回复: 1

SOS!!!(大侠帮我看一下!)

[复制链接]
ITBoy000 发表于 2011-12-28 21:27:41 | 显示全部楼层 |阅读模式
module clock(clk,key,dig,seg);                                //模块名clock
input clk;                                                                        //输入时钟
input[3:0] key;                                                                //输入按键
output[7:0]        dig;                                                        //数码管选择输出引脚
output[7:0] seg;                                                        //数码管段输出引脚

reg[7:0] seg_r;                                                                //定义数码管输出寄存器
reg[7:0] dig_r;                                                                //定义数码管选择输出寄存器
reg[3:0] disp_dat;                                                        //定义显示数据寄存器
reg[24:0]count,count1;                                                                //定义计数寄存器
reg[23:0]hour;                                                                //定义现在时刻寄存器
reg sec,keyen,msec;                                                                //定义标志位
reg[3:0]dout1,dout2,dout3;                                        //寄存器
reg buffer1,buffer2;
wire[3:0]key_done;                                                        //按键消抖输出

assign dig = dig_r;                                                        //输出数码管选择
assign seg = seg_r;                                                        //输出数码管译码结果       

//秒信号产生部分
always @(posedge clk)                                           //定义clock上升沿触发
begin
        count = count + 1'b1;
        count1=count1+1'b1;
        if(count == 25'd25000000)                                //0.5S到了吗?
        begin
                count = 25'd0;                                                //计数器清零
                sec = ~sec;                                                        //置位秒标志
        end
        if(count1==25'd2500000)
        begin
                count1=25'd0;
                msec=~msec;
        end
end

//按键消抖处理部分
assign key_done = (dout1 | dout2 | dout3);        //按键消抖输出

always @(posedge count[17])
begin
        dout1 <= key;
        dout2 <= dout1;
        dout3 <= dout2;       
end

always @(negedge key_done[0])
begin
        keyen = ~keyen;                                                        //将琴键开关转换为乒乓开关
end

//数码管动态扫描显示部分
always @(posedge clk)                                           //count[17:15]大约1ms改变一次
begin
        case(count[17:15])                                                //选择扫描显示数据
                3'd0:disp_dat = hour[3:0];                        //秒个位
                3'd1:disp_dat = hour[7:4];                        //秒十位
                3'd2:disp_dat = 4'ha;                                //显示"-"
                3'd3:disp_dat = hour[11:8];                        //分个位
                3'd4:disp_dat = hour[15:12];                //分十位
                3'd5:disp_dat = 4'ha;                                //显示"-"
                3'd6:disp_dat = hour[19:16];                //时个位
                3'd7:disp_dat = hour[23:20];                //时十位
        endcase
        case(count[17:15])                                                //选择数码管显示位
                3'd0:dig_r = 8'b11111110;                        //选择第一个数码管显示
                3'd1:dig_r = 8'b11111101;                        //选择第二个数码管显示
                3'd2:dig_r = 8'b11111011;                        //选择第三个数码管显示
                3'd3:dig_r = 8'b11110111;                        //选择第四个数码管显示
                3'd4:dig_r = 8'b11101111;                        //选择第五个数码管显示
                3'd5:dig_r = 8'b11011111;                        //选择第六个数码管显示
                3'd6:dig_r = 8'b10111111;                        //选择第七个数码管显示
                3'd7:dig_r = 8'b01111111;                        //选择第八个数码管显示
        endcase       
end

always @(posedge clk)
begin
        case(disp_dat)
                4'h0:seg_r = 8'hc0;                                        //显示0
                4'h1:seg_r = 8'hf9;                                        //显示1
                4'h2:seg_r = 8'ha4;                                        //显示2
                4'h3:seg_r = 8'hb0;                                        //显示3
                4'h4:seg_r = 8'h99;                                        //显示4
                4'h5:seg_r = 8'h92;                                        //显示5
                4'h6:seg_r = 8'h82;                                        //显示6
                4'h7:seg_r = 8'hf8;                                        //显示7
                4'h8:seg_r = 8'h80;                                        //显示8
                4'h9:seg_r = 8'h90;                                        //显示9
                4'ha:seg_r = 8'hbf;                                        //显示-
                default:seg_r = 8'hff;                                //不显示
        endcase
        if((count[17:15]== 3'd2)&sec)
                seg_r = 8'hff;
end
//set time(调节时间)
always@(negedge clk or negedge key_done[2]or negedge key_done[3])
begin
        if(!key_done[2])
                buffer1=1;
        else if(!key_done[3])
                buffer2=1;
    else
                begin buffer1=0;buffer2=0;end
end
//计时处理部分                       
always @(  negedge sec or negedge msec or negedge key_done[1])//计时处理
begin
        if(!key_done[1])
                hour=24'h0;
        if(buffer1)//h++        begin
                        hour[19:16] = hour[19:16] + 1'b1;//时个位加一
                        if(hour[19:16] == 4'ha)
                        begin
                        hour[19:16] = 4'h0;
                        hour[23:20] = hour[23:20] + 1'b1;//时十位加一
                        end
                        if(hour[23:16] == 8'h24)
                        hour[23:16] = 8'h0;
        end
        else if(buffer2)//min++
        begin
                        hour[11:8] = hour[11:8] + 1'b1;//分个位加一
                        if(hour[11:8] == 4'ha)
                        begin
                        hour[11:8] = 4'h0;
                        hour[15:12] = hour[15:12] + 1'b1;//min10++
                        end
                        if(hour[15:12] == 4'h6)
                        hour[15:12] = 4'h0;
        end              
        else if(!keyen&&!sec)
        begin
                hour[3:0] = hour[3:0] + 1'b1;                //秒加1
                if(hour[3:0] == 4'ha)
                begin
                        hour[3:0] = 4'h0;
                        hour[7:4] = hour[7:4] + 1'b1;        //秒的十位加一
                        if(hour[7:4] == 4'h6)
                        begin
                                hour[7:4] = 4'h0;
                                hour[11:8] = hour[11:8] + 1'b1;//分个位加一
                                if(hour[11:8] == 4'ha)
                                begin
                                        hour[11:8] = 4'h0;
                                        hour[15:12] = hour[15:12] + 1'b1;//分十位加一
                                        if(hour[15:12] == 4'h6)
                                        begin
                                                hour[15:12] = 4'h0;
                                                hour[19:16] = hour[19:16] + 1'b1;//时个位加一
                                                if(hour[19:16] == 4'ha)
                                                begin
                                                        hour[19:16] = 4'h0;
                                                        hour[23:20] = hour[23:20] + 1'b1;//时十位加一
                                                end
                                                if(hour[23:16] == 8'h24)
                                                        hour[23:16] = 8'h0;
                                        end
                                end
                        end
                end
        end
end
endmodule
综合不能通过错误如下:
Error (10200): Verilog HDL Conditional Statement error at clock.v(111): cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct
错误指向上面代码中的红色部分.
我以前是把‘调节时间’的代码也是放在‘计时处理部分’的,但是这样做的话你一定要每隔一秒钟才能调节时间(不实时)。所以我就另外开了一个模块,但是这样以后就怎么也通不过综合。
我是一个十足的新手,希望大侠们能够帮我一下!
先谢过了!
jahero 发表于 2012-1-26 19:32:12 | 显示全部楼层
每个被触发块只能有一个主要的触发沿。你用sec msec key_done[1]三个时钟在触发该if块 综合器难以根据ff综合出该种电路
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-25 09:08 , Processed in 0.065207 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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