【verilog每日一练】case语句的使用 - FPGA开发者技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

Mill 关注 私信
[问答]

【verilog每日一练】case语句的使用

用case语句实现8段数码管对应数字显示的控制,4bit的dig信号表示应显示的数字(0~9),8bit的seg信号表示数码管8段led的控制,且数码管为共阳数码管,[7:0]seg从高位到低位分别表示DP、A、B、C、D、E、F、G

image.png

回帖(6)

dfghjkghj

2023-8-29 07:16:02
module seg8 (
    input clk, clk;
    input [3:0] dig;
    output reg [7:0] seg
);

always @ (posedge clk or negedge rst)
begin
    if (!clk)
        dig <= 4'b0000;
    else
        begin
            case (dig)
                4'b0000 : seg <= 8'b1000_0001;
                4'b0001 : seg <= 8'b1100_1111;
                4'b0010 : seg <= 8'b1001_0010;
                4'b0011 : seg <= 8'b1000_0110;
                4'b0100 : seg <= 8'b1100_1100;
                4'b0101 : seg <= 8'b1010_0100;
                4'b0110 : seg <= 8'b1010_0000;
                4'b0111 : seg <= 8'b1000_1111;
                4'b1000 : seg <= 8'b1000_0000;
                4'b1001 : seg <= 8'b1000_0100;
                default : seg <= 8'b1111_1111;
            endcase
        end
end

endmodule

余温重顾

2023-8-29 09:31:16
  1. module segment_display(  
  2.     input wire clk,  
  3.     input wire dp,  
  4.     input wire [3:0] num, // 4位数字输入  
  5.     output reg [7:0] seg // 8位数码管信号输出  
  6. );  
  7.   
  8.     // 定义状态机的16个状态  
  9.     localparam   
  10.         STATE_0 = 16'h0001,  
  11.         STATE_1 = 16'h0002,  
  12.         STATE_2 = 16'h0003,  
  13.         STATE_3 = 16'h0004,  
  14.         STATE_4 = 16'h0005,  
  15.         STATE_5 = 16'h0006,  
  16.         STATE_6 = 16'h0007,  
  17.         STATE_7 = 16'h0008,  
  18.         STATE_8 = 16'h0009,  
  19.         STATE_9 = 16'h0010,  
  20.         STATE_A = 16'h0011,  
  21.         STATE_B = 16'h0012,  
  22.         STATE_C = 16'h0013,  
  23.         STATE_D = 16'h0014,  
  24.         STATE_E = 16'h0015,  
  25.         STATE_F = 16'h0016,  
  26.         STATE_UNUSED = 16'hFFFF;  
  27.   
  28.     // 状态机变量  
  29.     reg [15:0] state;  
  30.     reg [3:0] num_reg; // 用寄存器保存输入的数字,防止时序问题  
  31.   
  32.     always @(posedge clk) begin  
  33.         if (dp) begin // 如果dp信号为高,重置状态机  
  34.             state <= STATE_UNUSED;  
  35.             num_reg <= 4'b0;  
  36.         end else begin // 如果dp信号为低,更新状态机和数字寄存器  
  37.             num_reg <= num;  
  38.             case (state)  
  39.                 STATE_UNUSED: begin // 不使用状态,仅用于初始化和复位  
  40.                     seg <= 8'bZZZZZZZZ; // 设置所有段为高电平(熄灭)  
  41.                     state <= STATE_UNUSED; // 保持复位状态  
  42.                 end  
  43.                 default: begin // 其他状态,根据输入的数字更新数码管信号  
  44.                     case (num_reg) // 根据输入的数字选择相应的状态  
  45.                         4'b0000: state <= STATE_0; // 状态0对应数字"0"  
  46.                         4'b0001: state <= STATE_1; // 状态1对应数字"1"  
  47.                         4'b0010: state <= STATE_2; // 状态2对应数字"2"  
  48.                         4'b0011: state <= STATE_3; // 状态3对应数字"3"  
  49.                         4'b0100: state <= STATE_4; // 状态4对应数字"4"  
  50.                         4'b0101: state <= STATE_5; // 状态5对应数字"5"  
  51.                         4'b0110: state <= STATE_6; // 状态6对应数字"6"  
  52.                         4'b0111: state <= STATE_7; // 状态7对应数字"7"  
  53.                         4'b1000: state <= STATE_8; // 状态8对应数字"8"  
  54.                         4'b1001: state <= STATE_9; // 状态9对应数字"9"  
  55.                         default: state <= STATE_UNUSED; // 其他输入为无效状态,返回复位状态  
  56.                     endcase  
  57.                     // 根据当前状态设置数码管信号seg

Mill

2023-8-29 09:32:15

解析:共阳数码管低电平点亮,参考case语法:

若 condition1 为真,则执行true_statement1;若condition1为假且condition2 为真,则执行 true_statement2;若所有列出的 condition 都为假,则执行 default_statement 语句

jf_84491108

2023-8-29 19:00:29
module seven_segment_controller(  
    input wire clk,  
    input wire rst,  
    input wire [3:0] dig,  
    output reg [7:0] seg  
);  
  
    always @(posedge clk or posedge rst) begin  
        if (rst)  
            seg <= 8'b00000000;  
        else begin  
            case (dig)  
                4'b0000: seg = 8'b11111111; // 0  
                4'b0001: seg = 8'b11111010; // 1  
                4'b0010: seg = 8'b11110110; // 2  
                4'b0011: seg = 8'b11101110; // 3  
                4'b0100: seg = 8'b11011110; // 4  
                4'b0101: seg = 8'b10111110; // 5  
                4'b0110: seg = 8'b01111110; // 6  
                4'b0111: seg = 8'b00111110; // 7  
                4'b1000: seg = 8'b00001110; // 8  
                4'b1001: seg = 8'b00000110; // 9  
                default: seg = 8'b00000000; // turn off all segments  
            endcase  
        end  
    end  
endmodule

更多回帖

×
发帖