1011 a+b 和 c (15 分)
时间: 2023-04-13 15:03:49 浏览: 243
题目描述:
给定一个十进制正整数 N,写出它在 2 ~ 10 进制下的表现形式。输入格式:每个测试输入包含 1 个测试用例,即给出正整数 N 的值。输出格式:对应每个测试用例,输出 N 分别在 2 ~ 10 进制下的数,共 9 行,格式为:进制:数值,其中进制从 2 到 10。
输入样例:
十进制正整数 N 的值。
输出样例:
进制:数值。
样例:
输入样例:
23
输出样例:
2:10111
3:212
4:113
5:43
6:35
7:31
8:27
9:26
10:23
解题思路:
将十进制正整数 N 转换成 2 ~ 10 进制下的数,可以使用除基取余法,即将 N 不断除以进制数,每次将余数记录下来,最后将余数倒序排列即可得到对应进制下的数。
代码实现:
相关问题
9.用卡诺图化简法化简下列函数,写出最简与或表达: (1)F= m(2,3,6,7,8,10,12,13,14,15) (2) F=AB+A C+ABD+A BCD
<<卡诺图化简法是一种图形化的方法,用于简化布尔表达式。它通过卡诺图(Karnaugh Map)的格子布局来直观地表示逻辑变量之间的关系,并通过消除相邻方格中的1来实现化简。下面是您提供的两个函数的化简过程和结果:
1. 对于函数F=m(2,3,6,7,8,10,12,13,14,15),首先确定卡诺图的大小和变量。由于最小项中有10个,因此至少需要一个4变量的卡诺图(2^4=16),但由于没有涉及变量D,所以我们只需要一个3变量的卡诺图,即2^3=8格。变量为A、B、C。
卡诺图布局如下(其中“1”表示最小项存在的位置):
```
AB
00 01 11 10
C 0 | 1 | | 1 | 1 |
1 | | 1 | 1 | 1 |
2 | 1 | 1 | 1 | 1 |
3 | 1 | | | |
```
化简后得到最简与或表达式为:F = A + C
2. 对于函数F=AB+A C+ABD+A BCD,首先确定卡诺图的大小和变量。这个函数涉及变量A、B、C、D。
卡诺图布局如下:
```
ABCD
0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000
A 0 | | | | | | | | | | | | | | | |
1 | | | | | | | | | | | | | | | |
2 | | | | | | | | | | | | | | | |
3 | | | | | | | | | | | | | | | |
```
化简后得到最简与或表达式为:F = B + CD
讲下面代码分部分讲解//数码管显示 module seg_driver( input clk , input rst_n , input [31:0]data,//待显示的数据 output wire[7:0] sel , output wire[7:0] seg ); //wire [31:0]data; // assign dig_seg = 8'd0; // assign dig_sel = 1'b0; reg [7:0] dig_sel; reg [7:0] dig_seg; localparam NUM_0 = 8'hC0, NUM_1 = 8'hF9, NUM_2 = 8'hA4, NUM_3 = 8'hB0, NUM_4 = 8'h99, NUM_5 = 8'h92, NUM_6 = 8'h82, NUM_7 = 8'hF8, NUM_8 = 8'h80, NUM_9 = 8'h90, NUM_A = 8'h88, NUM_B = 8'h83, NUM_C = 8'hC6, NUM_D = 8'hA1, NUM_E = 8'h86, NUM_F = 8'h8E, LIT_ALL = 8'h00, BLC_ALL = 8'hFF; parameter CNT_REF = 25'd1000; reg [9:0] cnt_20us; //20us计数器 reg [3:0] data_tmp; //用于取出不同位选的显示数据 // assign data = 32'hABCD_4413; //描述位选信号切换 //描述刷新计数器 always@(posedge clk or negedge rst_n)begin if(!rst_n)begin cnt_20us <= 25'd0; end else if(cnt_20us >= CNT_REF - 25'd1)begin cnt_20us <= 25'd0; end else begin cnt_20us <= cnt_20us + 25'd1; end end always@(posedge clk or negedge rst_n)begin if(!rst_n)begin dig_sel <= 8'hfe;//8'b1111_1110 end else if(cnt_20us >= CNT_REF - 25'd1)begin dig_sel <= {dig_sel[6:0],dig_sel[7]}; end else begin dig_sel <= dig_sel; end end assign sel = dig_sel; //段选信号描述 always@(posedge clk or negedge rst_n)begin if(!rst_n)begin data_tmp <= 4'd0; end else begin case(sel) 8'b1111_1110:data_tmp <= data[ 3-:4]; 8'b1111_1101:data_tmp <= data[ 7-:4]; 8'b1111_1011:data_tmp <= data[11-:4]; 8'b1111_0111:data_tmp <= data[15-:4]; 8'b1110_1111:data_tmp <= data[19-:4]; 8'b1101_1111:data_tmp <= data[23-:4]; 8'b1011_1111:data_tmp <= data[27-:4]; 8'b0111_1111:data_tmp <= data[31-:4]; default: data_tmp <= 4'hF; endcase end end always@(posedge clk or negedge rst_n)begin if(!rst_n)begin dig_seg <= BLC_ALL; end else begin case(data_tmp) 4'h0 : dig_seg <= NUM_0; 4'h1 : dig_seg <= NUM_1; 4'h2 : dig_seg <= NUM_2; 4'h3 : dig_seg <= NUM_3; 4'h4 : dig_seg <= NUM_4; 4'h5 : dig_seg <= NUM_5; 4'h6 : dig_seg <= NUM_6; 4'h7 : dig_seg <= NUM_7; 4'h8 : dig_seg <= NUM_8; 4'h9 : dig_seg <= NUM_9; 4'hA : dig_seg <= NUM_A; 4'hB : dig_seg <= NUM_B; 4'hC : dig_seg <= NUM_C; 4'hD : dig_seg <= NUM_D; 4'hE : dig_seg <= NUM_E; 4'hF : dig_seg <= NUM_F; default: ; endcase end end assign seg = dig_seg ; endmodule
好的,下面是代码的分步讲解:
```
module seg_driver(
input clk,
input rst_n,
input [31:0] data, // 待显示的数据
output wire [7:0] sel, // 位选信号
output wire [7:0] seg // 段选信号
);
```
这是一个模块,包含输入时钟信号`clk`、复位信号`rst_n`和需要显示的32位数据`data`,以及输出8个位选信号`sel`和8个段选信号`seg`。
```
reg [7:0] dig_sel;
reg [7:0] dig_seg;
```
这两行代码定义了两个寄存器`dig_sel`和`dig_seg`,用于存储位选信号和段选信号。这两个寄存器都是8位宽的。
```
localparam NUM_0 = 8'hC0, NUM_1 = 8'hF9, NUM_2 = 8'hA4, NUM_3 = 8'hB0, NUM_4 = 8'h99, NUM_5 = 8'h92, NUM_6 = 8'h82, NUM_7 = 8'hF8, NUM_8 = 8'h80, NUM_9 = 8'h90, NUM_A = 8'h88, NUM_B = 8'h83, NUM_C = 8'hC6, NUM_D = 8'hA1, NUM_E = 8'h86, NUM_F = 8'h8E, LIT_ALL = 8'h00, BLC_ALL = 8'hFF;
```
这是一组参数定义,用于存储不同数字所对应的段选信号值。例如,`NUM_0`表示数字0对应的段选信号值为`8'hC0`,`NUM_1`表示数字1对应的段选信号值为`8'hF9`,以此类推。`LIT_ALL`表示所有数码管都亮,`BLC_ALL`表示所有数码管都灭。
```
parameter CNT_REF = 25'd1000;
reg [9:0] cnt_20us;
```
这里定义了一个参数`CNT_REF`,表示20us的计数器计数到的值。同时,定义了一个10位宽的寄存器`cnt_20us`,用于计数20us的时间。
```
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_20us <= 25'd0;
end else if(cnt_20us >= CNT_REF - 25'd1)begin
cnt_20us <= 25'd0;
end else begin
cnt_20us <= cnt_20us + 25'd1;
end
end
```
这是一个时钟触发器,用于计数20us的时间。当复位信号`rst_n`为低电平时,计数器`cnt_20us`被清零;否则,每次时钟上升沿到来时,计数器值加1。当计数器的值达到`CNT_REF-1`时,计数器被重新置零。
```
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
dig_sel <= 8'hfe;//8'b1111_1110
end else if(cnt_20us >= CNT_REF - 25'd1)begin
dig_sel <= {dig_sel[6:0],dig_sel[7]};
end else begin
dig_sel <= dig_sel;
end
end
```
这个时钟触发器用于切换位选信号,使得不同数码管上的数字可以依次显示出来。当复位信号`rst_n`为低电平时,位选信号`dig_sel`被设置为`8'hfe`;否则,当计数器的值达到`CNT_REF-1`时,位选信号在不同数码管之间依次切换,以便将需要显示的数字依次显示在不同数码管上。
```
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
data_tmp <= 4'd0;
end else begin
case(sel)
8'b1111_1110:data_tmp <= data[ 3-:4];
8'b1111_1101:data_tmp <= data[ 7-:4];
8'b1111_1011:data_tmp <= data[11-:4];
8'b1111_0111:data_tmp <= data[15-:4];
8'b1110_1111:data_tmp <= data[19-:4];
8'b1101_1111:data_tmp <= data[23-:4];
8'b1011_1111:data_tmp <= data[27-:4];
8'b0111_1111:data_tmp <= data[31-:4];
default: data_tmp <= 4'hF;
endcase
end
end
```
这个时钟触发器用于根据位选信号`sel`从待显示的数据`data`中取出需要显示的数字`data_tmp`。当复位信号`rst_n`为低电平时,数字`data_tmp`被设置为0;否则,根据位选信号`sel`从`data`变量中取出需要显示的数字,并存储到`data_tmp`变量中。如果位选信号不存在于给定的8个数位中,则`data_tmp`被设置为`4'hF`,表示不显示任何数字。
```
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
dig_seg <= BLC_ALL;
end else begin
case(data_tmp)
4'h0 : dig_seg <= NUM_0;
4'h1 : dig_seg <= NUM_1;
4'h2 : dig_seg <= NUM_2;
4'h3 : dig_seg <= NUM_3;
4'h4 : dig_seg <= NUM_4;
4'h5 : dig_seg <= NUM_5;
4'h6 : dig_seg <= NUM_6;
4'h7 : dig_seg <= NUM_7;
4'h8 : dig_seg <= NUM_8;
4'h9 : dig_seg <= NUM_9;
4'hA : dig_seg <= NUM_A;
4'hB : dig_seg <= NUM_B;
4'hC : dig_seg <= NUM_C;
4'hD : dig_seg <= NUM_D;
4'hE : dig_seg <= NUM_E;
4'hF : dig_seg <= NUM_F;
default: ;
endcase
end
end
```
这个时钟触发器用于根据数字`data_tmp`选择对应的段选信号`dig_seg`,以便在数码管上显示出对应的数字。当复位信号`rst_n`为低电平时,段选信号`dig_seg`被设置为`BLC_ALL`,即所有数码管都灭;否则,根据数字`data_tmp`选择对应的段选信号,并将其存储到`dig_seg`变量中。如果`data_tmp`不存在于0~F之间,则不显示任何数字。
```
assign sel = dig_sel;
assign seg = dig_seg;
```
这两行代码用于将位选信号`dig_sel`和段选信号`dig_seg`分别赋值给模块的输出端口`sel`和`seg`,以便在数码管上显示出对应的数字。
阅读全文