verilog FPGA驱动数码管代码

用FPGA连接74HC595控制6位数码管同时输出1~F 16位数字

顶部代码

module seg_595_static
(
input wire sys_clk,
input wire sys_rst_n,
output wire ds,
output wire shcp,
output wire stcp,
output wire oe
);        
wire [5:0] sel;
wire [7:0] seg;
seg_static
#(
.CNT_MAX (25'd24999999)
)
seg_static_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.sel(sel),
.seg(seg)
);

hc595_ctrl hc595_ctrl_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.sel(sel),
.seg(seg),
.ds(ds),
.shcp(shcp),
.stcp(stcp),
.oe(oe)
);

endmodule

输出信号代码

module seg_static
#(
parameter CNT_MAX = 25'd24999999
)

(
input wire sys_clk,
input wire sys_rst_n,
output reg [5:0] sel,
output reg [7:0] seg
);

reg [24:0] cnt;
reg [3:0] data;
reg       cnt_flag;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt <= 25'd0;
else if(cnt == CNT_MAX)
cnt <= 25'b0;
else 
cnt <= cnt+1'b1;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
data <= 4'd0;
else if ((data == 4'd15)&&(cnt_flag==1'b1))
data <= 4'd0;
else if (cnt == CNT_MAX)
data <= data+1'b1;
else
data <= data;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_flag <= 1'b0;
else if (cnt == CNT_MAX-1)
cnt_flag <= 1'b1;
else
cnt_flag <= 1'b0;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
sel <= 6'd0;
else
sel <= 6'b111111;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
seg <= 8'hff;
else case(data)
4'd0 :seg <= 8'hc0;
4'd1 :seg <= 8'hf9;
4'd2 :seg <= 8'ha4;
4'd3 :seg <= 8'hb0;
4'd4 :seg <= 8'h99;
4'd5 :seg <= 8'h92;
4'd6 :seg <= 8'h82;
4'd7 :seg <= 8'hf8;
4'd8 :seg <= 8'h80;
4'd9 :seg <= 8'h90;
4'd10:seg <= 8'h88;
4'd11:seg <= 8'h83;
4'd12:seg <= 8'hc6;
4'd13:seg <= 8'ha1;
4'd14:seg <= 8'h86;
4'd15:seg <= 8'h8e;
default: seg <= 8'hff;
endcase

endmodule

用74hc595控制六位数码管

module hc595_ctrl
(
input wire sys_clk,
input wire sys_rst_n,
input wire [5:0]sel,
input wire [7:0]seg,
output reg ds,
output reg shcp,
output reg stcp,
output wire oe
);

wire [13:0] data ;
reg [1:0] cnt;
reg [3:0] cnt_bit ;

assign data = {seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel[5:0]};

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt <= 2'b0;
else if (cnt == 2'd3)
cnt <= 2'b0;
else 
cnt <= cnt + 1'b1;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_bit <= 4'b0;
else if((cnt_bit == 4'd13)&&(cnt == 2'd3))
cnt_bit <= 4'b0;
else if(cnt == 2'd3)
cnt_bit <= cnt_bit+1'b1;
else 
cnt_bit <= cnt_bit;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
ds <= 1'b0;
else if(cnt == 2'b0)
ds <= data[cnt_bit];
else 
ds <= ds;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
shcp <= 1'b0;
else if(cnt == 2'd2)
shcp <= 1'b1;
else if (cnt == 2'd0)
shcp <= 1'b0;
else
shcp <= shcp;

always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
stcp <= 1'b0;
else if ((cnt == 2'd0)&&(cnt_bit == 4'd0))
stcp <= 1'b1;
else if ((cnt == 2'd2)&&(cnt_bit == 4'd0))
stcp <= 1'b0;
else 
stcp <= stcp;

assign oe = 1'b0;

endmodule
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,可以通过使用Verilog代码来实现串口通讯和数码管显示。在给出具体实现方法之前,需要明确一些前提条件。首先,需要一个FPGA开发板来进行开发和测试。其次,需要了解FPGA开发板的引脚分配和数码管的控制方式。 在Verilog代码中,可以使用串口通讯模块来实现与外部设备的数据交互。在给定的代码示例中,有一个名为rs_clk_gen的模块,其中包含了计数器和时钟翻转逻辑。这个模块可以用来生成串口通讯所需的时钟信号。 同时,可以使用数码驱动模块来实现数码管的显示。具体的驱动方式可以根据FPGA开发板的引脚分配和数码管类型进行选择。一般来说,数码管需要通过FPGA的IO口来控制,可以使用状态机的方式来实现数码管的循环显示。 综合以上两个模块,可以在FPGA开发板上实现串口通讯和数码管显示的功能。通过串口通讯模块与外部设备进行数据交互,并将接收到的数据通过数码驱动模块进行显示。 需要注意的是,在实际应用中,需要根据具体需求进行适当的修改和扩展。比如添加数据解析和处理的逻辑模块,以及数据的格式化显示等功能。 综上所述,可以通过Verilog代码来实现串口通讯和数码管显示。具体的实现方法可以根据实际需求和硬件平台进行调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [verilog语言RS232串口接收模块设计——串口调试工具发送数据在数码管显示](https://blog.csdn.net/baijingdong/article/details/20460019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [FPGA ise项目 实现点亮led灯,串口收发](https://blog.csdn.net/qq_44331916/article/details/120271553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕噜咕噜轱轮吨吨吨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值