概述
文章目录
- 实验要求*
- 第一步:
- 第二步:
- 使用器件:
- xc7a35tcpg236-1
- 使用软件:
- vivado
- vivado工作界面
- 工程结构
- 综合结果
- 多工器
- 刷新电路
- BCD译码器
- 仿真结果
- 命令行输出
- 实验效果
- 核心代码:
- 顶层模块代码:
- 刷新电路模块代码:
- binary-to-BCD模块代码:
- 多工器模块代码:
- BCD_to_7_segment模块代码:
- 对于Binary-to-BCD还有另外一种思路
- 测试模块代码:
- 约束文件
实验要求*
第一步:
首先设计一个Binary-to-BCD译码器(二进制数转换成十进制数)模块:
它有4bit 输入:
SW3,SW2,SW1,SW0(在实验中如果嫌麻烦可以直接使用reg [3:0] SW 数组进行代替)
例如:
若输入组合为:
“1111”,则X7~X0输出为:“00010101”
其次设计一个BCD-to-7-segment译码器模块:
它有4bit输入:
X3,X2,X1,X0,
7bit输出:
A,B,C,D,E,F,G 用于控制LED display 的七段
7端字母的对应关系如下:
第二步:
设计一个BCD交替显示控制模块:
将它与第一步的两个实验相结合,实现Binary-to-BCD的交替显示控制功能:
将拨位开关SW7~SW0代表的8位二进制数转换成三位的Hrs,Tens,Ones,并驱动多个数码管显示,其中SegSel用于控制哪个数码管的显示
使用器件:
xc7a35tcpg236-1
使用软件:
vivado
vivado工作界面
工程结构
综合结果
多工器
刷新电路
BCD译码器
如下图相同结构的八层迭代
仿真结果
命令行输出
实验效果
核心代码:
顶层模块代码:
module Top_Module(
input Clk,
input SW7,
input SW6,
input SW5,
input SW4,
input SW3,
input SW2,
input SW1,
input SW0,
output A,
output B,
output C,
output D,
output E,
output F,
output G,
output [3:0]SegSel_n
);
wire [7:0]SW;
wire [3:0]Hrs;
wire [3:0]Tens;
wire [3:0]Ones;
wire [3:0]Dval;
wire [6:0]L;
wire [3:0]SegSel;
assign SW={SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0};
Refresh R1(.Clk(Clk),.Rst(1'b0),.SegSel(SegSel));
binary_to_BCD B1(.SW(SW),.Hrs(Hrs),.Tens(Tens),.Ones(Ones));
MUX M1(.Refresh(SegSel),.Dval(Dval),.Hrs(Hrs),.Tens(Tens),.Ones(Ones));
BCD_to_7_segment S1(.X(Dval),.Lights(L));
assign {A,B,C,D,E,F,G}=~L;
assign SegSel_n=~SegSel;
endmodule
刷新电路模块代码:
module Refresh(Clk,Rst,SegSel
);
input Clk,Rst;
output reg [3:0]SegSel;
initial begin
SegSel=4'b0001;
end
reg [7:0] count_fst;
reg[3:0]count_second;
always@(posedge Clk)begin
if(Rst==1) begin
count_fst<=8'b00000000;
SegSel<=4'b0000;
end
else begin
if(count_fst==8'b11111111)
begin
count_fst<=4'b00000000;
count_second<=count_second+1'b1;
if(count_second==4'b1111)begin
count_second<=4'b0000;
case(SegSel)
4'b0000:SegSel<=4'b0001;
4'b0001:SegSel<=4'b0010;
4'b0010:SegSel<=4'b0100;
4'b0100:SegSel<=4'b1000;
4'b1000:SegSel<=4'b0001;
default:SegSel<=4'b0000;
endcase
end
end
else count_fst<=count_fst+8'b00000001;
end
end
endmodule
binary-to-BCD模块代码:
module binary_to_BCD(SW,Hrs,Tens,Ones);
input [7:0] SW;
output [3:0]Hrs;
output [3:0]Tens;
output [3:0]Ones;
reg [17:0] Z;
always@(SW)begin
Z=18'b0;
Z[7:0]=SW;
repeat(8)
begin
if(Z[11:8]>4)
Z[11:8]=Z[11:8]+2'b11;
if(Z[15:12]>4)
Z[15:12]=Z[15:12]+2'b11;
Z[17:1]=Z[16:0];
end
end
assign Hrs=Z[17:16];
assign Tens=Z[15:12];
assign Ones=Z[11:8];
endmodule
多工器模块代码:
module MUX(Refresh,Dval,Hrs,Tens,Ones
);
input [3:0] Refresh;
input [3:0]Tens;
input [3:0]Hrs;
input [3:0]Ones;
output reg [3:0]Dval;
always@(*) begin
case(Refresh)
4'b0000:Dval=4'b0000;
4'b0001:Dval=Ones;
4'b0010:Dval=Tens;
4'b0100:Dval=Hrs;
default:Dval=4'b0000;
endcase
end
endmodule
BCD_to_7_segment模块代码:
module BCD_to_7_segment(X,Lights);
input [3:0] X;
output reg [6:0] Lights;
reg X3,X2,X1,X0;
reg A,B,C,D,E,F,G;
always @(X)begin
{X3,X2,X1,X0}=X;
case({X3,X2,X1,X0})
4'd0:{A,B,C,D,E,F,G}=7'b1111110;
4'd1:{A,B,C,D,E,F,G}=7'b0110000;
4'd2:{A,B,C,D,E,F,G}=7'b1101101;
4'd3:{A,B,C,D,E,F,G}=7'b1111001;
4'd4:{A,B,C,D,E,F,G}=7'b0110011;
4'd5:{A,B,C,D,E,F,G}=7'b1011011;
4'd6:{A,B,C,D,E,F,G}=7'b1011111;
4'd7:{A,B,C,D,E,F,G}=7'b1110000;
4'd8:{A,B,C,D,E,F,G}=7'b1111111;
4'd9:{A,B,C,D,E,F,G}=7'b1111011;
default {A,B,C,D,E,F,G}=7'b0000000;
endcase
Lights={A,B,C,D,E,F,G};
end
endmodule
对于Binary-to-BCD还有另外一种思路
本实验中采用的思路是+3移位取出整数位
这种思路没有那么直观但是高效
另外一种是直接采用C语言的取模除10的思想
这种思路比较简单直接,但是综合之后的电路更加复杂,代价很大,但是同样也能实现目标
代码如下
module Tir_Deci(
input [7:0] SW,
output [6:0] hrs_Linght,
output [6:0] hens_Linght,
output [6:0] ones_Linght
);
reg [7:0]Hrs;
reg [7:0]Tens;
reg [7:0]Ones;
wire [7:0] hrs;
wire [7:0] tens;
wire [7:0] ones;
BCD_to_7_segment UUT1(.X(hrs[3:0]),.Lights(hrs_Linght));
BCD_to_7_segment UUT2(.X(tens[3:0]),.Lights(tens_Linght));
BCD_to_7_segment UUT3(.X(ones[3:0]),.Lights(ones_Linght));
binary_to_BCD UU1(.SW(Hrs[3:0]),.BCD(hrs));
binary_to_BCD UU2(.SW(Tens[3:0]),.BCD(tens));
binary_to_BCD UU3(.SW(Ones[3:0]),.BCD(ones));
integer i;
always@(SW)begin
i=SW;
Hrs=i/100;
Tens=(i/10)%10;
Ones=(i%10);
end
endmodule
测试模块代码:
代码结构
module Test_bench(
);
reg clk;
reg SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0;
wire A,B,C,D,E,F,G;
wire [3:0]SegSel;
integer i;
Top_Module Top(.Clk(clk),.SW7(SW7),.SW6(SW6),.SW5(SW5),.SW4(SW4),.SW3(SW3),.SW2(SW2),.SW1(SW1),
.SW0(SW0),.A(A),.B(B),.C(C),.D(D),.E(E),.F(F),.G(G),.SegSel_n(SegSel));
initial begin
clk<=0;
{SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0}<=8'b0;
end
always begin
#5 clk<=~clk;
#100 {SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0}<={SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0}+8'b1;
i={SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0};
$write("Iteration %0d",i);
$write("{%0d,%0d,%0d,%0d}",SegSel[3],SegSel[2],SegSel[1],SegSel[0]);
$write("{%0d,%0d,%0d,%0d,%0d,%0d,%0d}n",A,B,C,D,E,F,G);
if (A) $write(" __n");else $write("n");
if (F) $write("|");else $write(" ");
if (G) $write("__");else $write(" ");
if (B) $write("|n");else $write("n");
if (E) $write("|");else $write(" ");
if (D) $write("__");else $write(" ");
if (C) $write("|n");else $write(" n");
end
endmodule
实验效果已经在代码前面给出
对于Vivado的使用操作会在其他相关的博文说明
约束文件
set_property IOSTANDARD LVCMOS33 [get_ports B]
set_property IOSTANDARD LVCMOS33 [get_ports C]
set_property IOSTANDARD LVCMOS33 [get_ports Clk]
set_property IOSTANDARD LVCMOS33 [get_ports D]
set_property IOSTANDARD LVCMOS33 [get_ports E]
set_property IOSTANDARD LVCMOS33 [get_ports A]
set_property IOSTANDARD LVCMOS33 [get_ports F]
set_property IOSTANDARD LVCMOS33 [get_ports G]
set_property IOSTANDARD LVCMOS33 [get_ports SW1]
set_property IOSTANDARD LVCMOS33 [get_ports SW0]
set_property IOSTANDARD LVCMOS33 [get_ports SW3]
set_property IOSTANDARD LVCMOS33 [get_ports SW4]
set_property IOSTANDARD LVCMOS33 [get_ports SW5]
set_property IOSTANDARD LVCMOS33 [get_ports SW6]
set_property IOSTANDARD LVCMOS33 [get_ports SW7]
set_property IOSTANDARD LVCMOS33 [get_ports SW2]
set_property PACKAGE_PIN W16 [get_ports SW2]
set_property PACKAGE_PIN W17 [get_ports SW3]
set_property PACKAGE_PIN W15 [get_ports SW4]
set_property PACKAGE_PIN V15 [get_ports SW5]
set_property PACKAGE_PIN W14 [get_ports SW6]
set_property PACKAGE_PIN W13 [get_ports SW7]
set_property PACKAGE_PIN W7 [get_ports A]
set_property PACKAGE_PIN W6 [get_ports B]
set_property PACKAGE_PIN U8 [get_ports C]
set_property PACKAGE_PIN V8 [get_ports D]
set_property PACKAGE_PIN U5 [get_ports E]
set_property PACKAGE_PIN V5 [get_ports F]
set_property PACKAGE_PIN U7 [get_ports G]
set_property PACKAGE_PIN W5 [get_ports Clk]
set_property PACKAGE_PIN V17 [get_ports SW0]
set_property PACKAGE_PIN V16 [get_ports SW1]
set_property PACKAGE_PIN W4 [get_ports {SegSel_n[3]}]
set_property PACKAGE_PIN V4 [get_ports {SegSel_n[2]}]
set_property PACKAGE_PIN U4 [get_ports {SegSel_n[1]}]
set_property PACKAGE_PIN U2 [get_ports {SegSel_n[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[0]}]
最后
以上就是从容冥王星为你收集整理的Verilog上机实验(一):BCD码交替显示控制器实验要求*使用器件:使用软件:工程结构综合结果核心代码:测试模块代码:约束文件的全部内容,希望文章能够帮你解决Verilog上机实验(一):BCD码交替显示控制器实验要求*使用器件:使用软件:工程结构综合结果核心代码:测试模块代码:约束文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复