一,仿真
1.仿真:仿真使用modelsim软件,添加测试tb文件与对应调用模块,通过编辑软件查错,解决基本语法问题,进行仿真,观察生成信号波形,优化代码逻辑
二.译码并控制流水灯
`timescale 1ns/1ns
//数码管译码器
module decode_exer(
input [7:0]decode_number, //被译码数字
output [5:0]sel, //位选变量
output reg [7:0]seg_led //译码出的二进制控制七段数码管
);
assign sel = 6'b000_000; //设置位选,低电平有效
always @(*)case(decode_number) //判断数字对应的数码管
8'd0: seg_led=8'b1100_0000; //dot g f e d c b a,低电平有效
8'd1: seg_led=8'b1111_1001;
8'd2: seg_led=8'b1010_0100;
8'd3: seg_led=8'b1011_0000;
8'd4: seg_led=8'b1001_1001;
8'd5: seg_led=8'b1001_0010;
8'd6: seg_led=8'b1000_0010;
8'd7: seg_led=8'b1111_1000;
8'd8: seg_led=8'b1000_0000;
8'd9: seg_led=8'b1001_0000;
default:seg_led=8'b1100_0000;
endcase
endmodule
三.tb文件仿真测试
因为此项目最终目的是实现spi串口通信,因此tb文件中同时编写了模拟串口输出的情况
`timescale 1ns/1ns
module spi_rx_tb();
wire spi_tx;
//reg cs_n = 1'b1;
reg clk=1'b0;
//reg [7:0]data=8'b10101010;
//reg [5:0]count;
//reg [4:0]bit_cnt=5'b0;
wire spi_clk;
reg [7:0]tx_data;
always #10 clk = ~clk;
reg valid;
reg rst_n;
reg cs;
wire valid_1;
/*
//计数器
always@(clk)
if(count<5)
count<=count+5'b1;
else
count<=5'b0;
//分频器 //bit_cnt只在0-17走一次
always@(posedge clk) //always中的变量要是reg类型
if(count == 4 && bit_cnt < 6'd18)begin
bit_cnt<=bit_cnt+1'b1; //计数
spi_tx <= data[6'd7-(bit_cnt>>1)]; //从高位开始输出数据,右移一位
if(bit_cnt<6'd16)begin
spi_clk<=~spi_clk; //spi_clk反转形成
cs_n<=1'b0; //第一个时钟的上升沿发出数据和拉低cs_n
end
else if(bit_cnt == 6'd16) begin
spi_clk<=1'b0; //spi_clk置零
cs_n <= 1'b1; //数据输出完成后cs_n拉高
end
end
else
bit_cnt = bit_cnt; //初始化计数变量
*/
initial begin
//初始化变量
tx_data=8'b0;
rst_n = 0;
valid = 0;
#40
rst_n = 1;
#100
tx_data=8'b1010_1010;
valid = 1;
#20
valid = 0; //工作时复位完成
end
/*
spi_tx = data[7];
#20 spi_tx = data[6];
#20 spi_tx = data[5];
#20 spi_tx = data[4];
#20 spi_tx = data[3];
#20 spi_tx = data[2];
#20 spi_tx = data[1];
#20 spi_tx = data[0];
#20 cs_n = 1'b1;
*/
SPI_Master logic_inst2(
.valid (valid),
.clk (clk),
.tx_data (tx_data), //需要发送的一个字节
.rst_n (rst_n),
.cs (cs_n),
.spi_tx (spi_tx),
.spi_clk (spi_clk)
);
SPI_rx_exer logic_inst(
.clk (clk), //右边是原模块的变量名,左边是调用其他模块的变量名
.cs_n (cs_n),
.spi_clk (spi_clk),
.rst_n (rst_n),
.spi_rx (spi_tx),
.valid (valid_1),
.rx_data (rx_data)
);
endmodule
四.quartus软件烧录
将模块文件添加进quartus,设置完基础设置,将程序烧录到fpga平台上