从零开始学习FPGA(流水灯实现)

一,仿真

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平台上

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值