FPGA——8位串口发送(第一版)

串口输出程序例程

`timescale 1ns / 1ps


module serial(
input [7:0]Data,
input Send_en,//为1的时候开始工作
input CLK,
input Rest,
input [2:0]Baud_set,//设置波特率
output reg uart_tx,
output  reg Tx_done//传输完成标志位
    );
    
    reg [17:0]baud;     //波特率
    reg [17:0]cnt;      //发送一位数据的计数时间
    reg [3:0]bps_cnt;   // 循环8位数据
    
/*---------------设定波特率(默认位9600)---------------*/    
    always@(*)
    if(!Rest)
        baud<=0;
    else
        case(Baud_set)
        0:baud=1000000000/9600/20;
        1:baud=1000000000/19200/20;
        2:baud=1000000000/38400/20;
        3:baud=1000000000/57600/20;
        4:baud=1000000000/115200/20;
        default:baud=1000000000/9600/20;
        endcase
        
/*---------------计算发送一位需要的时间---------------*/     
    always@(posedge CLK or negedge Rest)
        if(!Rest)
            cnt<=0;
        else if(Send_en)
            begin
                if(cnt==baud-1)
                    cnt<=0;
                else
                    cnt<=cnt+1'b1;  
            end
        else
            cnt<=0;
        
/*---------------开始进行8位的数据传输---------------*/         
    always@(posedge CLK or negedge Rest)
        if(!Rest)
            bps_cnt<=0;
        else if(Send_en)//只有当Send_en=1时,串口才打开,才能执行传输
            begin
                if(cnt==baud-1)
                begin
                    if(bps_cnt==11)//除了8位数据位,还有起始位和结束位,起始位是下降沿、结束位是上升沿(上升沿需要持续一个位周期,因此需要占两个)因此总共是11个
                        bps_cnt<=0; 
                    else
                        bps_cnt<=bps_cnt+1'b1;
                end
            end
        else                        //Send_en=0,串口关闭
            bps_cnt<=0;
            
            
    always@(posedge CLK or negedge Rest)
    if(!Rest)                       //复位,所有控制都清零
        begin
            uart_tx<=1'b1;
            Tx_done<=0;
        end 
    else if(Send_en)                //当Send_en是1的时候,串口执行
        case(bps_cnt)
        0:begin uart_tx<=0;Tx_done<=1'b0; end//uart_tx=0,起始位(因位默认空闲的时候uart_tx是高电平);Tx_done取0,表示还没传输完成
        1:uart_tx<=Data[0];
        2:uart_tx<=Data[1];
        3:uart_tx<=Data[2];
        4:uart_tx<=Data[3];
        5:uart_tx<=Data[4];
        6:uart_tx<=Data[5];
        7:uart_tx<=Data[6];        
        8:uart_tx<=Data[7];
        9:uart_tx<=1;                         //结束标志位
        10:begin uart_tx<=1;Tx_done<=1'b1; end//结束标志位保持一个位周期,避免与空闲状态的uart_tx=1混淆;Tx_done拉高,表示传输完成;
        default:uart_tx<=1;                   //空闲状态    
        endcase
    else
        begin uart_tx<=1;end
        
endmodule

test_bench

`timescale 1ns / 1ps


module serial_tb( );
reg CLK;
reg [7:0]Data;
reg Send_en;
reg Rest;
reg [2:0]Baud_set;
wire uart_tx;
wire Tx_done;

serial serial
(
    .Data(Data),
    .Send_en(Send_en),
    .CLK(CLK),
    .Rest(Rest),
    .Baud_set(Baud_set),//波特率
    .uart_tx(uart_tx),
    .Tx_done(Tx_done)
    );
    
initial CLK=0;
always #10 CLK=~CLK;

initial
begin
    Rest=0;
    Data=0;
    Send_en=0;
    Baud_set=4;         //波特率设置为9600
    #201;
    Rest=1;
    #100;
    Data=8'h57;         //串口传输数据是16进制的57
    Send_en=1;          //开始串口传输
    #20;
    @(posedge Tx_done); //一直等待Tx_done的上升沿,若未到来,则一直等待
    Send_en=0;          //结束串口传输
    #20000;   
    Data=8'h75;
    Send_en=1;
    #20;
    @(posedge Tx_done);
    
    #20000;
    Send_en=0; 
    $stop;
end

endmodule

从输出波形可以看出符合预期要求
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
8选1选择器可以用FPGA实现,其中FPGA是一种可编程逻辑器件,可以通过编程来实现各种数字电路。下面是一个简单的8选1选择器的FPGA实现过程: 1. 首先,我们需要使用HDL语言(如Verilog或VHDL)来描述8选1选择器的行为和功能。在这个例子中,我们使用Verilog来实现。 2. 在Verilog代码中,我们需要定义8个输入信号和1个输出信号。这些输入信号表示8个不同的输入,输出信号表示选中的输入。 3. 在代码中,我们需要使用一个3位二进制编码器来选择输入信号。这个编码器将8个输入信号编码为3位二进制数,然后将这个编码器的输出与8个输入信号的“与”门相连。 4. 最后,我们需要使用一个多路选择器来选择编码器的输出,并将其作为输出信号。这个多路选择器可以通过使用FPGA内部的LUT(查找表)来实现。 下面是一个简单的Verilog代码示例,用于实现8选1选择器: ``` module mux8to1 ( input [7:0] in, input [2:0] sel, output reg out ); always @ (*) begin case (sel) 3'b000: out = in[0]; 3'b001: out = in[1]; 3'b010: out = in[2]; 3'b011: out = in[3]; 3'b100: out = in[4]; 3'b101: out = in[5]; 3'b110: out = in[6]; 3'b111: out = in[7]; endcase end endmodule ``` 这里我们使用了一个case语句来实现多路选择器的逻辑。在这个例子中,我们定义了8个输入信号(in[0]到in[7]),一个输出信号(out),以及一个3位二进制选择器(sel)。通过使用case语句,我们可以根据选择器的值选择正确的输入信号,并将其输出到输出信号中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RonaldoM要努力

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

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

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

打赏作者

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

抵扣说明:

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

余额充值