特级茶叶 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 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加