verilog写题笔记6------- #多功能数据处理器#
多功能数据处理器
https://www.nowcoder.com/practice/e009ab1a7a4c46fb9042c09c77ee27b8
五个输入:
1、时钟信号clk
2、复位信号rst_n
3、8位有符号数据信号a
4、8位有符号数据信号b
5、控制信号select
一个输出:
9位有符号数据信号c
先插一个题外话:题目的输入输出使用了关键字signed。Verilog中的wire型和reg型是不支持负数的,要想表示负数形式,必须添加关键字signed。Verilog中的负数统一使用补码来表示。同时,如果要完成有符号数的运算,必须保证参与运算的所有变量都是有符号类型。
比方说:a=-4;b=-3;c=a+b;必须保证a、b、c都是有符号数才能输出正确的结果。
题干的意思是:在每个上升沿,select若为0,则输出a;若为1,则输出b;若为2,则输出a+b;若为3,则输出a-b。
题目为时序逻辑,所以用always实现;select不同的值对应不用的输出,很容易让我们想到case函数:
`timescale 1ns/1ns module data_select( input clk, input rst_n, input signed[7:0]a, input signed[7:0]b, input [1:0]select, output reg signed [8:0]c //存在加法运算,输出位数多一位 ); always@(posedge clk or negedge rst_n) if(rst_n == 1'b0) //复位操作 c <= 9'd0; else case(select) //不同的case代表不同的操作 2'd0:begin c <= a; end 2'd1:begin c <= b; end 2'd2:begin c <= a+b; end 2'd3:begin c <= a-b; end default:begin //case最后加default是良好的习惯 c <= 9'd0; end endcase endmodule
verilog写题笔记 文章被收录于专栏
写Verilog题目的一些笔记备忘