特级茶叶 2022-11-05 19:22 采纳率: 78.6%
浏览 64
已结题

用verilog HDL语法编写4

请编写程序,可以给出仿真图,题目如下图,请按题目要求编写,并给出程序。

img

  • 写回答

1条回答 默认 最新

  • 老皮芽子 2022-11-07 09:56
    关注
    module led_play
    (
        input    clk,            //0.5MHz 时钟
        input    key0,            //按键,低电平按下,高电平抬起
        input    key1,            //按键,低电平按下,高电平抬起
        input    key2,            //按键,低电平按下,高电平抬起
        output    [7:0]    ledr    //8 个流水灯,左边高位 ledr[7] ,右边低位 ledr[0] 
    );
    //三个按键,假定优先级 key0>key1>key2
    parameter CLK_IN_FREQ    = 500*1000;    //0.5MHz
    
    reg            clk1s    = 0;        //1Hz 秒脉冲
    reg            clk1_ck    = 0;        //1Hz 方波,闪烁脉冲
    reg    [31:0]    cnt        = 0;
    reg    [7:0]    led_cnt = 0;
    reg    [1:0]    led_st    = 0;        //按键状态
    
    assign    ledr = clk1_ck == 0 ? led_cnt:~led_cnt;
     
    always @(posedge clk)
    begin
        if(cnt < CLK_IN_FREQ-1)
        begin
            cnt        <= cnt + 1;
            clk1s    <= 0;
        end
        else
        begin
            cnt        <= 0;
            clk1s    <= 1;
        end
    end
    
    always @(posedge clk)
    begin
        if(cnt == CLK_IN_FREQ/2-1 || cnt == CLK_IN_FREQ-1)
        begin
            clk1_ck    <= ~clk1_ck;
        end
    end
    
    always @(posedge clk or negedge key0)
    begin
        if( key0 == 0 )            //key0 按下
            led_st <= 0;
        else if( key1 == 0 )    //key1 按下
            led_st <= 1;
        else if( key2 == 0 )    //key1 按下
            led_st <= 2;
    end
    
    always @(posedge clk or negedge key0)
    begin
        if( key0 == 0 )            //key0 按下
            led_cnt <= 8'b1111_1111;
        else if(key1 == 0)
            led_cnt    <= 8'b1111_1110;
        else if(key2 == 0)
            led_cnt    <= 8'b0111_1111;
        else if(clk1s == 1)        //1Hz 秒脉冲
        begin
            if( led_st == 1 )            //key1 按下
                led_cnt    <= {led_cnt[6:0],led_cnt[7]};    //左循环
            else if( led_st == 2 )        //key2 按下
                led_cnt    <= {led_cnt[0],led_cnt[7:1]};    //右循环
        end
    end
    endmodule
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月15日
  • 已采纳回答 11月7日
  • 创建了问题 11月5日

悬赏问题

  • ¥15 关于模型训练的一个问题
  • ¥15 装了几千台服务器从来没遇到这种问题,哎看下哪位帮我解决吧
  • ¥15 单片机程序上的困难问题
  • ¥15 请教某软件缓存Ts文件破解合并mp4的方法
  • ¥15 求小游戏炸弹人中关于敌人的C++代码
  • ¥15 拿到这个服务器最高权限有偿
  • ¥50 来个抓app跳转支付宝转链接的
  • ¥15 remotes安装提示没有description文件
  • ¥15 AttributeError: 'NoneType' object has no attribute 'drop_duplicates'报错
  • ¥15 以下代码,运行结果报错