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

共20条 2/2 1 2 跳转至
助工
2013-04-08 08:12:04     打赏
11楼

好的,谢谢大老王。嘿嘿。


助工
2013-04-09 17:00:03     打赏
12楼

led_display实验一作业:拨码开关进行八进制数显示。led_key.zip

代码:

module led_key(sys_clk,key,sm_seg,sm_bit);
//输入输出信号
input sys_clk;  //全局时钟 50Mhz
input[7:0] key; //按键输入
output[7:0]  sm_seg;//数码管段码
output[7:0]     sm_bit;//数码管位码
//寄存器定义
reg[7:0]  sm_seg;//数码管段码输出寄存器
wire[7:0]  sm_bit;//数码管位码输出寄存器
reg[3:0]  key_dat;//显示数据寄存器
//*wire型数据常用来表示以assign为关键字组合逻辑信号,reg型为寄存器数据类型,常用来表示always模块内指定信号,常代表触发器。*/
//逻辑部分
always@(posedge sys_clk or negedge key )
        begin
                        case (key)
                            8'hff:key_dat=4'h0;
                            8'hfd:key_dat=4'h1;
                            8'hfb:key_dat=4'h2;
                            8'hf7:key_dat=4'h3;
                            8'hef:key_dat=4'h4;
                            8'hdf:key_dat=4'h5;
                            8'hbf:key_dat=4'h6;
                            8'h7f:key_dat=4'h7;
                        endcase
        end
always@(key_dat)
        begin
                        case (key_dat)
                            4'h0:sm_seg=8'hf9;//"1"
                            4'h1:sm_seg=8'ha4;//"2"
                            4'h2:sm_seg=8'hb0;//"3"
                            4'h3:sm_seg=8'h99;//"4"
                            4'h4:sm_seg=8'h92;//"4"
                            4'h5:sm_seg=8'h82;//"6"
                            4'h6:sm_seg=8'hf8;//"7"
                            4'h7:sm_seg=8'h80;//"8"
                        endcase
        end
/*begin...end类似于C语言里面的{}*/
assign sm_bit=8'b00000000 ;
endmodule


助工
2013-04-09 17:08:58     打赏
13楼


院士
2013-04-09 17:14:28     打赏
14楼

再接再厉~~


助工
2013-04-09 17:15:52     打赏
15楼
同时我想问哈,有没有办法在一个工程下实现嵌套,生成sof文件只生成子文件的调试程序,因为每次都要手动设置pin管脚,如果可以在一个工程下多个子文件不干扰会省好多事呢。

助工
2013-04-11 10:23:51     打赏
16楼

作业:模60的计数器。

