笔试没有监控,让我误以为是测评。。。
always模块内部被赋值的信号必须是reg
generate描述的语句不可以被综合
reg型定义的信号不一定都被综合成触发器
当对不同时钟域之间设置false path,工具忽略对该时钟之间的路径进行分析
综合就是把抽象设计中的一种表示转换成另一种表示的过程
综合就是将电路的高级语言转换成低级的,可与FPGA/CPLD相映射的功能网表文件
为实现系统的速度、面积、性能的要求,需要对综合加以约束,成为综合约束
综合可以理解为一种映射过程,并且这种映射关系是唯一的, 即综合结果是唯一的。
接入滤波电容
修改逻辑设计
引入选通脉冲
使用组合逻辑
7
6
5
4
11
2'b11
64'h0000000100000001
64'h0000000000000003
A'B+AB' = (A'+B')(A+B)
AB'+BC'+B'C+A'B=AB'+BC+A'C
A'B'C'+A'BC+ABC'+ABC=A'B'C'+BC+AC+AB
((A+B')+(A'+C'))AC+BC=B'+C'
有符号数的取值范围为:-2^(n-1) ~ 2^(n-1)-1 (其中n为数据位数),当n=8时,数据取值范围:-128 ~ 127
正数的原码,反码,补码都相同,
数值原码反码补码符号位00000 00000000 00000000 0000010000 00010000 00010000 00010............01270111 11110111 11110111 11110负数的原码,反码和补码不同,转化原理为:原码-------位取反(符号位不变)------->反码-------------+1----------->补码
数值原码反码补码符号位-11000 00011111 11101111 11111-21000 00101111 11011111 11101............1-1271111 11101000 00011000 00101-1281111 11111000 00001000 000111111.0101
参考链接:https://zhuanlan.zhihu.com/p/144888852
module AsynchronousClock( clk_a, clk_b, rst, data_valid, data, data_a, data_valid_a_rise ); input clk_a; input clk_b; input rst; input data_valid; input [7:0] data; output reg [7:0] data_a; reg rst_1; reg rst_n; always @(posedge clk_a or posedge rst) begin if (rst) begin // reset rst_1 <= 0; rst_n <= 0; end else begin rst_1 <= 1; rst_n <= rst_1; end end /*************跨时钟采样边沿**************/ reg [3:0] data_valid_a; output wire data_valid_a_rise; always @(posedge clk_a or negedge rst_n) begin if (!rst_n) begin // reset data_valid_a <= 4'd0; end else begin data_valid_a <= {data_valid_a[2:0],data_valid}; end end assign data_valid_a_rise = data_valid_a[2]&(~data_valid_a[3]); always @(posedge clk_a or negedge rst_n) begin if (!rst_n) begin // reset data_a <= 8'd0; end else begin data_a <= data_valid_a_rise? data : data_a; end end endmoduleTeatbench测试代码:时间和题目对应不上,clk_a为快时钟,clk_b为慢时钟
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2020/09/08 09:06:07 // Design Name: // Module Name: AsynchronousClock_tb // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module AsynchronousClock_tb( ); reg clk_a; reg clk_b; reg rst; reg data_valid; reg [7:0] data; wire [7:0] data_a; wire data_valid_a_rise; AsynchronousClock AsynchronousClock( .clk_a(clk_a), .clk_b(clk_b), .rst(rst), .data_valid(data_valid), .data(data), .data_a(data_a), .data_valid_a_rise(data_valid_a_rise) ); always #5 clk_a = ~clk_a; always #6 clk_b = ~clk_b; initial begin clk_a = 1; clk_b = 1; rst = 0; data_valid = 0; #30 rst = 1; #30 rst = 0; data = 8'd1; #30 data_valid = 1; data = 8'd1; #30 data_valid = 0; #30 data_valid = 1; data = 8'd2; #30 data_valid = 0; #30 data_valid = 1; data = 8'd3; #30 data_valid = 0; #30 data_valid = 1; data = 8'd4; #30 data_valid = 0; end endmodule(1)
(2)
/*****9分频****/ module Div( clk, rst, div, outclk ); input clk; input rst; input [3:0] div; output outclk; /*******计数*******/ reg [3:0] count; always @(posedge clk) begin if (rst) begin // reset count <= 0; end else begin count <= (count > 7)?0:(count + 1); end end /*******分频*******/ reg clk_reg; always @(posedge clk) begin if (rst) begin // reset clk_reg <= 0; end else begin clk_reg <= ((count == 0)||(count == 4))?~clk_reg:clk_reg; endcase end end /*******下降沿采样*******/ reg clk_reg_r; always @(negedge clk) begin if (rst) begin // reset clk_reg_r <= 0; end else begin clk_reg_r <= clk_reg; end end assign outclk = (clk_reg||clk_reg_r); endmodule参考链接:https://blog.csdn.net/persistlzy/article/details/108393561
上面链接的场景9:
“背靠背”情况,此时最恶劣的情况是第一次100个写周期内后60个周期连续写入60个数据和第二次100个写周期内前60个周期连续写入60个数据,如下图所示。故上述最恶劣情况下的连续写入120个数据后FIFO内缓存数据最多。计算此时写入数据-该阶段读出数据即为FIFO的最小深度。
背靠背写入数据的时间为:t = 120T;
在此期间读取数据的个数:Nrd = 120T/4T*3 = 90;
所以用写入的数据减去读取的个数就为FIFO的深度:120 - 90 = 30