Verilog 语言翻译:流量显示系统实现

本文介绍使用 Verilog 语言实现一个简单的流量显示系统,包括流量数据处理和七段数码管显示驱动。代码示例演示了如何使用 always 语句、case 语句、分频器等 Verilog 语言特性实现功能。

1. 流量数据处理模块

module traffic_data_process(
  input         CLOCK_50,
  input  [7:0]  nabeiliu,   // 北-南方向流量
  input  [7:0]  dongxiliu,  // 东-西方向流量
  input  [2:0]  moshi,      // 模式选择
  output reg [15:0] liul       // 流量显示数据
);

always @(posedge CLOCK_50)
  begin
    if (moshi == 5)
      begin
        liul[3:0]  <= nabeiliu / 10; // 南北方向流量 十位
        liul[7:4]   <= nabeiliu % 10; // 南北方向流量 个位
        liul[11:8]  <= dongxiliu / 10; // 东西方向流量 十位
        liul[15:12] <= dongxiliu % 10; // 东西方向流量 个位  
      end
    else 
      begin
        liul[3:0]   <= moshi; 
        liul[7:4]   <= 10; 
        liul[11:8]  <= 10; 
        liul[15:12] <= 10;   
      end
  end
endmodule

该模块接收南北方向流量 nabeiliu、东西方向流量 dongxiliu 以及模式选择信号 moshi。根据模式选择,将流量数据进行处理并输出到 liul 寄存器,准备用于七段数码管显示。

2. 七段数码管驱动模块

module seg_drive(
  input         i_clk,
  input  [15:0] i_data,                 // 欲显数据[16
  output reg [7:0] o_seg,                  // 段脚
  output reg [3:0] o_sel                   // 位脚
);

//++++++++++++++++++++++++++++++++++++++
// 分频部分 开始
//++++++++++++++++++++++++++++++++++++++
reg [16:0] cnt;                         // 计数子

always @(posedge i_clk)
  cnt <= cnt + 1'b1;

wire seg7_clk = cnt[16];                // (2^17/50M = 2.6114)ms 
//--------------------------------------
// 分频部分 结束
//--------------------------------------


//++++++++++++++++++++++++++++++++++++++
// 动态扫描, 生成seg7_addr 开始
//++++++++++++++++++++++++++++++++++++++
reg [1:0]  seg7_addr;                   // 第几个seg7

always @(posedge seg7_clk)
  seg7_addr <= seg7_addr + 1'b1;      

always
  case (seg7_addr)
    0 : o_sel <= 4'b0001;              
    1 : o_sel <= 4'b0010;               
    2 : o_sel <= 4'b0100;                
    3 : o_sel <= 4'b1000;               
  endcase
//++++++++++++++++++++++++++++++++++++++
// 根据seg7_addr, 选择待译段码 开始
//++++++++++++++++++++++++++++++++++++++
reg [7:0] seg_data_r;                   // 待译段码

always
  case (seg7_addr)
    0 : seg_data_r <= i_data[3:0];
    1 : seg_data_r <= i_data[7:4];
    2 : seg_data_r <= i_data[11:8];
    3 : seg_data_r <= i_data[15:12];
  endcase

always @(posedge i_clk)
  case(seg_data_r)                // 无小数点
    4'h0 : o_seg <= 8'hc0;
    4'h1 : o_seg <= 8'hf9;
    4'h2 : o_seg <= 8'ha4;
    4'h3 : o_seg <= 8'hb0;
    4'h4 : o_seg <= 8'h99;
    4'h5 : o_seg <= 8'h92;
    4'h6 : o_seg <= 8'h82;
    4'h7 : o_seg <= 8'hf8;
    4'h8 : o_seg <= 8'h80;
    4'h9 : o_seg <= 8'h90;
    4'ha : o_seg <= 8'hff;
  endcase
endmodule

// seg_drive2 模块:用于驱动第二个七段数码管显示数据,与seg_drive模块相同
module seg_drive2(
  input         i_clk,
  input  [15:0] i_data,                 // 欲显数据[16
  output reg [7:0] o_seg,                  // 段脚
  output reg [3:0] o_sel                   // 位脚
);

该模块接收 i_clk 时钟信号、i_data 显示数据,并输出 o_seg 七段数码管段码和 o_sel 位选择信号。代码实现了一个分频器,用于产生七段数码管扫描的时钟信号 seg7_clk。使用 seg7_addr 指示当前扫描的位,并根据 seg7_addr 选择对应的显示数据 seg_data_r。最后,根据 seg_data_r 的值输出七段数码管段码 o_seg

3. 系统连接

将流量数据处理模块和七段数码管驱动模块连接起来,即可实现完整的流量显示系统。

module traffic_display(
  input         CLOCK_50,
  input  [7:0]  nabeiliu,   // 北-南方向流量
  input  [7:0]  dongxiliu,  // 东-西方向流量
  input  [2:0]  moshi      // 模式选择
);

reg [15:0] liul;

traffic_data_process #(.CLOCK_50(CLOCK_50), .nabeiliu(nabeiliu), .dongxiliu(dongxiliu), .moshi(moshi), .liul(liul)) traffic_data_process_inst;
seg_drive  #(.i_clk(CLOCK_50), .i_data(liul)) seg_drive_inst;
seg_drive2 #(.i_clk(CLOCK_50), .i_data(liul)) seg_drive2_inst;
endmodule

总结

本文提供了一个使用 Verilog 语言实现流量显示系统的示例,包括流量数据处理模块和七段数码管驱动模块。代码示例演示了 Verilog 语言的一些基本特性,例如 always 语句、case 语句、分频器等。希望本文能帮助读者理解 Verilog 语言的基本使用,并能将其应用于其他硬件设计中。

Verilog 语言翻译:流量显示系统实现

原文地址: https://www.cveoy.top/t/topic/nLwr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录