module led_60cnt(sys_clk,sys_rstn,sm_seg,sm_bit);
//输入输出端口
input sys_clk;//50Mhz时钟
input sys_rstn;//复位信号
output [7:0] sm_seg;//数码管段码
output [1:0] sm_bit;//数码管位码
//寄存器定义
reg[7:0] sm_seg;//数码管段码输出寄存器
reg[1:0] sm_bit;//数码管位码输出寄存器
reg[25:0] delay_1S;//1s的延时计数器
reg[15:0] scan_1kHz;//short 1khz扫描
reg  disp_dat;//位选计数器
reg[3:0] unit;//个位
reg[3:0] decade;//十位
reg[4:0] data_buf;//数据位
//初始化
/*initial
begin
    delay_1S<=26'd0;
    scan_1kHz<=16'd0;
    disp_dat<=4'd0;
    unit<=4'd0;
    decade<=4'd0;
end
*/
//逻辑部分
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        begin
            unit<=4'h0;
            decade<=4'h0;
        end
    else
        begin
            if(delay_1S==26'd49999999)
                begin
                    unit<=unit+1'h1;
                        if(unit==4'h9)
                            begin
                                unit<=4'h0;
                                decade<=decade+1'b1;
                                if(decade==4'h5)
                                    begin
                                        decade<=4'h0;
                                    end
                            end
                end
            else
                            begin
                                    unit<=unit;
                                    decade<=decade;
                            end
        end
end
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        delay_1S<=26'd0;
        else
            begin
                if(delay_1S==26'd49999999)
                    delay_1S<=26'd0;
                        else delay_1S<=delay_1S+1'b1;
            end
end        
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        scan_1kHz<=16'd0;
        else
            begin
                if(scan_1kHz==16'd49999)
                    scan_1kHz<=16'd0;
                        else scan_1kHz<=scan_1kHz+1'b1;
            end
end        
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        begin
            disp_dat<=1'd0;
        end
    else
        begin
                if(scan_1kHz==16'd49999)
                    disp_dat<=disp_dat+1'b1;
                else
                    disp_dat<=disp_dat;
        end
end
always@(disp_dat)
    begin
        case(disp_dat)
            1'b0:sm_bit=2'b10;
            1'b1:sm_bit=8'b01;
            default:sm_bit=8'hfb;
        endcase
    end
always@(sm_bit)
    begin
        case(sm_bit)
            2'b10:data_buf=unit;
            2'b01:data_buf=decade;
        endcase
    end
always@(data_buf)
begin

            case(data_buf)
                4'h0:sm_seg=8'hc0;//"0"
                4'h1:sm_seg=8'hf9;//"1"
                4'h2:sm_seg=8'ha4;//"2"
                4'h3:sm_seg=8'hb0;//"3"
                4'h4:sm_seg=8'h99;//"4"
                4'h5:sm_seg=8'h92;//"4"
                4'h6:sm_seg=8'h82;//"6"
                4'h7:sm_seg=8'hf8;//"7"
                4'h8:sm_seg=8'h80;//"8"
                4'h9:sm_seg=8'h90;//"9"
                4'ha:sm_seg=8'h88;//"a"
                4'hb:sm_seg=8'h83;//"b"
                4'hc:sm_seg=8'hc6;//"c"
                4'hd:sm_seg=8'ha1;//"d"
                4'he:sm_seg=8'h86;//"e"
                4'hf:sm_seg=8'h8e;//"f"
                default: sm_seg=8'h00;
            endcase
end
endmodule

led_60cnt.zip


助工
2013-04-11 10:27:18     打赏
17楼
心得:RTL功能级仿真时我这菜鸟必须学会的东西,这次模60的计数器开始总是显示全0,看来看去程序没问题,仿真后才看到unit和decade始终是0,从而改程序,自己在逻辑部分延时判断后unit<=unit和decade<=decade的位置写错了,收获就是多仿真,调板子。

院士
2013-04-11 10:30:14     打赏
18楼

助工
2013-04-11 12:50:53     打赏
19楼

按键篇:作业一 按键控制数码管0~9显示

这次作业是基于led_display改的,参考版主的按键程序,没有消抖,按键每次按下去不能正确的出现数字。

代码:

module led_8key(sys_clk,sys_rstn,key_in,sm_seg,sm_bit);
//输入输出信号
input sys_clk;  //全局时钟 50Mhz
input sys_rstn; //复位信号
input key_in; //按键输入
output[7:0]  sm_seg;//数码管段码
output[7:0]     sm_bit;//数码管位码
//寄存器定义
reg[7:0]  sm_seg;//数码管段码输出寄存器
wire[7:0] sm_bit;//数码管位码输出寄存器
reg[3:0]  disp_dat;//显示数据寄存器
/*wire型数据常用来表示以assign为关键字组合逻辑信号,reg型为寄存器数据类型,常用来表示always模块内指定信号,常代表触发器。*/
//逻辑部分
/*begin...end类似于C语言里面的{}*/
initial
disp_dat<=4'd0;
always@(posedge sys_clk or negedge sys_rstn)always@(posedge sys_clk or negedge sys_rstn)
        begin
                if(!sys_rstn)
                    disp_dat<=4'd0;
                else
                        if(!key_in)
                            begin
                                disp_dat<=disp_dat+1'd1;
                                if(disp_dat==4'h9)
                                    disp_dat<=4'h0;
                            end
                        else
                            disp_dat<=disp_dat;
        end        
always@(disp_dat)
begin

            case(disp_dat)
                4'h0:sm_seg=8'hc0;//"0"
                4'h1:sm_seg=8'hf9;//"1"
                4'h2:sm_seg=8'ha4;//"2"
                4'h3:sm_seg=8'hb0;//"3"
                4'h4:sm_seg=8'h99;//"4"
                4'h5:sm_seg=8'h92;//"4"
                4'h6:sm_seg=8'h82;//"6"
                4'h7:sm_seg=8'hf8;//"7"
                4'h8:sm_seg=8'h80;//"8"
                4'h9:sm_seg=8'h90;//"9"
                default: sm_seg=8'hff;
            endcase
end
assign sm_bit=8'b1111_1110;
endmodule


led_8key.zip


助工
2013-04-11 22:07:30     打赏
20楼
module led_8key(sys_clk,sys_rstn,key_in,sm_seg,sm_bit,led_out);
//输入输出信号
input sys_clk;  //全局时钟 50Mhz
input sys_rstn; //复位信号
input key_in; //按键输入
output[7:0]  sm_seg;//数码管段码
output[7:0]     sm_bit;//数码管位码
output led_out;
//寄存器定义
reg[7:0]  sm_seg;//数码管段码输出寄存器
wire[7:0] sm_bit;//数码管位码输出寄存器
reg[3:0]  disp_dat;//显示数据寄存器
reg[19:0] delay_cnt;
wire key_scan;
wire key_low;
reg key_samp;
reg key_samp_r;
reg key_rst;
reg key_rst_r;
reg led_out;
/*wire型数据常用来表示以assign为关键字组合逻辑信号,reg型为寄存器数据类型,常用来表示always模块内指定信号,常代表触发器。*/
//逻辑部分
/*begin...end类似于C语言里面的{}*/
initial
disp_dat<=4'd0;
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        key_samp<=1'b1;
    else key_samp<=key_in;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        key_samp_r<=1'b1;
        else
            key_samp_r<=key_samp;
end
assign key_scan=key_samp_r&(~key_samp);
//延时20ms
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        delay_cnt<=20'h0;
        else
            if(key_scan)
                delay_cnt<=20'h0;
                else
                delay_cnt<=delay_cnt+1'b1;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        key_rst<=1'b1;
        else if (delay_cnt==20'hfffff) //约20ms
                    key_rst<=key_in;
end
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
            key_rst_r<=1'b1;
            else key_rst_r<=key_rst;
    end
assign key_low=key_rst_r&(~key_rst);
always@(posedge sys_clk or negedge sys_rstn)
        begin
                if(!sys_rstn)
                    begin
                        disp_dat<=4'd0;
                        led_out<=1'd1;
                    end
                else
                        if(key_low)
                            begin
                                led_out<=~led_out;
                                if(disp_dat==4'h9)
                                    disp_dat<=4'h0;
                                else
                                    disp_dat<=disp_dat+1'd1;
                            end
                        else
                            begin
                                disp_dat<=disp_dat;
                                led_out<=led_out;
                            end
        end
always@(disp_dat)
begin

            case(disp_dat)
                4'h0:sm_seg=8'hc0;//"0"
                4'h1:sm_seg=8'hf9;//"1"
                4'h2:sm_seg=8'ha4;//"2"
                4'h3:sm_seg=8'hb0;//"3"
                4'h4:sm_seg=8'h99;//"4"
                4'h5:sm_seg=8'h92;//"4"
                4'h6:sm_seg=8'h82;//"6"
                4'h7:sm_seg=8'hf8;//"7"
                4'h8:sm_seg=8'h80;//"8"
                4'h9:sm_seg=8'h90;//"9"
                default: sm_seg=8'hff;
            endcase
end
assign sm_bit=8'b1111_1110;
endmodule

led_8key.zip

基本上根据版主的代码改的,我还需要消化哈。消抖后的确效果很好。led等和数码管同时提示按键效果。


共20条 2/2 1 2 跳转至

回复

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