1.用System Verilog书写7位数据位,1位偶校验,波特率为115200bps的uart串行发送端 2. 用SV书写对应的行为模型(接收端),并输出激励中的字节值,奇偶性错误的,输出校验错误 3.编写testcase

时间: 2024-05-08 22:17:45 浏览: 7
1. 串行发送端代码如下: ```systemverilog module uart_serial_tx #( parameter BAUD_RATE = 115200 ) ( input clk, input rst, input [6:0] data_in, output reg tx_out ); // Internal counter for baud rate // 1 start bit + 7 data bits + 1 parity bit + 1 stop bit = 10 bits per byte localparam BAUD_COUNTER_MAX = ($root.BAUD_RATE / 10) - 1; reg [15:0] baud_counter = 0; // Parity calculation wire parity = ^data_in; // State machine for transmitting data typedef enum logic [2:0] { IDLE, START, DATA, PARITY, STOP } state_t; state_t state = IDLE; always @(posedge clk) begin if (rst) begin baud_counter <= 0; tx_out <= 1'b1; state <= IDLE; end else begin // Baud rate generation baud_counter <= (baud_counter == BAUD_COUNTER_MAX) ? 0 : (baud_counter + 1); case (state) IDLE: begin if (data_in !== 7'b0) begin state <= START; end end START: begin tx_out <= 1'b0; state <= DATA; end DATA: begin tx_out <= data_in[0]; data_in <= {data_in[5:1], parity}; state <= PARITY; end PARITY: begin tx_out <= parity; state <= STOP; end STOP: begin tx_out <= 1'b1; state <= IDLE; end default: state <= IDLE; endcase end end endmodule ``` 2. 串行接收端代码如下: ```systemverilog module uart_serial_rx #( parameter BAUD_RATE = 115200 ) ( input clk, input rst, input rx_in, output reg [6:0] data_out, output reg parity_err, output reg frame_err ); // Internal counter for baud rate // 1 start bit + 7 data bits + 1 parity bit + 1 stop bit = 10 bits per byte localparam BAUD_COUNTER_MAX = ($root.BAUD_RATE / 10) - 1; reg [15:0] baud_counter = 0; // State machine for receiving data typedef enum logic [2:0] { IDLE, START, DATA, PARITY, STOP } state_t; state_t state = IDLE; always @(posedge clk) begin if (rst) begin baud_counter <= 0; data_out <= 7'b0; parity_err <= 1'b0; frame_err <= 1'b0; state <= IDLE; end else begin // Baud rate generation baud_counter <= (baud_counter == BAUD_COUNTER_MAX) ? 0 : (baud_counter + 1); case (state) IDLE: begin if (!rx_in) begin state <= START; end end START: begin state <= DATA; end DATA: begin data_out <= {data_out[5:0], rx_in}; state <= PARITY; end PARITY: begin if (rx_in !== ^data_out) begin parity_err <= 1'b1; end state <= STOP; end STOP: begin if (rx_in) begin frame_err <= 1'b1; end state <= IDLE; end default: state <= IDLE; endcase end end endmodule ``` 3. 编写testcase如下: ```systemverilog module test_uart_serial; // Parameters localparam BAUD_RATE = 115200; // DUT uart_serial_tx dut_tx ( .clk(clk), .rst(rst), .data_in(data_in), .tx_out(tx_out) ); uart_serial_rx dut_rx ( .clk(clk), .rst(rst), .rx_in(rx_in), .data_out(data_out), .parity_err(parity_err), .frame_err(frame_err) ); // Clock logic clk = 0; always #((1e9 / BAUD_RATE) / 2) clk = ~clk; // Reset logic rst = 0; always #((1e9 / BAUD_RATE) * 10) rst = 1'b1; // Testcase initial begin // Even parity data_in = 7'b1010101; #1000; assert (tx_out === 1'b1) else $error("tx_out should be high"); assert (data_out === 7'b1010101) else $error("data_out should be 7'b1010101"); assert (!parity_err) else $error("parity_err should be low"); assert (!frame_err) else $error("frame_err should be low"); // Odd parity data_in = 7'b1010111; #1000; assert (tx_out === 1'b1) else $error("tx_out should be high"); assert (data_out === 7'b1010111) else $error("data_out should be 7'b1010111"); assert (!parity_err) else $error("parity_err should be low"); assert (!frame_err) else $error("frame_err should be low"); // Parity error data_in = 7'b1010110; #1000; assert (tx_out === 1'b1) else $error("tx_out should be high"); assert (data_out === 7'b1010110) else $error("data_out should be 7'b1010110"); assert (parity_err) else $error("parity_err should be high"); assert (!frame_err) else $error("frame_err should be low"); // Frame error data_in = 7'b1010101; #1000; assert (tx_out === 1'b1) else $error("tx_out should be high"); assert (data_out === 7'b0) else $error("data_out should be 7'b0"); assert (!parity_err) else $error("parity_err should be low"); assert (frame_err) else $error("frame_err should be high"); end endmodule ```

相关推荐

最新推荐

recommend-type

Verilog HDL 按位逻辑运算符

下表显示对于不同按位逻辑运算符按位操作的结果: 图7 按位逻辑运算符真值表例如,假定, 2004-08-16 版权所有,侵权必究第24页,共41页 绝密Verilog HDL 入门教程请输入文档编号 A = 'b0110;B = 'b0100; 那么:A B ...
recommend-type

verilog实现的UART(带中断、奇偶校验、帧错误)

input wire clk, //50MHz input wire rst_n, input wire rx_in, //串行输入
recommend-type

verilog实现任意位二进制转换BCD

一直感觉这是个很简单的问题,直到突然自己连BCD都不太清楚的时候,才发现这没有看起来那么简单,这里介绍里任意位二进制转为BCD的verilog代码,这个转换方法也可以用在C上面,此为原创,转载请注明,谢谢。
recommend-type

华为OD机试C卷- 快速人名查找(Java & JS & Python).md-私信看全套OD代码及解析

私信博主免费看所有华为OD真题、考试报告、手撕代码、面试记录
recommend-type

Navicat的下载、安装、配置连接与使用教程.docx

Navicat的下载、安装、配置连接与使用教程.docx
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差

![MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差](https://site.cdn.mengte.online/official/2021/11/20211128213137293.png) # 1. 正态分布概述 正态分布,又称高斯分布,是统计学中最重要的连续概率分布之一。它广泛应用于自然科学、社会科学和工程领域。 正态分布的概率密度函数为: ``` f(x) = (1 / (σ√(2π))) * exp(-(x - μ)² / (2σ²)) ``` 其中: - μ:正态分布的均值 - σ:正态分布的标准差 - π:圆周率 正态分布具有以下特性: - 对称性:
recommend-type

我正在开发一款个人碳足迹计算app,如何撰写其需求分析文档,请给我一个范例

为了更全面、清晰地定义个人碳足迹计算app的需求,需求分析文档应该包含以下内容: 1.项目简介:对该app项目的概述及目标进行说明。 2.用户分析:包括目标用户群、用户需求、行为等。 3.功能需求:对app的基本功能进行定义,如用户登录、数据录入、数据统计等。 4.非功能需求:对使用app的性能和质量等进行定义,如界面设计、数据安全、可扩展性等。 5.运行环境:包括app的开发环境和使用环境。 下面是一个范例: 需求分析文档 1. 项目简介 该app项目旨在为用户提供一款方便、易用、可定制的个人碳足迹计算平台,以促进环保和可持续性发展。 2. 用户分析 目标用户群:全球关
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。